+++ /dev/null
-Dependency:
-================
-python2.7, python-pip, requests
- sudo apt-get install python-pip
- sudo pip install requests
- sudo apt-get install python-dbus
-
-Change the owner and group of /opt
- sudo chown [user]:[user] /opt
-
-How to install :
-================
- - Install TCT from source code:
- sudo python tct-setup.py
-
- - Remove tct related folders in /opt
- (** caution : all files in /opt/tct, /opt/testkit, /opt/tools will be removed)
- sudo python tct-setup.py clean
-
- - Upgrade the tct related folders in /opt
- sudo python tct-setup.py upgrade
-
-How to use :
-================
- - Set environment on your target device
- sudo python /opt/tct/{TCTProject}/scripts/tct-config-device.py
-
- - Execute the following command to launch TCT-Manager
- sudo tct-mgr
-
- - Execute the following command in order to use TCT-Shell
- tct-shell
-
-For Windows :
-================
- - Prerequisites
- 1. Windows 7 - 32/64 bit
- 2. JDK 1.7 - 32bit ( You should install 32bit version.
- 3. python 2.7 - 32bit, should be set as environment path
- - Please use python 2.7 version, not 3.0 - https://www.python.org/downloads/windows/
- - python lib which should be installed
- : install pip
- 1. Navigate to C:\Python27\Scripts
- 2. open command window on C:\Python27\Scripts
- 3. $ easy_install-2.7 pip
- : install requests
- 1. downlaod requests source code : https://github.com/kennethreitz/requests/
- 2. unzip source code and open command window on unziped folder
- 3. $ python setup.py install
-
- - Install / run in command prompt
- (Run below scripts at the file location. You can launch the command prompt by [shift]+[mouse right click] on windows explorer)
- 1. Install : python tct-setup.py
- 2. Run : tct-mgr.bat
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<buildinfos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-xsi:noNamespaceSchemaLocation="buildinfo.xsd">\r
- <buildinfo name="model" support="true" type="String">\r
- <value>SM-Z130H</value>\r
- </buildinfo>\r
- <buildinfo name="manufacturer" support="true" type="String">\r
- <value>samsung</value>\r
- </buildinfo>\r
- <buildinfo name="buildVersion" support="true" type="String">\r
- <value>Z130HDDE0ANL7</value>\r
- </buildinfo>\r
-</buildinfos>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<capabilities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-xsi:noNamespaceSchemaLocation="capability.xsd">\r
- <capability name="http://tizen.org/feature/account" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/battery" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/bookmark" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/calendar" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/camera" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/camera.back" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/camera.back.flash" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/camera.front" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/camera.front.flash" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/contact" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/database.encryption" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/datasync" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/datacontrol" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/download" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/fmradio" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/graphics.acceleration" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/input.keyboard" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/input.keyboard.layout" support="qwerty" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/location" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/location.gps" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/location.wps" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/email" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/microphone" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/multi_point_touch.pinch_zoom" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/multi_point_touch.point_count" support="10" type="Integer">\r
- </capability>\r
- <capability name="http://tizen.org/feature/network.bluetooth" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.bluetooth.health" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.nfc" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.nfc.card_emulation" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.nfc.reserved_push" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.push" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.secure_element" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.telephony" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.telephony.mms" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.wifi" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.wifi.direct" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/notification" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/opengles" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/opengles.texture_format" support="etc" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/opengles.texture_format.3dc" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/opengles.texture_format.atc" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/opengles.texture_format.etc" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/opengles.texture_format.ptc" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/opengles.texture_format.pvrtc" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/opengles.texture_format.utc" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/opengles.version.1_1" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/opengles.version.2_0" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.core.api.version" support="2.3" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/platform.core.cpu.arch" support="x86" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/platform.core.cpu.arch.armv6" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.core.cpu.arch.armv7" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.core.cpu.arch.x86" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.core.fpu.arch" support="sse3" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/platform.core.fpu.arch.sse2" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.core.fpu.arch.sse3" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.core.fpu.arch.ssse3" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.core.fpu.arch.vfpv2" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.core.fpu.arch.vfpv3" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.native.api.version" support="2.3" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/platform.native.osp_compatible" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.version" support="2.3.0" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/platform.web.api.version" support="2.3" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/profile" support="MOBILE" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/screen" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.auto_rotation" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.bpp" support="32" type="Integer">\r
- </capability>\r
- <capability name="http://tizen.org/feature/screen.coordinate_system.size.large" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.coordinate_system.size.normal" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.dpi" support="207" type="Integer">\r
- </capability>\r
- <capability name="http://tizen.org/feature/screen.height" support="800" type="Integer">\r
- </capability>\r
- <capability name="http://tizen.org/feature/screen.output.hdmi" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.output.rca" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal.1080.1920" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal.240.400" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal.320.320" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal.320.480" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal.480.800" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal.540.960" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal.600.1024" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal.720.1280" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.width" support="480" type="Integer">\r
- </capability>\r
- <capability name="http://tizen.org/feature/sensor.accelerometer" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.accelerometer.wakeup" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.barometer" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.barometer.wakeup" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.gyroscope" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.gyroscope.wakeup" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.heart_rate_monitor" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.magnetometer" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.magnetometer.wakeup" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.pedometer" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.photometer" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.photometer.wakeup" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.proximity" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.proximity.wakeup" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.tiltmeter" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.tiltmeter.wakeup" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.ultraviolet" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.wrist_up" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/shell.appwidget" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sip.voip" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/speech.recognition" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/speech.synthesis" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/systemsetting" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/systemsetting.home_screen" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/systemsetting.incoming_call" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/systemsetting.lock_screen" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/systemsetting.notification_email" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/usb.accessory" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/usb.host" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/vision.face_recognition" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/vision.image_recognition" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/vision.qrcode_generation" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/vision.qrcode_recognition" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/websetting" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/system/platform.name" support="Tizen" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/archive" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/badge" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/exif" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/led" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/multimedia.transcoder" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/capability/network.bluetooth.always_on" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.bluetooth.audio.call" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.bluetooth.audio.media" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.bluetooth.hid" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.bluetooth.le" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/network.bluetooth.opp" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/platform.core.cpu.frequency" support="0" type="Integer">\r
- </capability>\r
- <capability name="http://tizen.org/feature/platform.version.name" support="" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/screen.size.all" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.large" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/screen.size.normal.360.480" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.activity_recognition" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.gesture_recognition" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.gravity" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.humidity" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.linear_acceleration" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.rotation_vector" support="true" type="boolean"/>\r
- <capability name="http://tizen.org/feature/sensor.temperature" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/system/build.date" support="2015.02.23" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/system/build.string" support="Tizen-2.3.0_Mobile-Emulator_20150223.1659" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/system/build.time" support="16:59:07" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/system/manufacturer" support="Tizen" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/system/tizenid" support="3PXV0WmJ+1caWiHvW7/s1APzFAA=" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/system/model_name" support="Emulator" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/system/platform.communication_processor" support="none" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/system/platform.processor" support="Emulator" type="String">\r
- </capability>\r
- <capability name="http://tizen.org/feature/web.service" support="false" type="boolean"/>\r
- <capability name="http://tizen.org/feature/humanactivitymonitor" support="true" type="boolean"/>\r
-</capabilities>
\ No newline at end of file
+++ /dev/null
-Reference : http://168.219.209.56/confluence/display/Tizen3/Running+Web+TCT+for+Tizen+3.0\r
-\r
----------------------------------------------------------------------------------------\r
-\r
-1. Please push the below attached 2 files in the below location(target) before the test start.\r
-\r
-file name : \r
-\r
-capability.xml\r
-buildinfo.xml\r
-\r
-\r
-location :\r
-\r
-/home/owner/content/Documents/tct/\r
-\r
-\r
-ex) sdb push capability.xml /home/owner/content/Documents/tct/\r
-ex) sdb push buildinfo.xml /home/owner/content/Documents/tct/\r
-\r
-\r
----------------------------------------------------------------------------------------\r
+++ /dev/null
-URLDOWNLOAD_URL=\r
-URLDOWNLOAD_DOWNLOADURL=\r
-URLDOWNLOAD_URLWITHETAG=\r
-WIFI_WPSACCESSPOINTNAME=\r
-WIFI_EAPACCESSPOINTNAME=\r
-WIFI_ACCESSPOINTPIN=\r
-MESSAGES_MOBILE_NUMBER=\r
-EMAIL_RECIPIENT=\r
-PLAYER_DOWNLOAD_URL=\r
-PLAYER_DOWNLOAD_PROGRESS_URL=\r
-PUSH_APPID=\r
-PUSH_APPSECRET=\r
-HERE_MAPS_PROVIDER_KEY=\r
-MAPZEN_MAPS_PROVIDER_KEY=\r
+++ /dev/null
-#!/usr/bin/env python
-
-import os
-import shutil
-import glob
-import time
-import sys
-import subprocess
-import string
-import ConfigParser
-from optparse import OptionParser, make_option
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = ConfigParser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-
-
-SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
-PKG_NAME = os.path.basename(SCRIPT_DIR)
-PARAMETERS = None
-#XW_ENV = "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket"
-SRC_DIR = DEVICE_SUITE_TARGET_30
-PKG_SRC_DIR = SRC_DIR + "/tct/opt/%s" % PKG_NAME
-
-
-def doCMD(cmd):
- # Do not need handle timeout in this short script, let tool do it
- print "-->> \"%s\"" % cmd
- output = []
- cmd_return_code = 1
- cmd_proc = subprocess.Popen(
- cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
-
- while True:
- output_line = cmd_proc.stdout.readline().strip("\r\n")
- cmd_return_code = cmd_proc.poll()
- if output_line == '' and cmd_return_code != None:
- break
- sys.stdout.write("%s\n" % output_line)
- sys.stdout.flush()
- output.append(output_line)
-
- return (cmd_return_code, output)
-
-
-def updateCMD(cmd=None):
- if "pkgcmd" in cmd:
- cmd = "su - %s -c '%s;%s'" % (PARAMETERS.user, XW_ENV, cmd)
- return cmd
-def getUSERID():
- if PARAMETERS.mode == "SDB":
- cmd = "sdb -s %s shell id -u %s" % (
- PARAMETERS.device, PARAMETERS.user)
- else:
- cmd = "ssh %s \"id -u %s\"" % (
- PARAMETERS.device, PARAMETERS.user )
- return doCMD(cmd)
-
-
-
-
-def getPKGID(pkg_name=None):
- if PARAMETERS.mode == "SDB":
- cmd = "sdb -s %s shell %s" % (
- PARAMETERS.device, updateCMD('pkgcmd -l'))
- else:
- cmd = "ssh %s \"%s\"" % (
- PARAMETERS.device, updateCMD('pkgcmd -l'))
-
- (return_code, output) = doCMD(cmd)
- if return_code != 0:
- return None
-
- test_pkg_id = None
- for line in output:
- if line.find("[" + pkg_name + "]") != -1:
- pkgidIndex = line.split().index("pkgid")
- test_pkg_id = line.split()[pkgidIndex+1].strip("[]")
- break
- return test_pkg_id
-
-
-def doRemoteCMD(cmd=None):
- if PARAMETERS.mode == "SDB":
- cmd = "sdb -s %s shell %s" % (PARAMETERS.device, updateCMD(cmd))
- else:
- cmd = "ssh %s \"%s\"" % (PARAMETERS.device, updateCMD(cmd))
-
- return doCMD(cmd)
-
-
-def doRemoteCopy(src=None, dest=None):
- if PARAMETERS.mode == "SDB":
- cmd_prefix = "sdb -s %s push" % PARAMETERS.device
- cmd = "%s %s %s" % (cmd_prefix, src, dest)
- else:
- cmd = "scp -r %s %s:/%s" % (src, PARAMETERS.device, dest)
-
- (return_code, output) = doCMD(cmd)
- doRemoteCMD("sync")
-
- if return_code != 0:
- return True
- else:
- return False
-
-
-def uninstPKGs():
- action_status = True
- (return_code, output) = doRemoteCMD("rm " + \
- SRC_DIR + "/tct/preconfigure.json")
- (return_code, output) = doRemoteCMD("rm " + \
- SRC_DIR + "/tct/portconfigure.json")
-
- for file in ['preconfigure.json', 'tests.xml', 'tct-testconfig.ini', 'portconfigure.json', 'TC_Config.txt']:
- (return_code, output) = doRemoteCMD("rm %s/%s" % (PKG_SRC_DIR, file))
- if return_code != 0:
- action_status = False
- break
-
- return action_status
-
-def instPKGs():
- action_status = True
- (return_code, output) = doRemoteCMD("mkdir -p %s" % PKG_SRC_DIR)
-
- for file in ['preconfigure.json', 'tests.xml', 'tct-testconfig.ini', 'portconfigure.json', 'TC_Config.txt']:
- if not doRemoteCopy(SCRIPT_DIR + '/' + file, "%s/%s" % (PKG_SRC_DIR, file)):
- action_status = False
-
- return action_status
-
-def main():
- try:
- usage = "usage: inst.py -i"
- opts_parser = OptionParser(usage=usage)
- opts_parser.add_option(
- "-m", dest="mode", action="store", help="Specify mode")
- opts_parser.add_option(
- "-s", dest="device", action="store", help="Specify device")
- opts_parser.add_option(
- "-i", dest="binstpkg", action="store_true", help="Install package")
- opts_parser.add_option(
- "-u", dest="buninstpkg", action="store_true", help="Uninstall package")
- opts_parser.add_option(
- "-a", dest="user", action="store", help="User name")
- global PARAMETERS
- (PARAMETERS, args) = opts_parser.parse_args()
- except Exception, e:
- print "Got wrong option: %s, exit ..." % e
- sys.exit(1)
-
- if not PARAMETERS.user:
- PARAMETERS.user = "owner"
- if not PARAMETERS.mode:
- PARAMETERS.mode = "SDB"
-
- if PARAMETERS.mode == "SDB":
- if not PARAMETERS.device:
- (return_code, output) = doCMD("sdb devices")
- for line in output:
- if str.find(line, "\tdevice") != -1:
- PARAMETERS.device = line.split("\t")[0]
- break
- else:
- PARAMETERS.mode = "SSH"
-
- if not PARAMETERS.device:
- print "No device provided"
- sys.exit(1)
-
- user_info = getUSERID()
- re_code = user_info[0]
- if re_code == 0 :
- global XW_ENV
- userid = user_info[1][0]
- XW_ENV = "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket"%str(userid)
- else:
- print "[Error] cmd commands error : %s"%str(user_info[1])
- sys.exit(1)
- if PARAMETERS.binstpkg and PARAMETERS.buninstpkg:
- print "-i and -u are conflict"
- sys.exit(1)
-
- if PARAMETERS.buninstpkg:
- if not uninstPKGs():
- sys.exit(1)
- else:
- if not instPKGs():
- sys.exit(1)
-
-if __name__ == "__main__":
- main()
- sys.exit(0)
-
+++ /dev/null
-[{"STUB_PORT":"8000"}]
+++ /dev/null
-[{
- "MESSAGES_MOBILE_NUMBER":"01012345678",
- "BT_REMOTE_DEVICE_ADDRESS":"127.0.0.1",
- "BT_REMOTE_DEVICE_NAME":"localhost",
- "BT_REMOTE_HEALTH_DEVICE_ADDRESS":"127.0.0.1",
- "BT_REMOTE_HEALTH_DEVICE_NAME":"localhost",
- "BT_REMOTE_BLE_DEVICE_ADDRESS":"AA:AA:AA:AA:AA:AA",
- "BT_REMOTE_HID_DEVICE_ADDRESS":"AA:AA:AA:AA:AA:AA",
- "BT_REMOTE_OPP_DEVICE_ADDRESS":"AA:AA:AA:AA:AA:AA",
- "BT_REMOTE_DEVICE_ADDRESS":"AA:AA:AA:AA:AA:AA",
- "EMAIL_RECIPIENT_1":"123@intel.com",
- "EMAIL_RECIPIENT_2":"456@intel.com",
- "MMS_RECIPIENT_1":"123456789",
- "MMS_RECIPIENT_2":"987654321",
- "SMS_RECIPIENT_1":"123456789",
- "SMS_RECIPIENT_2":"987654321",
- "CHANNEL_MAJOR":11,
- "CHANNEL_MINOR":1,
- "CHANNEL_MAJOR_2":7,
- "CHANNEL_MINOR_2":1,
- "DATE_FORMAT":"D, d M y",
- "TIME_FORMAT":"h:m:s ap",
- "PUBLIC_AP":"Set available public AP name",
- "PRIVATE_AP_1_2":"Set available private AP name 1",
- "PRIVATE_AP_2_2":"Set available private AP name 2",
- "HIDDEN_AP":"Set available hidden AP name",
- "PASSWORD_FOR_ALL_PRIVATE_AP":"Set common password of all private APs",
- "PUBLIC_AP":"Set available public AP name",
- "PRIVATE_AP":"Set available private AP name",
- "PRIVATE_AP_1_2":"Set available private AP name 1",
- "PRIVATE_AP_2_2":"Set available private AP name 2",
- "HIDDEN_AP":"Set available hidden AP name",
- "PASSWORD_FOR_ALL_PRIVATE_AP":"Set common password of all private APs",
- "WPS_PBC_AP":"Set name of available AP with WPS PBC function",
- "WPS_PIN_AP":"Set name of available AP with WPS PIN function",
- "PIN_NUMBER_OF_WPS_PIN_AP":"Set pin number of WPS_PIN_AP. The pin number should be generated with the checksum defined in WSC spec (Wi-Fi Simple Configuration Technical Specification). If you are not familiar with it, please use an example number, 47363533.",
- "STREAMING_URI":"Set the streaming uri such as http://www.samsung.com/xx/xx/aa.mp4",
- "ADAPTIVE_STREAMING_URL":"Set the adaptive streaming url"
-}]
+++ /dev/null
-# Bluetooth test settings
-#[tct-bluetooth-tizen-tests]
-# The address of the device on which tct-bt-helper will be run
-#BT_REMOTE_DEVICE_ADDRESS=your BT remote device address
-# The name of the device on which tct-bt-helper will be run
-#BT_REMOTE_DEVICE_NAME=your BT remote device name
-#BT_REMOTE_HEALTH_DEVICE_ADDRESS=your BT remote health device address
-# The name of the device on which tct-bt-helper will be run
-#BT_REMOTE_HEALTH_DEVICE_NAME=your BT remote health device name
-# The name of the device on which tct-bt-helper will be run
-#BT_REMOTE_BLE_DEVICE_ADDRESS=your BT remote BLE device address
-
-# Bluetooth precondition settings
-[Tizen.Bluetooth.Tests]
-BT_REMOTE_DEVICE_ADDRESS=Set remote BT device address. (AA:AA:AA:AA:AA:AA)
-
-[Tizen.Bluetooth.Manual.Tests]
-BT_REMOTE_BLE_DEVICE_ADDRESS=Set remote BLE device address. (AA:AA:AA:AA:AA:AA)
-BT_REMOTE_HID_DEVICE_ADDRESS=Set remote HID device address. (AA:AA:AA:AA:AA:AA)
-BT_REMOTE_OPP_DEVICE_ADDRESS=Set remote OPP device address. (AA:AA:AA:AA:AA:AA)
-BT_REMOTE_DEVICE_ADDRESS=Set remote device address. (AA:AA:AA:AA:AA:AA)
-
-# WiFi test settings
-[Tizen.WiFi.Tests]
-PRIVATE_AP_1_2=Set available private AP name 1
-PRIVATE_AP_2_2=Set available private AP name 2
-HIDDEN_AP=Set available hidden AP
-PASSWORD_FOR_ALL_PRIVATE_AP=Set common password of all private APs
-
-# WiFi manual settings
-[Tizen.WiFi.Manual.Tests]
-WPS_PBC_AP=Set name of available AP with WPS PBC function
-WPS_PIN_AP=Set name of available AP with WPS PIN function
-PIN_NUMBER_OF_WPS_PIN_AP=Set pin number of WPS_PIN_AP
-
-# Connection test settings
-[Tizen.Connection.Tests]
-PUBLIC_AP=Set available public AP name
-PRIVATE_AP=Set available private AP name
-PASSWORD_FOR_ALL_PRIVATE_AP=Set common password of all private APs
-
-# Map test key settings
-[Tizen.Maps.Tests]
-HERE_MAPS_PROVIDER_KEY=Set the HERE_MAPS_PROVIDER_KEY
-
-# Map.Manual test key settings
-[Tizen.Maps.Manual.Tests]
-HERE_MAPS_PROVIDER_KEY=Set the HERE_MAPS_PROVIDER_KEY
-
-[Tizen.Messages.Tests]
-MESSAGES_MOBILE_NUMBER=You should write only number. Do NOT write - or ()
-
-# MediaPlayer test key settings
-[Tizen.MediaPlayer.Tests]
-STREAMING_URI = set the uri in here. ex>http://www.samsung.com/xx/xx/aa.mp4
-ADAPTIVE_STREAMING_URL = set the url in here
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
-<test_definition>
- <suite name="tct-testconfig">
- <set name="tct-bluetooth-tizen-tests">
- <testcase execution_type="manual" id="BluetoothConfiguration" purpose="tct-bluetooth-tizen-tests configuration" status="approved" type="compliance">
- <description>
- <steps>
- <step order="1">
- <step_desc>The 'tct-bt-helper' web application MUST be installed on the remote device whose address is REMOTE_DEVICE_ADDRESS.
-The tct-bt-helper is included in the tct-bluetooth-tizen-tests package. Install the tct-bluetooth-tizen-tests package on both your test device and the remote Bluetooth device.</step_desc>
- </step>
- <step order="2">
- <step_desc>Turn on the Bluetooth of your test device and the remote device. Make the two devices discoverable to each other.</step_desc>
- </step>
- <step order="3">
- <step_desc>Before manual testing, launch the 'tct-bt-helper' web application installed on the remote device, click 'Register service' on the 'tct-bt-helper', and then execute the TCs tests manually.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="tct-callhistory-tizen-tests">
- <testcase purpose="tct-callhistory-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="CallHistoryConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Make sure the telephony works well.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="2">
- <step_desc>Insert a SIM card and enable the cellular device service on your test device. During manual testing, you can see the preconditions for each test.</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-datacontrol-tizen-tests">
- <testcase purpose="tct-datacontrol-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="DataControlConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc> Create the sample native application using Tizen SDK. You can find this native application in the installation directory.
- In Tizen SDK, select 'File' -> 'Import' -> 'Tizen' -> 'Tizen Native Project' -> 'Select archive file' -> 'select datacontrolprovider.zip in the /opt/tct/tizen_web_2.4/resource/'.
- </step_desc>
- <expected>TBD</expected>
- </step>
- <step order="2">
- <step_desc> Build and sign this native application with the same certification which you sign the 'tct-datacontrol-tizen-tests' package with.
- </step_desc>
- <expected>TBD</expected>
- </step>
- <step order="3">
- <step_desc> Launch this native application(No UI).</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-download-tizen-tests">
- <testcase purpose="tct-download-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="DownloadConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established. If your device supports Wi-Fi, turn on Wi-Fi. If your device supports telephony, insert a SIM card and enable the cellular data service on your test device. During manual testing, you can see the preconditions for each test.</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-camera-nonw3c-tests">
- <testcase purpose="tct-camera-nonw3c-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="CameraConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Make sure device camera is working well.</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-fmradio-tizen-tests">
- <testcase purpose="tct-fmradio-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="FMRadioConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>The antenna(earphones) is nessasary to test this module. please put antenna(earphones) jack into device.</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-messaging-email-tizen-tests">
- <testcase purpose="tct-messaging-email-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="MessagingConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>There MUST be established Network connection for sending and receiving email tests (preferably through WiFi as it has smaller delays on connection)</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="2">
- <step_desc>Add an account through Settings application.
- (Settings -> Personal / Accounts)
- 2.1 Click "Add"
- 2.1 Select type of account: Email
- 2.2 Enter e-mail address and password (preferably Gmail account)
- 2.3 Click "Next" - configuration will be verified and stored</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="3">
- <step_desc>There MUST be several email messages in your mailbox to be used for searching and removing messages tests</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="4">
- <step_desc>There MUST be exactly one email service configured on the device.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="5">
- <step_desc>EMAIL_RECIPIENT_1 is the e-mail address of the account You have set up on the device</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="6">
- <step_desc>EMAIL_RECIPIENT_2 is any valid e-mail address different from EMAIL_RECIPIENT_1</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-messaging-mms-tizen-tests">
- <testcase purpose="tct-messaging-mms-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="MessagingConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>A SIM card MUST be inserted for sending MMS messages.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="2">
- <step_desc>MMS_RECIPIENT_1 is any valid phone number (without country code prefix). You should not use a number of the SIM card inserted into test device.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="3">
- <step_desc>MMS_RECIPIENT_2 is any valid phone number, different from MMS_RECIPIENT_1 (without country code prefix)</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-messaging-sms-tizen-tests">
- <testcase purpose="tct-messaging-sms-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="MessagingConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>A SIM card MUST be inserted for sending SMS messages.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="2">
- <step_desc>SMS_RECIPIENT_1 is any valid phone number (without country code prefix). You should not use a number of the SIM card you in test device.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="3">
- <step_desc>SMS_RECIPIENT_2 is any valid phone number, different from SMS_RECIPIENT_1 (without country code prefix)</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-nfc-tizen-tests">
- <testcase purpose="tct-nfc-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="NFCConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Manual tests requires a NFC tag (which supports NDEF) and a NFC enabled device to connect your test device with.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="2">
- <step_desc>Enable NFC on your test device and the NFC device you will connect to.</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-time-tizen-tests">
- <testcase purpose="tct-time-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="TimeConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Before executing manual and auto time test, must set current time, language, region, and time must be as follows:</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="2">
- <step_desc>'Time zone' MUST be set as Seoul.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="3">
- <step_desc>Set the current time correctly.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="4">
- <step_desc>'Display language' MUST be set as English.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="5">
- <step_desc>'Region' MUST be set as English(following time format D, M d y ).</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="6">
- <step_desc>Time format MUST be set as AM/PM format,</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-power-tizen-tests">
- <testcase purpose="tct-power-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="PowerConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Turn off Automatic screen brightness (pull down the notification panel and ensure that Auto is disabled)</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <steps>
- <step order="2">
- <step_desc>Set Backlight time to 15 seconds (Settings -> Display -> Backlight time -> 15 seconds)</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-push-tizen-tests">
- <testcase purpose="tct-push-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="PushConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-networkbearerselection-tizen-tests">
- <testcase purpose="tct-networkbearerselection-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="NetworkbearerselectionConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Make sure the telephony works well.</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="2">
- <step_desc>Insert a SIM card and enable cellular data service on your test device.</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-geoallow-w3c-tests">
- <testcase purpose="tct-geoallow-w3c-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="GeoallowConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Enable GPS or connect to an available network</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- <set name="tct-tv-channel-tizen-tests">
- <testcase purpose="tct-tv-channel-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="TVChannelConfiguration">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Set Major and Minor channel number</step_desc>
- <expected>TBD</expected>
- </step>
- <step order="2">
- <step_desc>Set Major_2 and Minor_2 channel number</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry timeout="90" test_script_expected_result="0"/>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
- <spec_url>TBD</spec_url>
- <spec_statement>TBD</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- </suite>
-</test_definition>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
-<test_definition>
- <suite name="tct-testconfig">
-<!-- <set name="tct-bluetooth-tizen-tests">
- <testcase execution_type="manual" id="Bluetoothconfiguration" purpose="tct-bluetooth-tizen-tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>The 'tct-bt-helper' web application MUST be installed on the remote device whose address is REMOTE_DEVICE_ADDRESS.
-The tct-bt-helper is included in the tct-bluetooth-tizen-tests package. Install the tct-bluetooth-tizen-tests package on both your test device and the remote Bluetooth device.</step_desc>
- </step>
- <step order="2">
- <step_desc>Turn on the Bluetooth of your test device and the remote device. Make the two devices discoverable to each other.</step_desc>
- </step>
- <step order="3">
- <step_desc>Before manual testing, launch the 'tct-bt-helper' web application installed on the remote device, click 'Register service' on the 'tct-bt-helper', and then execute the TCs tests manually.</step_desc>
- </step>
- <step order="4">
- <step_desc>BLE test device should have at least one characteristic and descriptor information which is writable in its bluetooth low energy service.</step_desc>
- <expected>TBD</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>-->
-
-
-<!--Add -->
- <set name="Tizen.Bluetooth.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Bluetoothconfiguration" purpose="Tizen.Bluetooth.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>Set the remote address of the Bluetooth device which you are going to use for testing.</step_desc>
- </step>
- <step order="2">
- <step_desc>Recommends to use Tizen mobile phone for testing.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="Tizen.Bluetooth.Manual.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="BluetoothManualconfiguration" purpose="Tizen.Bluetooth.Manual.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>Set the remote address of the BLE(Bluetooth Low Energy) device which you are going to use for testing.</step_desc>
- </step>
- <step order="2">
- <step_desc>Set the remote address of the HID(Human Interface Device) device which you are going to use for testing.</step_desc>
- </step>
- <step order="3">
- <step_desc>Set the remote address of the OPP(Object Push Profile) device which you are going to use for testing.</step_desc>
- </step>
- <step order="4">
- <step_desc>Set the remote address of the device which you are going to use for testing.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="Tizen.System.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Systemconfiguration" purpose="Tizen.System.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>SDCard/USB(External storage) should be inserted on target</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="Tizen.Packagemanager.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Packagemanagerconfiguration" purpose="Tizen.Packagemanager.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>SdCard should be inserted on target.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="Tizen.Download.Manual.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Downloadmanualconfiguration" purpose="Tizen.Download.Manual.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="Tizen.Download.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Downloadconfiguration" purpose="Tizen.Download.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="Tizen.Maps.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Mapsconfiguration" purpose="Tizen.Maps.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- <step order="2">
- <step_desc>Set the HERE_MAPS_PROVIDER_KEY configure (appid/app_code).</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.Maps.Manual.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Mapsconfiguration" purpose="Tizen.Maps.Manual.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- <step order="2">
- <step_desc>Set the HERE_MAPS_PROVIDER_KEY configure (appid/app_code).</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.PrivacyPrivilegeManager.Manual.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Mapsconfiguration" purpose="Tizen.PrivacyPrivilegeManager.Manual.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>There should be no '/opt/share/askuser_disable' file on the target</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
-<!--
- <set name="tct-iotconnectivity-client-tizen-tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="IoTClientconfiguration" purpose="tct-iotconnectivity-client-tizen-tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="tct-iotconnectivity-server-tizen-tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="IoTServerconfiguration" purpose="tct-iotconnectivity-server-tizen-tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
--->
-<!--End -->
-
- <set name="Tizen.Stt.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Sttconfiguration" purpose="Tizen.Stt.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>In case of TV profile, connect a bluetooth remote controller which has mic.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="Tizen.VoiceControl.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="VoiceControlconfiguration" purpose="Tizen.VoiceControl.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>In case of TV profile, connect a bluetooth remote controller which has mic.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="Tizen.Push.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Pushconfiguration" purpose="Tizen.Push.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- <set name="Tizen.WiFi.Manual.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="WiFiconfiguration" purpose="Tizen.WiFi.Manual.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>Set name of available AP with WPS PBC function.</step_desc>
- </step>
- <step order="2">
- <step_desc>Set name of available AP with WPS PIN function.</step_desc>
- </step>
- <step order="3">
- <step_desc>Set pin number of WPS_PIN_AP to PIN_NUMBER_WPS_PIN_AP. The pin number should be generated with the checksum defined in WSC spec (Wi-Fi Simple Configuration Technical Specification). The length of WPS PIN number should be 4 or 8. If you are not familiar with it, please use an example number, 47363533.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.Messages.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Messagesconfiguration" purpose="Tizen.Messages.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>Insert the available SIM Card into SIM slot 1.</step_desc>
- </step>
- <step order="2">
- <step_desc>Set the MESSAGES_MOBILE_NUMBER configure.(example>01012345678)</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.Device.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Deviceconfiguration" purpose="Tizen.Device.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>Charger should be connected to test target.(In case of Emulator, you have to set with control panel.) </step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.Email.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Emailconfiguration" purpose="Tizen.Email.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- <step order="2">
- <step_desc>Set the email account on your device. Settings > Accounts > Email > Set created accounts.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.SyncManager.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="SyncManagerconfiguration" purpose="Tizen.SyncManager.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.SyncManager.Manual.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="SyncManagerManualconfiguration" purpose="Tizen.SyncManager.Manual.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.Wifidirect.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Wifidirectconfiguration" purpose="Tizen.Wifidirect.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>You should have two additional devices which are connected to each other via wifi-direct. (Used to get the status of connected devices.) </step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.WiFi.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="WiFiconfiguration" purpose="Tizen.WiFi.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>Set available private AP name 1.</step_desc>
- </step>
- <step order="2">
- <step_desc>Set available private AP name 2.</step_desc>
- </step>
- <step order="3">
- <step_desc>Set available hidden AP name.</step_desc>
- </step>
- <step order="4">
- <step_desc>Set common password of all private APs.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.Connection.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Connectionconfiguration" purpose="Tizen.Connection.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc>Set available public AP name.</step_desc>
- </step>
- <step order="2">
- <step_desc>Set available private AP name.</step_desc>
- </step>
- <step order="3">
- <step_desc>Set common password of all private APs.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.MediaPlayer.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="MediaPlayerconfiguration" purpose="Tizen.MediaPlayer.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc> Set the streaming uri such as http://www.samsung.com/xx/xx/aa.mp4.</step_desc>
- </step>
- <step order="2">
- <step_desc> Set the adaptive streaming url.</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.WebView.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="WebViewconfiguration" purpose="Tizen.WebView.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc> Target has to connect to internet</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
-
- <set name="Tizen.Usb.Tests">
- <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="WebViewconfiguration" purpose="Tizen.Usb.Tests configuration">
- <description>
- <steps>
- <step order="1">
- <step_desc> The usb-host emulation driver MUST be loaded before testing.</step_desc>
- </step>
- <step order="2">
- <step_desc> $ devicectl usb-host-test start</step_desc>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0" timeout="90"/>
- </description>
- </testcase>
- </set>
- </suite>
-</test_definition>
-
+++ /dev/null
-#!/usr/bin/python
-
-from sdbmanager import SdbManager
-
-class DeviceManager(object):
- INSTANCE = None
- devices = []
-
- def __init__(self):
- if DeviceManager.INSTANCE is not None:
- raise Exception('DeviceManager instance already exists')
-
- @classmethod
- def getInstance(cls):
- if cls.INSTANCE is None:
- cls.INSTANCE = DeviceManager()
- if len(cls.INSTANCE.devices) < 1:
- cls.INSTANCE.loadDeviceList()
- return cls.INSTANCE
-
- def _updateConnDevice(self, connDevices):
- self._resetDevices()
-
- for dev in connDevices:
- self.devices.append(dev)
-
- def _resetDevices(self):
- listSize = len(self.devices)
- del self.devices[0:listSize]
-
- def isDeviceAvailable(self, deviceId):
- if len(self.devices) < 1:
- return False
- else:
- devs = self.getSdbDeviceList()
- for dev in devs:
- devId = dev.getDeviceId()
- if devId == deviceId:
- return True
- return False
-
- def getDeviceSize(self):
- return len(self.devices)
-
- def getSdbDeviceList(self):
- return self.devices
-
- def getDevice(self, deviceId):
- for dev in self.devices:
- if dev.getDeviceId() == deviceId:
- return dev
-
- print "#ERROR#: The '%s' device Id exists error" % deviceId
- return None
-
- def loadDeviceList(self):
- connDevices = []
- sdbOutLog = SdbManager.sdbDevices()
- devicesInfo = sdbOutLog.replace("List of devices attached", "")
- devList = devicesInfo.split('\n')
-
- for dev in devList:
- if len(dev) > 1:
- devInfoItem = dev.split('\t')
- devId = devInfoItem[0].rstrip()
- devType = devInfoItem[1].rstrip()
- devName = devInfoItem[2].rstrip()
- if not (devType == "unknown" or devType == "offline" \
- or devId == "unknown" or devId == "offline"):
- connDevices.append(SdbDevice(devId, devName, devType))
-
- if len(connDevices) > 0:
- self._updateConnDevice(connDevices)
- print "Connected Devices = %s" \
- % str([dev.devId for dev in self.devices])
- return True
- else:
- self._resetDevices()
- return False
-
-class SdbDevice:
- def __init__(self, devId, devName, devType):
- self.devId = devId
- self.devName = devName
- self.devType = devType
-
- def _printDevInfo(self):
- print "===== Device Infomation ====="
- print " Name : " + self.devName
- print " Id : " + self.devId
- print " Type : " + self.devType
- print "============================="
-
- def getDeviceId(self):
- return self.devId
-
- def getDeviceName(self):
- return self.devName
-
- def getDeviceType(self):
- return self.devType
+++ /dev/null
-[HealthCheck]
-step1=checking widget getCap,getCap,10
-step2=checking process testkit-stub,testkit-stub,5
-step3=checking testconfig tool,testconfig,2
-step4=checking widget storage,storage,10
+++ /dev/null
-#!/usr/bin/python
-
-import subprocess
-import time
-import os
-import platform
-import re
-import signal
-import ctypes
-
-SDB_PUSH = "sdb -s %s push"
-SDB_SHELL = "sdb -s %s shell"
-SDB_ROOT_ON = "sdb -s %s root on"
-SDB_DEVICES = "sdb devices"
-SDB_START_SERVER = "sdb start-server"
-SDB_KILL_SERVER = "sdb kill-server"
-SDB_CONNECT = "sdb connect %s"
-SDB_PULL = "sdb -s %s pull"
-SDB_CAT_CONFIG = " cat %s"
-SDB_LS = "sdb -s %s shell ls -al"
-FILE_FOUND_SCRIPT = "[ -f %s ] && echo \"Found\" || echo \"Not Found\""
-
-class SdbManager:
-
- @staticmethod
- def hostCommand(command):
- print command
- proc = subprocess.Popen(command, shell=True, \
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-
- while True:
- exit_code = proc.poll()
- if exit_code is not None:
- break
-
- output = proc.stdout.read()
- if output:
- print output
-
- errlog = proc.stderr.read()
- if errlog:
- print errlog
-
- return True
-
- @staticmethod
- def hostCommandwithResult(command):
- print command
- proc = subprocess.Popen(command, shell=True, \
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-
- while True:
- exit_code = proc.poll()
- if exit_code is not None:
- break
-
- return proc.stdout.read()
-
- @staticmethod
- def sdbCommand(command, timeout=90):
- print command
- proc = subprocess.Popen(command,
- shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- time_out = 0
- exit_code = None
- while time_out < timeout:
- exit_code = proc.poll()
- if exit_code is not None:
- break
- time_out += 0.5
- time.sleep(0.5)
- if exit_code is None:
- SdbManager.killall(proc.pid)
-
- return exit_code, proc.stdout, proc.stderr
-
- @staticmethod
- def _checkDevIdExists(_devid):
- if len(_devid) < 0:
- print "#ERROR#: The '%s' device Id exists error" % _devid
- return False
- return True
-
- @staticmethod
- def _checkFileExists(aPath):
- if os.path.exists(aPath):
- return True
- else:
- return False
-
- @staticmethod
- def sdbPush(_devid, local, remote):
- if SdbManager._checkFileExists(local) is False:
- print '#WARNING#: The %s file exists error' % local
- return False
-
- FAIL_LOG = "#ERROR#: sdb push failed"
- SdbManager._checkDevIdExists(_devid)
- push_cmd = SDB_PUSH % _devid + " " + local + " " + remote
- exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(push_cmd)
-
- if exit_code is None:
- print FAIL_LOG
- errLog = re_stderr.read()
- if errLog: print errLog
- return False
- else:
- print re_stdout.read()
- return True
-
- @staticmethod
- def sdbShell(deviceId, cmd, timeout=90):
- SdbManager._checkDevIdExists(deviceId)
- shell_cmd = SDB_SHELL % deviceId + " " + cmd
- FAIL_LOG = "#ERROR#: sdb shell failed"
- exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(shell_cmd, timeout)
-
- if exit_code is None:
- print FAIL_LOG
- errLog = re_stderr.read()
- if errLog : print errLog
- return None
- else:
- outLog = re_stdout.read()
- errLog = re_stderr.read()
- if errLog:
- print FAIL_LOG
- print errLog
- return None
- if outLog:
- print outLog
- return outLog
-
- @staticmethod
- def sdbRootOn(deviceId):
- SdbManager._checkDevIdExists(deviceId)
- FAIL_LOG = "#ERROR#: sdb root on failed"
- is_pass = False
- root_cmd = SDB_ROOT_ON % deviceId
- exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(root_cmd, 20)
-
- if exit_code is None:
- print FAIL_LOG
- errLog = re_stderr.read()
- if errLog: print (str(errLog))
-
- checkLog = SdbManager.sdbShell(deviceId, 'whoami')
- if checkLog and checkLog.find('root') != -1:
- print 'SDB ROOT ON'
- is_pass = True
- else:
- print FAIL_LOG
- print str(checkLog)
-
- return is_pass
-
- @staticmethod
- def sdbDevices():
- dev_cmd = SDB_DEVICES
- start_server_cmd = SDB_START_SERVER
- SdbManager.sdbCommand(start_server_cmd, 8)
- exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(dev_cmd, 20)
- if exit_code is None:
- print "#ERROR#: %s" % re_stderr.read()
- return None
-
- return re_stdout.read()
-
- @staticmethod
- def sdbSetDate(devid):
- print "set device date"
- HDATE = '`date "+%Y-%m-%d %H:%M"`'
- date_cmd = '"date -s \''+ HDATE + '\'"'
- SdbManager.sdbShell(devid, date_cmd)
-
- @staticmethod
- def killall(ppid):
- """Kill all children process by parent process ID"""
- os_ver = platform.system()
- try:
- if os_ver == "Linux" or os_ver == "Darwin":
- ppid = str(ppid)
- pidgrp = []
-
- def getchildpids(ppid):
- """Return a list of children process"""
- command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
- ppid)
- pids = os.popen(command).read()
- pids = pids.split()
- return pids
-
- pidgrp.extend(getchildpids(ppid))
- for pid in pidgrp:
- pidgrp.extend(getchildpids(pid))
- # Insert self process ID to PID group list
- pidgrp.insert(0, ppid)
- while len(pidgrp) > 0:
- pid = pidgrp.pop()
- try:
- os.kill(int(pid), signal.SIGKILL)
- except OSError, error:
- pattern = re.compile('No such process')
- match = pattern.search(str(error))
- if not match:
- print "[ Error: fail to kill pid: %s," \
- " error: %s ]\n" % (int(pid), error)
- # kill for windows platform
- else:
- kernel32 = ctypes.windll.kernel32
- handle = kernel32.OpenProcess(1, 0, int(ppid))
- kernel32.TerminateProcess(handle, 0)
- except OSError, error:
- pattern = re.compile('No such process')
- match = pattern.search(str(error))
- if not match:
- print "[ Error: fail to kill pid: %s, error: %s ]\n" \
- % (int(ppid), error)
- return None
+++ /dev/null
-#!/usr/bin/python
-
-"""Usage:
- tct-config-device.py [--install [--deviceid <serial_no>]]
- tct-config-device.py --purge [--deviceid <serial_no>]
- tct-config-device.py --check [--deviceid <serial_no>][--procid <process_name>]
- tct-config-device.py --bhtest <profile>
-
-Options:
- -h, --help show this help message and exit
- --install Install tct resources to TIZEN device,it can be omitted
- --purge Clean up tct resources from TIZEN device
- --check Check test resource on device
- --bhtest Install tct behavior test
- --deviceid Set the device serial number
- --procid Set the check process name
-
-"""
-import os
-import sys
-import time
-import ConfigParser
-import threading
-import subprocess
-
-
-from optparse import OptionParser
-from devicemanager import DeviceManager
-from sdbmanager import SdbManager
-
-JOIN = os.path.join
-EXISTS = os.path.exists
-DIRNAME = os.path.dirname
-BASENAME = os.path.basename
-ABSPATH = os.path.abspath
-SPLIT = os.path.split
-
-CURENT_DIR = SPLIT(DIRNAME(ABSPATH(__file__)))[0]
-
-TOOLS_DIR = JOIN(CURENT_DIR, "tools")
-RESRC_DIR = JOIN(CURENT_DIR, "resource")
-PKGS_DIR = JOIN(CURENT_DIR, "package")
-
-DEVID = ""
-
-TIZENV = "tizen_5.5"
-
-DLOG_CLEAR = "dlogutil -c"
-DLOG_UTIL = "sdb -s %s shell dlogutil -v time"
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = ConfigParser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
-DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-DEVICE_EXECUTION_MODE_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
-
-if TIZENV.find('tizen_5.5') > -1:
- DEVICE_SUITE_TARGET = DEVICE_SUITE_TARGET_30
-else:
- DEVICE_SUITE_TARGET = DEVICE_SUITE_TARGET_24
-
-def LS(root, file_name, extension=None):
- import glob
-
- file_path = ""
- if extension:
- file_path = JOIN(root, file_name) + "*." + extension
- else:
- file_path = JOIN(root, file_name) + "*"
- files = glob.iglob(r'' + file_path + '')
- for f in files:
- return BASENAME(f)
-
-def get_device_arch():
- global DEV_ARCH
- #ARCHCMD = SDB_SERNO + " shell \"cat /etc/products.d/tizen.prod |grep \<arch\""
- arch_cmd = "cat /etc/config/model-config.xml | grep tizen.org/feature/platform.core.cpu.arch"
- #result example : <key name="tizen.org/feature/platform.core.cpu.arch" type="string">armv7</key>
- result = SdbManager.sdbShell(DEVID, arch_cmd)
- if result and len(result) > 0:
- arch_str = result.split('\n')[0]
- if arch_str and arch_str.find('armv') > -1:
- DEV_ARCH = "arm"
- print "info: [* Arch Type : arm *]"
- elif arch_str and arch_str.find("aarch64") > -1:
- DEV_ARCH = "aarch64"
- print "info: [* Arch Type : aarch64 *]"
- elif arch_str and arch_str.find('x86_64') > -1:
- DEV_ARCH = "ia64"
- print "info: [* Arch Type : ia64 *]"
- elif arch_str and (arch_str.find("i686") > -1 or arch_str.find("x86") > -1 or arch_str.find("i386") > -1):
- DEV_ARCH = "ia"
- print "info: [* Arch Type : ia *]"
- else:
- print "info: [* Arch Type : None *]"
- return False
- return True
- else:
- print "#ERROR#: Failed to get device cpu_arch type"
- return False
-
-
-def kill_process(process_name):
- proc_cmd = "ps aux | grep " + process_name + " | grep -v grep | awk '{print $2}'"
- result = SdbManager.sdbShell(DEVID, proc_cmd)
- if result and len(result) > 0:
- kill_cmd = "kill -9 " + str(result).strip() + " > /dev/null 2>&1"
- SdbManager.sdbShell(DEVID, kill_cmd)
- print "info: %s process has been killed" % process_name
- else:
- print "info: No process of %s activated" % process_name
-
-def remove_tinyweb():
- SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/server.pem > /dev/null 2>&1")
- SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/tinyweb > /dev/null 2>&1")
- SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/cgi-getcookie > /dev/null 2>&1")
- SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/cgi-getfield > /dev/null 2>&1")
- SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/libmongoose.so > /dev/null 2>&1")
- SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/echo.so > /dev/null 2>&1")
- SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/libssl.so > /dev/null 2>&1")
- SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/libcrypto.so > /dev/null 2>&1")
-
-def remove_stub():
- SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/testkit-stub")
-
-
-def uninstall_testconfig():
- if TIZENV.find('tizen_5.5') > -1:
- inst_path = RESRC_DIR + os.sep + 'tct-testconfig' + os.sep + 'inst.py'
- SdbManager.hostCommand("python %s -s %s -u" % (inst_path, DEVID))
- else:
- RPMPKG = LS(RESRC_DIR, "tct-testconfig")
- if not RPMPKG:
- sys.exit("#ERROR#: cannot found tct-testconfig.zip file in resource dir")
- uninst_cmd = JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-testconfig/inst.sh') + ' -u'
- SdbManager.sdbShell(DEVID, uninst_cmd)
- rm_cmd = 'rm -f ' + JOIN(DEVICE_SUITE_TARGET, 'tct/', RPMPKG)
- SdbManager.sdbShell(DEVID, rm_cmd)
-
-
-def uninstall_behavior():
- print "info: Uninstall behavior tool."
- if TIZENV.find('tizen_5.5') > -1:
- pass
- else:
- uninst_cmd = JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-behavior-tests/inst.sh') + ' -u'
- SdbManager.sdbShell(DEVID, uninst_cmd)
-
-
-def check_resource_dir():
- print "info: check resource directory."
- if os.path.exists(RESRC_DIR):
- SdbManager.sdbShell(DEVID, 'mkdir -p ' + JOIN(DEVICE_SUITE_TARGET, 'tct/'))
- SdbManager.sdbShell(DEVID, 'mkdir -p ' + JOIN(DEVICE_SUITE_TARGET, 'Documents/'))
- return True
- else:
- print "#WARNING#: The directory resource does not exists. Please copy test resources to %s " % RESRC_DIR
- return False
-
-def check_tinyweb():
- print "info: Check tinyweb."
- result = SdbManager.sdbShell(DEVID, "ls /opt/home/developer/ | grep tinyweb")
- if result and result.find('tinyweb'):
- remove_tinyweb()
- install_tinyweb()
- launch_tinyweb()
- else:
- install_tinyweb()
- launch_tinyweb()
-
-
-def port_manager():
- print "info: Check the tinyweb port"
- result = SdbManager.sdbShell('fuser -n tcp 80 8080 8081 8082 8083 8443')
- if result and len(result) > 0:
- check_port = SdbManager.sdbShell('su "netstat -nap |grep tinyweb"')
- if len(check_port) > 0:
- print "info: tinyweb on"
- else:
- print "info: Port is available"
-
-
-def launch_tinyweb():
- dpath_cmd = "printenv PATH"
- dpath = SdbManager.sdbShell(DEVID, dpath_cmd)
-
- launch_cmd = 'sdb -s ' + DEVID + ' shell ' + '"env LD_LIBRARY_PATH=/opt/home/developer PATH=' + dpath.strip() + \
- ':/opt/home/developer/ tinyweb -ssl_certificate /opt/home/developer/server.pem -document_root ' + \
- JOIN(DEVICE_SUITE_TARGET, 'tct') + ' -listening_ports 80,8080,8081,8082,8083,8443s; sleep 3s" 0> /dev/null'
-
- SdbManager.sdbCommand(launch_cmd, 10)
-
- check_tinyweb_cmd = '\"ps aux | grep tinyweb | grep -v grep\"'
- result = SdbManager.sdbShell(DEVID, check_tinyweb_cmd)
- if result and result.find('tinyweb') > -1:
- print "info: Active process tinyweb successfully."
- return True
- else:
- print "#ERROR#: Active process tinyweb failed."
- return False
-
-def install_tinyweb():
- print "info: Install tinyweb"
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'tinyweb'), '/opt/home/developer/')
- SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/tinyweb")
-
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'cgi-getcookie'), '/opt/home/developer/')
- SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/cgi-getcookie")
-
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'cgi-getfield'), '/opt/home/developer/')
- SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/cgi-getfield")
-
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'libmongoose.so'), '/opt/home/developer/')
- SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/libmongoose.so")
-
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'echo.so'), '/opt/home/developer/')
- SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/echo.so")
-
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'server.pem'), '/opt/home/developer/')
- SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/server.pem")
- if DEV_ARCH == "arm":
- SdbManager.sdbShell(DEVID, "ln -s /usr/lib/libssl.so.1.0.0 /opt/home/developer/libssl.so")
- SdbManager.sdbShell(DEVID, "ln -s /usr/lib/libcrypto.so.1.0.0 /opt/home/developer/libcrypto.so")
- elif DEV_ARCH == "ia":
- SdbManager.sdbShell(DEVID, "ln -s /usr/lib/libssl.so.1.0.0 /opt/home/developer/libssl.so")
- SdbManager.sdbShell(DEVID, "ln -s /usr/lib/libcrypto.so.1.0.0 /opt/home/developer/libcrypto.so")
- elif DEV_ARCH == "aarch64":
- SdbManager.sdbShell(DEVID, "ln -s /usr/lib64/libssl.so.1.0.0 /opt/home/developer/libssl.so")
- SdbManager.sdbShell(DEVID, "ln -s /usr/lib64/libcrypto.so.1.0.0 /opt/home/developer/libcrypto.so")
- elif DEV_ARCH == "ia64":
- SdbManager.sdbShell(DEVID, "ln -s /usr/lib64/libssl.so.1.0.0 /opt/home/developer/libssl.so")
- SdbManager.sdbShell(DEVID, "ln -s /usr/lib64/libcrypto.so.1.0.0 /opt/home/developer/libcrypto.so")
-
-
-def check_stub():
- print "info: Check testkit-stub."
- result = SdbManager.sdbShell(DEVID, "ls /opt/home/developer/ | grep testkit-stub")
- if result and len(result) > 0:
- print "info: testkit-stub has been installed on device."
- kill_process("testkit-stub")
- install_stub()
-
-
-def install_stub():
- print "info: Install testkit-stub."
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'testkit-stub', DEV_ARCH, 'testkit-stub'), '/opt/home/developer/testkit-stub')
- SdbManager.sdbShell(DEVID, "chmod a+x /opt/home/developer/testkit-stub")
- SdbManager.sdbShell(DEVID, "chsmack -e \"User\" /opt/home/developer/testkit-stub")
-
-
-def check_testconfig():
- result = SdbManager.sdbShell(DEVID, '"cat ' + JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-testconfig/tct-testconfig.ini') + ' | grep tct"')
- if result and len(result) > 0 and result.find('No such file or directory') == -1:
- print "info: testconfig has already been installed on device."
- else:
- install_testconfig()
-
-
-def install_testconfig():
- print "info: Install testconfig."
- if TIZENV.find('tizen_5.5') > -1:
- instPath = RESRC_DIR + os.sep + 'tct-testconfig' + os.sep + 'inst.py'
- SdbManager.hostCommand("python %s -s %s" % (instPath, DEVID))
- else:
- conf_pkg = LS(RESRC_DIR, "tct-testconfig")
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, conf_pkg), JOIN(DEVICE_SUITE_TARGET, 'tct/'))
- SdbManager.sdbShell(DEVID, 'unzip -uo ' + JOIN(DEVICE_SUITE_TARGET, 'tct/') + conf_pkg + ' -d ' + JOIN(DEVICE_SUITE_TARGET, 'tct/'))
- SdbManager.sdbShell(DEVID, JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-testconfig/inst.sh'))
-
- result = SdbManager.sdbShell(DEVID, 'cat ' + JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-testconfig/tct-testconfig.ini') + ' | grep tct')
-
- if result and len(result) > 0:
- print "info: Install testconfig successfully."
- else:
- print "#ERROR#: Failed to install testconfig, please check %s" % RESRC_DIR
- return False
-
- return True
-
-def install_behavior(profile_name):
- print "info: Install behavior tool."
-
- if not profile_name in ['wearable', 'mobile', 'tv', 'ivi']:
- print "#WARNING#: Invalid device profile value %s" % profile_name
- return False
-
- if TIZENV.find('tizen_5.5') > -1:
- RPMPKG = "tct-behavior-tests-5.5.zip"
- opt_rpm_path = PKGS_DIR + "s" + os.sep + profile_name + os.sep + RPMPKG
- local_rpm_path = PKGS_DIR + os.sep + profile_name + os.sep + RPMPKG
-
- install_rpm = None
- install_dest = None
- install_cmd = None
- if os.path.exists(opt_rpm_path):
- install_rpm = opt_rpm_path
- install_dest = PKGS_DIR + "s" + os.sep + profile_name + os.sep
- install_cmd = PKGS_DIR + "s" + os.sep + profile_name + os.sep + \
- 'opt' + os.sep + "tct-behavior-tests" + os.sep + "inst.py"
- elif os.path.exists(local_rpm_path):
- install_rpm = local_rpm_path
- install_dest = PKGS_DIR + os.sep + profile_name + os.sep
- install_cmd = PKGS_DIR + os.sep + profile_name + os.sep + \
- 'opt' + os.sep + "tct-behavior-tests" + os.sep + "inst.py"
-
- SdbManager.hostCommand("rm -rf %s" % install_dest + "opt/tct-behavior-tests")
- SdbManager.hostCommand("unzip -uo %s -d %s" % (install_rpm, install_dest))
- SdbManager.hostCommand("python %s -s %s" % (install_cmd, DEVID))
-
- print "info: Check tizen-web-ui-fw. Please wait..."
- check_uifw = SdbManager.sdbShell(DEVID, "ls /usr/share/ | grep tizen-web-ui-fw")
- if check_uifw and len(check_uifw) > 0:
- print "info: tizen-web-ui-fw has been installed on device."
- else:
- SdbManager.sdbShell(DEVID, '"mkdir -p /usr/share/tizen-web-ui-fw/"')
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, "tizen-web-ui-fw"), '/usr/share/tizen-web-ui-fw/')
- else:
- pass
-
- return True
-
-
-def install_getCap():
- print "info: Install widget getCap."
- widgetCap = LS(RESRC_DIR, 'getCap', 'wgt')
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, widgetCap), JOIN(DEVICE_SUITE_TARGET, 'tct/') + widgetCap)
-
- if TIZENV.find('5.5') > -1:
- SdbManager.sdbShell(DEVID, "su - " + DEVICE_EXECUTION_MODE_30 + \
- " -c 'pkgcmd -i -t wgt -q -p " + JOIN(DEVICE_SUITE_TARGET, 'tct/') + widgetCap + '\'')
- SdbManager.sdbShell(DEVID, 'pkgcmd -i -t wgt -q -p ' + JOIN(DEVICE_SUITE_TARGET, 'tct/') + widgetCap)
-
-
-def install_ngetCap():
- print "info: Install widget ngetCap."
- getcap_pkg = LS(RESRC_DIR, 'getCap', 'tpk')
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, getcap_pkg), JOIN(DEVICE_SUITE_TARGET, 'tct/') + getcap_pkg)
-
- if TIZENV.find('tizen_5.5') > -1:
- SdbManager.sdbShell(DEVID, "su - " + DEVICE_EXECUTION_MODE_30 + \
- " -c 'pkgcmd -ipt tpk -p " + JOIN(DEVICE_SUITE_TARGET, 'tct/') + getcap_pkg + '\'')
- else:
- SdbManager.sdbShell(DEVID, "pkgcmd -iqt tpk -p" + JOIN(DEVICE_SUITE_TARGET, 'tct/') + getcap_pkg)
-
-def uninstall_getCap():
- print "info: Uninstall widget getCap."
- wgt_id = getCap_appid()
- if wgt_id:
- uninst_cmd = ""
- if TIZENV.find('tizen_5.5') > -1:
- uninst_cmd = "su - " + DEVICE_EXECUTION_MODE_30 + \
- " -c 'pkgcmd -qun " + wgt_id.split('.')[0] + '\''
- elif TIZENV.find('tizen_2.4') > -1:
- uninst_cmd = "pkgcmd -u -q -t wgt -q -p " + wgt_id + '\''
- SdbManager.sdbShell(DEVID, uninst_cmd)
-
- else:
- print "info: getCap is not installed. No need to uninstall"
-
- SdbManager.sdbShell(DEVID, "rm -rf " + JOIN(DEVICE_SUITE_TARGET, "Documents/tct"))
- SdbManager.sdbShell(DEVID, "rm -rf " + JOIN(DEVICE_SUITE_TARGET, "tct/getCap.wgt"))
- SdbManager.sdbShell(DEVID, "rm -rf " + JOIN(DEVICE_SUITE_TARGET, "tct/getCap.tpk"))
-
-
-def uninstall_ngetCap():
- print "info: Uninstall widget ngetCap."
-
-def getCap_appid():
- widgetid_cmd = ""
- if TIZENV.find('tizen_5.5') > -1:
- widgetid_cmd = "su - " + DEVICE_EXECUTION_MODE_30 + \
- " -c \"app_launcher -l | grep getCapabilities\""
- else:
- widgetid_cmd = "wrt-launcher -l | grep getCapabilities"
-
- widgetids = SdbManager.sdbShell(DEVID, widgetid_cmd)
- if widgetids and widgetids.find('getCapabilities') > -1:
- items = widgetids.split()
- return items[len(items) - 1].strip("'")
- else:
- return None
-
-def check_getCap():
- print "info: Check getCap widget. Please wait..."
- if getCap_appid():
- print "info: widget getCap has already been installed on device."
- else:
- install_getCap()
- launch_getCap()
-
-
-def check_ngetCap():
- print "info: Check ngetCap widget. Please wait..."
- if getCap_appid():
- print "info: widget ngetCap has already been installed on device."
- else:
- install_ngetCap()
- launch_ngetCap()
-
-
-def launch_getCap():
- wgt_id = getCap_appid()
- if wgt_id:
- launchResult = None
- if TIZENV.find('tizen_5.5') > -1:
- launchResult = SdbManager.sdbShell(DEVID, 'su - ' + \
- DEVICE_EXECUTION_MODE_30 + ' -c \"app_launcher -s ' + wgt_id + '\"')
- else:
- launchResult = SdbManager.sdbShell(DEVID, '\"wrt-launcher -s ' + wgt_id + '\"')
-
- if launchResult.find('launched') > -1:
- fcheck_retry = 20
-
- while fcheck_retry > 0:
- build = SdbManager.sdbShell(DEVID, "cat " + JOIN(DEVICE_SUITE_TARGET, "Documents/tct/buildinfo.xml") + " | grep buildinfos")
- capa = SdbManager.sdbShell(DEVID, "cat " + JOIN(DEVICE_SUITE_TARGET, "Documents/tct/capability.xml") + " | grep capabilities")
- if not build or not capa:
- time.sleep(2)
- fcheck_retry -= 1
- else:
- break
- if fcheck_retry == 0:
- print "#ERROR#: getCap get buildinfo, capability of device failed!"
- return False
- else:
- print "info: Launch getCap successfully"
- return True
- else:
- print "#ERROR#: Launch getCap got failed"
- return False
- else:
- print "#ERROR#: Widget getCap cannot be found. Please check whether the widget is installed successfully"
- return False
-
-def launch_ngetCap():
- launch_result = None
- if TIZENV.find('tizen_5.5') > -1:
- launch_result = SdbManager.sdbShell(DEVID, 'su - ' + \
- DEVICE_EXECUTION_MODE_30 + ' -c \"launch_app org.example.getcap\"')
- else:
- launch_result = SdbManager.sdbShell(DEVID, '\"launch_app org.example.getcap\"')
-
- if "launched" in launch_result:
- return True
- else:
- return False
-
-def getStorage_appid():
- widgetid_cmd = "su - " + DEVICE_EXECUTION_MODE_30 + \
- " -c \"app_launcher -l | grep InternalStorageSetting\""
- widgetids = SdbManager.sdbShell(DEVID, widgetid_cmd)
- if widgetids and widgetids.find('InternalStorageSetting') > -1:
- items = widgetids.split()
- return items[len(items)-1].strip("'")
- else:
- return None
-
-def check_storage():
- print "info: Check InternalStorageSetting widget. Please wait..."
- if getStorage_appid():
- print "info: widget InternalStorageSetting has already been installed on device."
- else:
- install_storage()
- launch_storage()
-
-def install_storage():
- print "info: Install widget InternalStorageSetting"
- widget = LS(RESRC_DIR, 'InternalStorageSetting', 'wgt')
- SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, widget), JOIN(DEVICE_SUITE_TARGET, 'tct/') + widget)
-
- SdbManager.sdbShell(DEVID, "su - " + DEVICE_EXECUTION_MODE_30 + \
- " -c 'pkgcmd -i -t wgt -q -p " + JOIN(DEVICE_SUITE_TARGET, 'tct/') + widget + '\'')
-
-def launch_storage():
- wgt_id = getStorage_appid()
- if wgt_id:
- launch_result = SdbManager.sdbShell(DEVID, 'su - ' + \
- DEVICE_EXECUTION_MODE_30 + ' -c \"app_launcher -s ' + wgt_id + '\"')
-
- if launch_result.find('launched') > -1:
- print "info: Launch InternalStorageSetting successfully"
- return True
- else:
- print "#ERROR#: InternalStorageSetting launch failed"
- return False
- else:
- print "#ERROR#: Widget InternalStorageSetting cannot be found"
- return False
-
-def uninstall_storage():
- print "info: Uninstall widget InternalStorageSetting"
- wgt_id = getStorage_appid()
- if wgt_id:
- uninst_cmd = "su - " + DEVICE_EXECUTION_MODE_30 + \
- " -c 'pkgcmd -qun " + wgt_id.split('.')[0] + '\''
- SdbManager.sdbShell(DEVID, uninst_cmd)
- else:
- print "info: InternalStorageSetting is not installed"
-
-def push_tctconf_file():
- local = TCT_CONFIG_FILE
- remote = DEVICE_SUITE_TARGET_30
- if not SdbManager.sdbPush(DEVID, local, remote):
- print "#ERROR#: TCT_CONFIG file push failed"
- return False
- return True
-
-def find_ngetCap():
- getcap_tpk = LS(RESRC_DIR, 'getCap', 'tpk')
- if getcap_tpk:
- return True
- else:
- return False
-
-def debug_trace(cmd, logfile):
- global debug_flag, metux
-
- wbuffile = file(logfile, "a+")
- exit_code = None
- proc = subprocess.Popen(args=cmd,
- shell=True,
- stdout=wbuffile,
- stderr=None)
- while True:
- exit_code = proc.poll()
- if exit_code is not None:
- break
- time.sleep(0.6)
- metux.acquire()
- proc_flag = debug_flag
- metux.release()
- if not proc_flag:
- break
- wbuffile.close()
- SdbManager.killall(proc.pid)
-
-
-def start_debug(dlog_file):
- global debug_flag, metux, dlog_thread
- debug_flag = True
- metux = threading.Lock()
- clear_cmd = DLOG_CLEAR
- SdbManager.sdbShell(DEVID, clear_cmd)
-
- dlog_cmd = DLOG_UTIL % DEVID
- dlog_thread = threading.Thread(target=debug_trace, args=(dlog_cmd, dlog_file))
- dlog_thread.setDaemon(True)
- dlog_thread.start()
-
-
-def stop_debug():
- global debug_flag, metux
- metux.acquire()
- debug_flag = False
- metux.release()
- dlog_thread.join()
-
-
-def runProcess():
- if options.purge:
- print "[ Uninstall test resource on device. Please wait...]"
- uninstall_testconfig()
- uninstall_behavior()
- uninstall_getCap()
- remove_tinyweb()
- kill_process("tinyweb")
- kill_process("testkit-stub")
- remove_stub()
- if TIZENV.find('5.5') > -1:
- uninstall_storage()
- print "Clean the tct packages in device successfully."
-
- elif options.check:
- check_resource_dir()
- print "[ Check test resource on device. Please wait...]"
- if options.process == 'tinyweb':
- check_tinyweb()
- elif options.process == 'testkit-stub':
- check_stub()
- elif options.process == 'testconfig':
- check_testconfig()
- elif options.process == 'getCap':
- check_getCap()
- elif options.process == 'ngetCap':
- if find_ngetCap():
- check_ngetCap()
- else:
- check_getCap()
- elif options.process == 'storage':
- check_storage()
- else:
- check_tinyweb()
- check_stub()
- check_testconfig()
- if find_ngetCap():
- check_ngetCap()
- else:
- check_getCap()
- if TIZENV.find('5.5') > -1:
- check_storage()
-
- print "Check finished."
-
- elif options.bhtest:
- check_resource_dir()
- if TIZENV.find('5.5') > -1:
- uninstall_storage()
- install_storage()
- launch_storage()
-
- uninstall_behavior()
- print "[ Install tct behavior tool on device. Please wait...]"
- install_behavior(options.bhtest)
- print "Installation of tct behavior on device completed."
-
- else:
- check_resource_dir()
- print "[ Clean old test resource on device. Please wait...]"
- if options.process == 'tinyweb':
- kill_process("tinyweb")
- remove_tinyweb()
- elif options.process == 'testkit-stub':
- kill_process("testkit-stub")
- remove_stub()
- elif options.process == 'testconfig':
- uninstall_testconfig()
- elif options.process == 'getCap':
- uninstall_getCap()
- pass
- elif options.process == 'ngetCap':
- uninstall_ngetCap()
- elif options.process == 'storage':
- uninstall_storage()
- else:
- remove_tinyweb()
- kill_process("testkit-stub")
- remove_stub()
- uninstall_testconfig()
- uninstall_getCap()
- uninstall_ngetCap()
- if TIZENV.find('5.5') > -1:
- uninstall_storage()
-
- print "Clean the tct packages in device successfully."
- print "[ Install test resource on device. Please wait...]"
- if options.process == 'tinyweb':
- install_tinyweb()
- launch_tinyweb()
- elif options.process == 'testkit-stub':
- install_stub()
- elif options.process == 'testconfig':
- install_testconfig()
- elif options.process == 'getCap':
- install_getCap()
- launch_getCap()
- elif options.process == 'ngetCap':
- if find_ngetCap():
- install_ngetCap()
- launch_ngetCap()
- else:
- install_getCap()
- launch_getCap()
- elif options.process == 'storage':
- install_storage()
- launch_storage()
- else:
- install_testconfig()
- install_stub()
- install_tinyweb()
- launch_tinyweb()
- if find_ngetCap():
- install_ngetCap()
- launch_ngetCap()
- else:
- install_getCap()
- launch_getCap()
-
- if TIZENV.find('5.5') > -1:
- install_storage()
- launch_storage()
-
- print "All of installation process on device completed."
-
-
-if __name__ == "__main__":
-
- parser = OptionParser()
- parser.add_option(
- "--install", dest="install", action="store_true", default=False,
- help="Install tct resources to TIZEN device,it can be omitted")
- parser.add_option(
- "--purge", dest="purge", action="store_true", default=False,
- help="Clean up tct resources from TIZEN device")
- parser.add_option(
- "--check", dest="check", action="store_true", default=False,
- help="Check test resource on device")
- parser.add_option(
- "--deviceid", dest="deviceid", action="store",
- help="Set the device serial number")
- parser.add_option(
- "--procid", dest="process", action="store",
- help="Set the process id for checking")
- parser.add_option(
- "--bhtest", dest="bhtest", action="store",
- help="Install behavior test tool to device")
-
- (options, args) = parser.parse_args()
-
- devinst = DeviceManager.getInstance()
- if options.deviceid:
- if devinst.isDeviceAvailable(options.deviceid):
- DEVID = options.deviceid
- else:
- sys.exit("#ERROR#: The '%s' device Id exists error" % options.deviceid)
- else:
- if devinst.getDeviceSize() > 1 or devinst.getDeviceSize() == 0:
- sys.exit("#ERROR#: %s devices connected or device not connected" % str(devinst.getDeviceSize()))
- else:
- DEVID = devinst.getSdbDeviceList()[0].getDeviceId()
-
- print "[========== start tct-config-device : %s ==========]" % DEVID
- dev_temp_dir = '/opt/tools/shell/tmp/%s/' % DEVID
- if not os.path.isdir(dev_temp_dir):
- os.mkdir(dev_temp_dir)
- DLOG_SAVE_PATH = '/opt/tools/shell/tmp/%s/conf_dev_%s.dlog'
- if options.process is None:
- DLOG_SAVE_PATH = DLOG_SAVE_PATH % (DEVID, 'all')
- else:
- DLOG_SAVE_PATH = DLOG_SAVE_PATH % (DEVID, options.process)
-
- #start_debug(DLOG_SAVE_PATH)
-
- if not SdbManager.sdbRootOn(DEVID):
- sys.exit(-1)
-
- SdbManager.sdbSetDate(DEVID)
-
- if not get_device_arch() or not push_tctconf_file():
- sys.exit(0)
-
- runProcess()
- #stop_debug()
- print "[========== end tct-config-device : %s ==========]" % DEVID
+++ /dev/null
-# -*- coding:utf-8 -*-
-import os
-import sys
-import platform
-import shutil
-import stat
-from optparse import OptionParser
-
-
-class CpFile:
-
- def __init__(self, _tizenV, _upgrade=False):
- self.tizenV = _tizenV
- self.upgrade = _upgrade
- self.sep = os.sep
- self.TARGET_BASE_PATH = os.path.join(os.sep + "opt", "tct")
-
- self.CURRENT_TARGET_BASE_PATH = ""
- self.CURRENT_TARGET_LITE_PATH = ""
- self.CURRENT_SOURCE_LITE_PATH = ""
-
- #package
- self.SOURCE_PACKAGE_PATH = ".." + self.sep + "package"
- self.TARGET_PACKAGE_PATH = \
- self.sep + self.tizenV + self.sep + "packages"
- #manager
- self.SOURCE_MANAGER_PATH = \
- ".." + self.sep + "tools" + self.sep + "manager"
- self.TARGET_MANAGER_PATH = \
- self.sep + self.tizenV + self.sep + "manager"
- #resource
- self.SOURCE_RESOURCE_PATH = ".." + self.sep + "resource"
- self.TARGET_RESOURCE_PATH = \
- self.sep + self.tizenV + self.sep + "resource"
- #script
- self.SOURCE_SCRIPT_PATH = ""
- self.TARGET_SCRIPT_PATH = self.sep + self.tizenV + self.sep + "scripts"
- #doc
- self.SOURCE_DOC_PATH = ".." + self.sep + "doc"
- self.TARGET_DOC_PATH = self.sep + self.tizenV + self.sep + "doc"
-
- def getCurrentOSBit(self):
- return platform.architecture()
-
- def setCurrentPath(self):
- self.CURRENT_SOURCE_BASE_PATH = os.getcwd() + self.sep
- self.CURRENT_TARGET_BASE_PATH = self.TARGET_BASE_PATH
- print("current source base path =" + self.CURRENT_SOURCE_BASE_PATH)
- print("current target base path =" + self.CURRENT_TARGET_BASE_PATH)
-
- def cpDoc(self):
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_DOC_PATH,
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_DOC_PATH, "doc")
-
- def cpScript(self):
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + "healthcheck.ini",
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_SCRIPT_PATH + \
- self.sep + "healthcheck.ini")
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + "tct-config-device.py",
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_SCRIPT_PATH + \
- self.sep + "tct-config-device.py")
-
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + "devicemanager.py",
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_SCRIPT_PATH + \
- self.sep + "devicemanager.py")
-
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + "sdbmanager.py",
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_SCRIPT_PATH + \
- self.sep + "sdbmanager.py")
-
-
- def cpResource(self):
- if not self.upgrade:
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_RESOURCE_PATH,
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_RESOURCE_PATH, \
- "resource")
-
- def cpPackage(self):
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_PACKAGE_PATH,
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_PACKAGE_PATH, \
- "package")
- for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
- self.TARGET_PACKAGE_PATH):
- if (platform.system() != "Windows"):
- os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
-
- def cpManager(self):
- if not self.upgrade:
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_MANAGER_PATH,
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_MANAGER_PATH, \
- "manager")
- for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
- self.TARGET_MANAGER_PATH):
- if (platform.system() != "Windows"):
- os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
-
- def cpFile(self, src, target):
- if (not os.path.isfile(src)):
- print(src + " is not a file")
- return
- path = os.path.dirname(target)
- if (not os.path.isdir(path)):
- os.makedirs(path)
- shutil.copy2(src, target)
-
- def del_rw(self, action, name, exc):
- if (platform.system() != "Windows"):
- os.chmod(name, stat.S_IWRITE)
- os.remove(name)
-
- def cpDir(self, src, target, name):
- if (os.path.isdir(src) and not os.path.exists(target)):
- print("copy " + name + " dir start")
- shutil.copytree(src, target)
- print("copy " + name + " dir finish")
- else:
- if (not os.path.isdir(src)):
- print("source " + name + " path is not a dir")
- if (os.path.exists(target)):
- print ("target " + name + " path is exists")
- try:
- shutil.rmtree(target, onerror=self.del_rw)
- except Exception, data:
- print Exception, ":", data
-
- print ("target " + name + " dir destroyed")
- try:
- shutil.copytree(src, target)
- except Exception, data:
- print Exception, ":", data
- print("copy " + name + " dir finish")
-
- def clear(self):
- self.setCurrentPath()
- try:
- shutil.rmtree(self.CURRENT_TARGET_BASE_PATH, onerror=self.del_rw)
- except Exception, data:
- print Exception, ":", data
-
- def makeResult(self):
- mgr_result_folder = os.path.join(self.CURRENT_TARGET_BASE_PATH, \
- self.tizenV + "/manager/result")
- shell_result_folder = os.path.join(self.CURRENT_TARGET_BASE_PATH, \
- self.tizenV + "/shell/result")
-
- if not os.path.isdir(mgr_result_folder):
- os.makedirs(mgr_result_folder)
- else:
- if not self.upgrade:
- shutil.rmtree(mgr_result_folder, onerror=self.del_rw)
- os.makedirs(mgr_result_folder)
-
- if not os.path.isdir(shell_result_folder):
- os.makedirs(shell_result_folder)
- else:
- if not self.upgrade:
- shutil.rmtree(shell_result_folder, onerror=self.del_rw)
- os.makedirs(shell_result_folder)
- if (platform.system() != "Windows"):
- os.chmod(shell_result_folder, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
- os.chmod(mgr_result_folder, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
-
- def cp(self):
- self.setCurrentPath()
- self.cpDoc()
- self.cpPackage()
- self.cpManager()
- self.cpResource()
- self.cpScript()
- self.makeResult()
-
-parser = OptionParser()
-parser.add_option("-i", "--install", dest="install", action="store_true", \
- default=False, help="copy folders and file into os")
-parser.add_option("-p", "--purge", dest="clear", action="store_true", \
- default=False, help="clear all files")
-parser.add_option("-t", "--tizen-version", dest="tizenV", \
- help="set tizen version infomation")
-parser.add_option("-u", "--upgrade", dest="upgrade", action="store_true", \
- default=False, help="upgrade tct tools")
-
-(options, args) = parser.parse_args()
-
-if options.tizenV is None:
- print "[ Error : input your tizen version ]"
- sys.exit(1)
-
-if (options.install):
- test = CpFile(options.tizenV)
- test.cp()
-elif (options.clear):
- test = CpFile(options.tizenV)
- test.clear()
-elif (options.upgrade):
- test = CpFile(options.tizenV, options.upgrade)
- test.cp()
-else:
- test = CpFile(options.tizenV)
- test.cp()
+++ /dev/null
-# -*- coding:utf-8 -*-
-import os
-import sys
-import shutil
-import stat
-import re
-import tarfile
-import zipfile
-import platform
-
-SCRIPT_VERSION = "1.1"
-WEB_TCT_PATTERN = "^web-tct_\d.\d"
-NATIVE_TCT_PATTERN = "^nativetct_\d.\d"
-CSHARP_TCT_PATTERN = "^csharp-tct_\d.\d"
-
-TOOLS_PATTERN = "^tct-tools"
-
-TCT_INSTALL_SCRIPT = "tct-config-host.py"
-TOOLS_INSTALL_SCRIPT = "tct-config-tools.py"
-
-NATIVE_TCT_TYPE = 0
-WEB_TCT_TYPE = 1
-TOOLS_TYPE = 2
-NORMAL_TYPE = 3
-CSHARP_TCT_TYPE = 4
-
-def make_ver_file(tctV, tizenV):
- ver_path = "/opt/tct/" + tizenV + "/VERSION"
- #ver_file = open('/opt/tct/tizen_web_3.0/VERSION', 'wa')
- ver_file = open(ver_path, 'w')
- ver_file.write(str(tctV))
- ver_file.close()
-
-def get_tizenV(afile):
- tizenV = ""
- ver = afile.split('_')[1]
- if afile.find("web") > -1:
- tizenV = "tizen_web_" + ver
- elif afile.find("Native") > -1:
- tizenV = "tizen_native_" + ver
- elif afile.find("csharp") > -1:
- tizenV = "tizen_csharp_" + ver
-
- return tizenV
-
-def install_release_file(afile, file_type, upgrade):
-
- try:
- tizenV = None
- for r,d,f in os.walk(afile):
- if (platform.system() != "Windows"):
- os.system("chmod -R 777 "+ r)
-
- inst_cmd = "python " + TCT_INSTALL_SCRIPT
- if upgrade:
- inst_cmd += " --upgrade"
-
- if file_type is WEB_TCT_TYPE or file_type is CSHARP_TCT_TYPE:
- tizenV = get_tizenV(afile)
- os.chdir(afile +"/tools")
- os.system(inst_cmd + " --tizen-version " + tizenV)
- os.chdir("../../")
- make_ver_file(str(afile), tizenV)
-
- if file_type is NATIVE_TCT_TYPE:
- tizenV = get_tizenV(afile)
- os.chdir(afile + "/TCT/native-tct/tools")
- os.system(inst_cmd + " --tizen-version " + tizenV)
- os.chdir("../../../../")
- make_ver_file(str(afile), tizenV)
-
- if file_type is TOOLS_TYPE:
- os.chdir(afile)
- os.system("python "+ TOOLS_INSTALL_SCRIPT)
- os.chdir("../")
- except Exception as ex:
- print (str(ex))
-
-
-def unpack_release_file(afile):
- if tarfile.is_tarfile(afile):
- tar = tarfile.open(afile)
- for tarinfo in tar:
- msg = tarinfo.name + " is " + str(tarinfo.size) + " bytes in size and is "
- if tarinfo.isreg():
- msg += "a regular file."
- elif tarinfo.isdir():
- msg += "a directory."
- else:
- msg += "something else."
- print msg
- tar.extractall()
- tar.close()
-
- if zipfile.is_zipfile(afile):
- zipf = zipfile.ZipFile(afile)
- zipf.extractall()
- zipf.close()
-
-def find_release_file(afile):
- web_tct_pa = re.compile(WEB_TCT_PATTERN, re.I)
- web_tct_match = web_tct_pa.match(afile)
-
- native_tct_pa = re.compile(NATIVE_TCT_PATTERN, re.I)
- native_tct_match = native_tct_pa.match(afile)
-
- csharp_tct_pa = re.compile(CSHARP_TCT_PATTERN, re.I)
- csharp_tct_match = csharp_tct_pa.match(afile)
-
- if web_tct_match:
- return WEB_TCT_TYPE
-
- if native_tct_match:
- return NATIVE_TCT_TYPE
-
- if csharp_tct_match:
- return CSHARP_TCT_TYPE
-
- tools_pa = re.compile(TOOLS_PATTERN, re.I)
- tools_match = tools_pa.match(afile)
- if tools_match :
- return TOOLS_TYPE
-
- return NORMAL_TYPE
-
-def is_archvie_file(afile):
- file_extension = get_file_extension(afile)
- if file_extension == ".gz" or file_extension == ".zip":
- return True
- else :
- return False
-
-def get_file_extension(afile):
- return os.path.splitext(afile)[1]
-
-def remove_readonly(func, path, excinfo):
- if (platform.system() != "Windows"):
- os.chmod(path, stat.S_IWRITE)
- func(path)
-
-def remove_dir_tree(remove_dir):
- try:
- shutil.rmtree(remove_dir, ignore_errors=False, onerror=remove_readonly)
- except Exception as e: ## if failed, report it back to the user ##
- print("[Delete Error] %s - %s." % (e.filename,e.strerror))
-
-def install_tct(upgrade=False):
- current_path = os.getcwd()
- filelist = os.listdir(current_path)
- for file in filelist :
- file_type = find_release_file(file)
- if file_type is not NORMAL_TYPE :
- if is_archvie_file(file) is True:
- unpack_release_file(file)
-
- filelist = os.listdir(current_path)
- for file in filelist:
- file_type = find_release_file(file)
- if file_type is not NORMAL_TYPE :
- if is_archvie_file(file) is False:
- install_release_file(file, file_type, upgrade)
-
-if len(sys.argv) > 1:
- if(sys.argv[1]) == 'clean':
- print("clean option is given")
- remove_dir_tree("/opt/tct")
- remove_dir_tree("/opt/tools")
- remove_dir_tree("/opt/testkit")
- elif(sys.argv[1]) == 'upgrade':
- print("upgrade option is given")
- install_tct(True)
- else:
- print("error:invalid option is given")
-else:
- install_tct(False)
+++ /dev/null
-[DEVICE]
-DEVICE_SUITE_TARGET_24=/opt/usr/media
-DEVICE_SUITE_TARGET_30=/opt/usr/home/owner/share
-DEVICE_USER_30=/opt/usr/home/owner
-DEVICE_EXECUTION_MODE_30=owner
-DEVICE_PHYSICAL_STORAGE_30=/home/owner/media
-DEVICE_ADMIN_USER_30=owner
-DEVICE_ADMIN_USER_APPS_ROOT_30=/opt/usr/globalapps
-DEVICE_OTHER_USER_APPS_ROOT_30=/opt/usr/home/owner/apps_rw
+++ /dev/null
-tct-tools_r4_rc1
+++ /dev/null
-#!/usr/bin/python
-
-import sys
-
-from tctmonkey.monkeywrapper import MonkeyWrapper
-from tctmonkey.devicemanager import DeviceManager
-from tctmonkey.monkeyworker import RandomExecutor
-from tctmonkey.monkeyworker import ReplayExecutor
-
-
-def main():
- wrapper = MonkeyWrapper()
- wrapper.parse_options(sys.argv)
-
- dmi = DeviceManager.getInstance()
-
- mExecutor = []
- for dev in dmi.getSdbDeviceList():
- th = None
- if wrapper.is_py_install():
- wrapper.python_install(dev.getDeviceId())
- if wrapper.is_random_mode():
- th = RandomExecutor(dev.getDeviceId(), wrapper)
- elif wrapper.is_replay_mode():
- th = ReplayExecutor(dev.getDeviceId(), wrapper)
-
- mExecutor.append(th)
-
- for thread in mExecutor:
- if thread:
- thread.start()
-
- for thread in mExecutor:
- if thread:
- thread.join()
-
-if __name__ == "__main__":
- main()
+++ /dev/null
-
-import os
-
-class Constants:
- LIB_DIR = "/opt/tools/dev_event/lib/"
- AGENT_PATH = "/opt/tools/dev_event/tctmonkey/fmbttizen-agent.py"
- UINPUT_AGENT_PATH = "/opt/tools/dev_event/tctmonkey/fmbtuinput.py"
- DUMP_DIR_PATH = "/opt/share/crash/dump/"
- RESULT_DIR = "/opt/monkey/result/"
- RECORD_FILE_NAME = "record_file"
- SDB_LS = "sdb -s %s shell ls -al"
- SDB_PUSH = "sdb -s %s push"
- SDB_SHELL = "sdb -s %s shell"
- SDB_ROOT_ON = "sdb -s %s root on"
- SDB_DEVICES = "sdb devices"
- SDB_START_SERVER = "sdb start-server"
- SDB_KILL_SERVER = "sdb kill-server"
- SDB_CONNECT = "sdb connect %s"
- SDB_PULL = "sdb -s %s pull"
- SDB_CAT_CONFIG = " cat %s"
- FILE_FOUND_SCRIPT = "[ -f %s ] && echo \"Found\" || echo \"Not Found\""
-
- @staticmethod
- def checkFileExists(aPath):
- if os.path.exists(aPath):
- return True
- else:
- return False
+++ /dev/null
-
-from sdbmanager import SdbManager
-
-class DeviceManager(object):
- INSTANCE = None
- devices = []
-
- def __init__(self):
- if DeviceManager.INSTANCE is not None:
- raise Exception ("DeviceManager instance already exists")
-
- @classmethod
- def getInstance(cls):
- if cls.INSTANCE is None:
- cls.INSTANCE = DeviceManager()
- if len(cls.INSTANCE.devices) < 1:
- cls.INSTANCE.loadDeviceList()
- return cls.INSTANCE
-
- def _updateConnDevice(self, connDevices):
- self._resetDevices()
-
- for dev in connDevices:
- self.devices.append(dev)
-
- def _resetDevices(self):
- listSize = len(self.devices)
- del self.devices[0:listSize]
-
- def getDeviceSize(self):
- return len(self.devices)
-
- def getSdbDeviceList(self):
- return self.devices
-
- def loadDeviceList(self):
- connDevices = []
- sdbOutLog = SdbManager.sdbDevices()
- devicesInfo = sdbOutLog.replace("List of devices attached", "")
- devList = devicesInfo.split('\n')
-
- for dev in devList:
- if len(dev) > 1:
- devInfoItem = dev.split('\t')
- devId = devInfoItem[0].rstrip()
- devType = devInfoItem[1].rstrip()
- devName = devInfoItem[2].rstrip()
- if not (devType == "unknown" or devType == "offline" \
- or devId == "unknown" or devId == "offline"):
- connDevices.append(SdbDevice(devId, devName, devType))
-
- if len(connDevices) > 0:
- self._updateConnDevice(connDevices)
- return True
- else:
- self._resetDevices()
- return False
-
-
-class SdbDevice:
- def __init__(self, devId, devName, devType):
- self.devId = devId
- self.devName = devName
- self.devType = devType
-
- def _printDevInfo(self):
- pass
-
- def getDeviceId(self):
- return self.devId
-
- def getDeviceName(self):
- return self.devName
-
- def getDeviceType(self):
- return self.devType
+++ /dev/null
-# fMBT, free Model Based Testing tool
-# Copyright (c) 2013, Intel Corporation.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms and conditions of the GNU Lesser General Public License,
-# version 2.1, 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 Lesser General Public License for
-# more details.
-#
-# You should have received a copy of the GNU Lesser General Public License along with
-# this program; if not, write to the Free Software Foundation, Inc.,
-# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
-
-import base64
-import cPickle
-import ctypes
-import fcntl
-import glob
-import os
-import platform
-import re
-import shlex
-import shutil
-import string
-import struct
-import subprocess
-import sys
-import termios
-import time
-import zlib
-
-import fmbtuinput
-
-fmbtuinput.refreshDeviceInfo()
-
-if "--debug" in sys.argv:
- g_debug = True
-else:
- g_debug = False
-
-try:
- _opt_keyboard = [a.split("=")[1] \
- for a in sys.argv if a.startswith("--keyboard=")][0]
-except IndexError:
- _opt_keyboard = None
-
-try:
- _opt_touch = [a.split("=")[1] \
- for a in sys.argv if a.startswith("--touch=")][0]
-except IndexError:
- _opt_touch = None
-
-try:
- _opt_mouse = [a.split("=")[1] \
- for a in sys.argv if a.startswith("--mouse=")][0]
-except IndexError:
- _opt_mouse = None
-
-keyboard_device = None
-touch_device = None
-mouse_device = None
-
-
-def openKeyboardDevice(keyboardSpec=None):
- keyboard_device = None
- if keyboardSpec == None:
- try:
- keyboard_device = openKeyboardDevice("sysrq")
- except IndexError:
- keyboard_device = openKeyboardDevice("virtual")
- elif keyboardSpec in (None, "virtual"):
- keyboard_device = fmbtuinput.Keyboard().create()
- elif keyboardSpec.startswith("file:"):
- keyboard_device = fmbtuinput.Keyboard().open(keyboardSpec.split(":",1)[1])
- elif keyboardSpec == "sysrq":
- keyboard_device = fmbtuinput.Keyboard().open(
- "/dev/input/" + re.findall(
- '[ =](event[0-9]+)\s',
- [i for i in devices.split("\n\n") if "sysrq" in i.lower()][0])[0])
- elif keyboardSpec == "disabled":
- keyboard_device = None
- return keyboard_device
-
-
-def openTouchDevice(touchSpec=None, fallback=None):
- touch_device = None
- if touchSpec == None:
- if fallback != None:
- return openTouchDevice(fallback)
- else:
- pass # will return None
- elif touchSpec.startswith("virtual"):
- inputResolution=re.findall("virtual:([0-9]*)x([0-9]*)", touchSpec)
- if inputResolution:
- maxX = int(inputResolution[0][0])
- maxY = int(inputResolution[0][1])
- else:
- maxX, maxY = None, None
- touch_device = fmbtuinput.Touch().create(maxX=maxX, maxY=maxY)
- elif touchSpec.startswith("file:") or touchSpec.startswith("name:"):
- touch_device = fmbtuinput.Touch().open(touchSpec.split(":",1)[1])
- elif touchSpec == "disabled":
- pass # will return None
- else:
- raise ValueError('invalid touch device "%s"' % (touchSpec,))
- return touch_device
-
-
-def openMouseDevice(mouseSpec=None, fallback=None):
- mouse_device = None
- if mouseSpec == None:
- if fallback != None:
- return openMouseDevice(fallback)
- else:
- pass # will return None
- elif mouseSpec.startswith("virtual:"):
- abs_or_rel = mouseSpec.split(":",1)[1]
- if abs_or_rel == "abs":
- absoluteMove = True
- elif abs_or_rel == "rel":
- absoluteMove = False
- else:
- raise ValueError('invalid mouse "%s"' % (mouseSpec,))
- mouse_device = fmbtuinput.Mouse(absoluteMove=absoluteMove).create()
- elif mouseSpec.startswith("file:") or mouseSpec.startswith("name:"):
- mouse_device = fmbtuinput.Mouse().open(mouseSpec.split(":",1)[1])
- elif mouseSpec == "disabled":
- pass # will return None
- else:
- raise ValueError('invalid mouse device "%s"' % (mouseSpec,))
- return mouse_device
-
-
-def debug(msg):
- if g_debug:
- sys.stdout.write("debug: %s\n" % (msg,))
- sys.stdout.flush()
-
-
-def error(msg, exitstatus=1):
- sys.stdout.write("fmbttizen-agent: %s\n" % (msg,))
- sys.stdout.flush()
- sys.exit(exitstatus)
-
-
-iAmRoot = (os.getuid() == 0)
-
-try:
- libc = ctypes.CDLL("libc.so.6")
- libX11 = ctypes.CDLL("libX11.so.6")
- libXtst = ctypes.CDLL("libXtst.so.6")
- g_Xavailable = True
- g_keyb = None # no need for virtual keyboard
-except OSError:
- g_Xavailable = False
-
-if g_Xavailable:
- class XImage(ctypes.Structure):
- _fields_ = [
- ('width' , ctypes.c_int),
- ('height' , ctypes.c_int),
- ('xoffset' , ctypes.c_int),
- ('format' , ctypes.c_int),
- ('data' , ctypes.c_void_p),
- ('byte_order' , ctypes.c_int),
- ('bitmap_unit' , ctypes.c_int),
- ('bitmap_bit_order' , ctypes.c_int),
- ('bitmap_pad' , ctypes.c_int),
- ('depth' , ctypes.c_int),
- ('bytes_per_line' , ctypes.c_int),
- ('bits_per_pixel' , ctypes.c_int)]
-
- libc.write.argtypes = [ctypes.c_int, ctypes.c_void_p, ctypes.c_size_t]
- libX11.XAllPlanes.restype = ctypes.c_ulong
- libX11.XGetImage.restype = ctypes.POINTER(XImage)
- libX11.XRootWindow.restype = ctypes.c_uint32
- libX11.XOpenDisplay.restype = ctypes.c_void_p
- libX11.XDefaultScreen.restype = ctypes.c_int
- libX11.XGetKeyboardMapping.restype = ctypes.POINTER(ctypes.c_uint32)
-
- # X11 constants, see Xlib.h
-
- X_CurrentTime = ctypes.c_ulong(0)
- X_False = ctypes.c_int(0)
- X_NULL = ctypes.c_void_p(0)
- X_True = ctypes.c_int(1)
- X_ZPixmap = ctypes.c_int(2)
- NoSymbol = 0
-
-# InputKeys contains key names known to input devices, see
-# linux/input.h or http://www.usb.org/developers/hidpage. The order is
-# significant, because keyCode = InputKeys.index(keyName).
-InputKeys = [
- "RESERVED", "ESC","1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
- "MINUS", "EQUAL", "BACKSPACE", "TAB",
- "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P",
- "LEFTBRACE", "RIGHTBRACE", "ENTER", "LEFTCTRL",
- "A", "S", "D", "F", "G", "H", "J", "K", "L",
- "SEMICOLON", "APOSTROPHE", "GRAVE", "LEFTSHIFT", "BACKSLASH",
- "Z", "X", "C", "V", "B", "N", "M",
- "COMMA", "DOT", "SLASH", "RIGHTSHIFT", "KPASTERISK", "LEFTALT",
- "SPACE", "CAPSLOCK",
- "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10",
- "NUMLOCK", "SCROLLLOCK",
- "KP7", "KP8", "KP9", "KPMINUS",
- "KP4", "KP5", "KP6", "KPPLUS",
- "KP1", "KP2", "KP3", "KP0", "KPDOT",
- "undefined0",
- "ZENKAKUHANKAKU", "102ND", "F11", "F12", "RO",
- "KATAKANA", "HIRAGANA", "HENKAN", "KATAKANAHIRAGANA", "MUHENKAN",
- "KPJPCOMMA", "KPENTER", "RIGHTCTRL", "KPSLASH", "SYSRQ", "RIGHTALT",
- "LINEFEED", "HOME", "UP", "PAGEUP", "LEFT", "RIGHT", "END", "DOWN",
- "PAGEDOWN", "INSERT", "DELETE", "MACRO",
- "MUTE", "VOLUMEDOWN", "VOLUMEUP",
- "POWER",
- "KPEQUAL", "KPPLUSMINUS", "PAUSE", "SCALE", "KPCOMMA", "HANGEUL",
- "HANGUEL", "HANJA", "YEN", "LEFTMETA", "RIGHTMETA", "COMPOSE"]
-
-_inputKeyNameToCode={}
-for c, n in enumerate(InputKeys):
- _inputKeyNameToCode[n] = c
-
-# See struct input_event in /usr/include/linux/input.h
-if platform.architecture()[0] == "32bit":
- _input_event = 'IIHHi'
-else:
- _input_event = 'QQHHi'
-
-# Event and keycodes are in input.h, too.
-_EV_KEY = 0x01
-_EV_ABS = 0x03
-_ABS_X = 0x00
-_ABS_Y = 0x01
-_ABS_MT_SLOT = 0x2f
-_ABS_MT_POSITION_X = 0x35
-_ABS_MT_POSITION_Y = 0x36
-_ABS_MT_TRACKING_ID = 0x39
-
-_BTN_MOUSE = 0x110
-
-# Set input device names (in /proc/bus/input/devices)
-# for pressing hardware keys.
-try:
- cpuinfo = file("/proc/cpuinfo").read()
-except:
- cpuinfo = ""
-
-def readDeviceInfo():
- global devices
- try:
- devices = file("/proc/bus/input/devices").read()
- except:
- devices = ""
-
-readDeviceInfo()
-kbInputDevFd = None
-
-if iAmRoot:
- debug("hardware detection uses generic defaults")
- # Unknown platform, guessing best possible defaults for devices
- _d = devices.split("\n\n")
- try:
- power_devname = re.findall('Name=\"([^"]*)\"', [i for i in _d if "power" in i.lower()][0])[0]
- except IndexError:
- power_devname = "gpio-keys"
-
- touch_device = None
- try:
- touch_device_f = "file:/dev/input/" + re.findall('[ =](event[0-9]+)\s', [i for i in _d if "touch" in i.lower()][0])[0]
- except IndexError:
- touch_device_f = None
- touch_device = openTouchDevice(_opt_touch, touch_device_f)
-
- mouse_device = None
- try:
- mouse_device_f = "file:/dev/input/" + re.findall('[ =](event[0-9]+)\s', [i for i in _d if "Mouse" in i][0])[0]
- except IndexError:
- mouse_device_f = None
- mouse_device = openMouseDevice(_opt_mouse, mouse_device_f)
-
- keyboard_device = openKeyboardDevice(_opt_keyboard)
-
- hwKeyDevice = {
- "POWER": power_devname,
- "VOLUMEUP": "gpio-keys",
- "VOLUMEDOWN": "gpio-keys",
- "HOME": "gpio-keys"
- }
-
- if isinstance(mouse_device, fmbtuinput.Mouse):
- time.sleep(1)
- mouse_device.move(-4096, -4096)
- mouse_device.setXY(0, 0)
-
- del _d
-
-if iAmRoot and g_debug:
- debug("touch device: %s" % (touch_device,))
- debug("mouse device: %s" % (mouse_device,))
- debug("keyb device: %s" % (keyboard_device,))
-
-if iAmRoot and _opt_keyboard and "keyboard_device" not in globals():
- # Use forced keyboard with any hardware type
- keyboard_device = openKeyboardDevice(_opt_keyboard)
-
-if "touch_device" in globals() and touch_device:
- mtInputDevFd = touch_device._fd
-
-if "keyboard_device" in globals() and keyboard_device:
- kbInputDevFd = keyboard_device._fd
-
-
-# Read input devices
-deviceToEventFile = {}
-for _l in devices.splitlines():
- if _l.startswith('N: Name="'): _device = _l.split('"')[1]
- elif _l.startswith("H: Handlers=") and "event" in _l:
- try: deviceToEventFile[_device] = "/dev/input/" + re.findall("(event[0-9]+)", _l)[0]
- except Exception, e: pass
-
-screenWidth = None
-screenHeight = None
-
-# Connect to X server, get root window size for screenshots
-display = None
-if g_Xavailable:
- def resetXConnection():
- global display, current_screen, root_window, X_AllPlanes
- if display != None:
- libX11.XCloseDisplay(display)
- display = libX11.XOpenDisplay(X_NULL)
- if display == 0 or display == None:
- error("cannot connect to X server")
- current_screen = libX11.XDefaultScreen(display)
- root_window = libX11.XRootWindow(display, current_screen)
- X_AllPlanes = libX11.XAllPlanes()
- resetXConnection()
-
- ref = ctypes.byref
- __rw = ctypes.c_uint(0)
- __x = ctypes.c_int(0)
- __y = ctypes.c_int(0)
- root_width = ctypes.c_uint(0)
- root_height = ctypes.c_uint(0)
- __bwidth = ctypes.c_uint(0)
- root_depth = ctypes.c_uint(0)
-
- libX11.XGetGeometry(display, root_window, ref(__rw), ref(__x), ref(__y),
- ref(root_width), ref(root_height), ref(__bwidth),
- ref(root_depth))
-
- cMinKeycode = ctypes.c_int(0)
- cMaxKeycode = ctypes.c_int(0)
- cKeysymsPerKeycode = ctypes.c_int(0)
- libX11.XDisplayKeycodes(display, ref(cMinKeycode), ref(cMaxKeycode))
- keysyms = libX11.XGetKeyboardMapping(display,
- cMinKeycode,
- (cMaxKeycode.value - cMinKeycode.value) + 1,
- ref(cKeysymsPerKeycode))
- shiftModifier = libX11.XKeysymToKeycode(display, libX11.XStringToKeysym("Shift_R"))
-
- screenWidth = root_width.value
- screenHeight = root_height.value
-
-def read_cmd():
- return sys.stdin.readline().strip()
-
-def _encode(obj):
- return base64.b64encode(cPickle.dumps(obj))
-
-def _decode(string):
- return cPickle.loads(base64.b64decode(string))
-
-def write_response(ok, value):
- if ok: p = "FMBTAGENT OK "
- else: p = "FMBTAGENT ERROR "
- if not g_debug:
- response = "%s%s\n" % (p, _encode(value))
- else:
- response = "%s%s\n" % (p, value)
- sys.stdout.write(response)
- sys.stdout.flush()
-
-def sendHwTap(x, y, button):
- try:
- if touch_device:
- touch_device.tap(x, y)
- else:
- mouse_device.tap(x, y, button)
- return True, None
- except Exception, e:
- return False, str(e)
-
-def sendHwMove(x, y):
- try:
- if touch_device:
- touch_device.move(x, y)
- else:
- mouse_device.move(x, y)
- return True, None
- except Exception, e:
- return False, str(e)
-
-def sendRelMove(x, y):
- try:
- mouse_device.setXY(0,0)
- mouse_device.move(x, y)
- mouse_device.setXY(0,0)
- return True, None
- except Exception, e:
- return False, str(e)
-
-def sendHwFingerDown(x, y, button):
- try:
- if touch_device:
- touch_device.pressFinger(button, x, y)
- else:
- mouse_device.move(x, y)
- mouse_device.press(button)
- return True, None
- except Exception, e:
- return False, str(e)
-
-def sendHwFingerUp(x, y, button):
- try:
- if touch_device:
- touch_device.releaseFinger(button)
- else:
- mouse_device.move(x, y)
- mouse_device.release(button)
- return True, None
- except Exception, e:
- return False, str(e)
-
-def sendHwKey(keyName, delayBeforePress, delayBeforeRelease):
- keyName = keyName.upper()
- if keyName.startswith("KEY_"):
- keyName = keyName.lstrip("KEY_")
- fd = None
- closeFd = False
- try:
- # Explicit IO device defined for the key?
- inputDevice = deviceToEventFile[hwKeyDevice[keyName]]
- except:
- # Fall back to giving input with keyboard - given that there is one
- if not kbInputDevFd:
- return False, 'No input device for key "%s"' % (keyName,)
- fd = kbInputDevFd
- try: keyCode = _inputKeyNameToCode[keyName]
- except KeyError:
- try: keyCode = fmbtuinput.toKeyCode(keyName)
- except ValueError: return False, 'No keycode for key "%s"' % (keyName,)
- try:
- if not fd:
- fd = os.open(inputDevice, os.O_WRONLY | os.O_NONBLOCK)
- closeFd = True
- except: return False, 'Unable to open input device "%s" for writing' % (inputDevice,)
- if delayBeforePress > 0: time.sleep(delayBeforePress)
- if delayBeforePress >= 0:
- if os.write(fd, struct.pack(_input_event, int(time.time()), 0, _EV_KEY, keyCode, 1)) > 0:
- os.write(fd, struct.pack(_input_event, 0, 0, 0, 0, 0))
- if delayBeforeRelease > 0: time.sleep(delayBeforeRelease)
- if delayBeforeRelease >= 0:
- if os.write(fd, struct.pack(_input_event, int(time.time()), 0, _EV_KEY, keyCode, 0)) > 0:
- os.write(fd, struct.pack(_input_event, 0, 0, 0, 0, 0))
- if closeFd:
- os.close(fd)
- return True, None
-
-def specialCharToXString(c):
- c2s = {'\n': "Return",
- ' ': "space", '!': "exclam", '"': "quotedbl",
- '#': "numbersign", '$': "dollar", '%': "percent",
- '&': "ampersand", "'": "apostrophe",
- '(': "parenleft", ')': "parenright", '*': "asterisk",
- '+': "plus", '-': "minus", '.': "period", '/': "slash",
- ':': "colon", ';': "semicolon", '<': "less", '=': "equal",
- '>': "greater", '?': "question", '@': "at",
- '_': "underscore"}
- return c2s.get(c, c)
-
-def specialCharToUsKeys(c):
- # character -> ([modifier, [modifier...]] keycode)
- c2s = {'\n': ("KEY_ENTER",),
- ' ': ("KEY_SPACE",),
- '`': ("KEY_GRAVE",), '~': ("KEY_LEFTSHIFT", "KEY_GRAVE"),
- '!': ("KEY_LEFTSHIFT", "KEY_1"),
- '@': ("KEY_LEFTSHIFT", "KEY_2"),
- '#': ("KEY_LEFTSHIFT", "KEY_3"),
- '$': ("KEY_LEFTSHIFT", "KEY_4"),
- '%': ("KEY_LEFTSHIFT", "KEY_5"),
- '^': ("KEY_LEFTSHIFT", "KEY_6"),
- '&': ("KEY_LEFTSHIFT", "KEY_7"),
- '*': ("KEY_LEFTSHIFT", "KEY_8"),
- '(': ("KEY_LEFTSHIFT", "KEY_9"),
- ')': ("KEY_LEFTSHIFT", "KEY_0"),
- '-': ("KEY_MINUS",), '_': ("KEY_LEFTSHIFT", "KEY_MINUS"),
- '=': ("KEY_EQUAL",), '+': ("KEY_LEFTSHIFT", "KEY_EQUAL"),
- '\t': ("KEY_TAB",),
- '[': ("KEY_LEFTBRACE",), '{': ("KEY_LEFTSHIFT", "KEY_LEFTBRACE"),
- ']': ("KEY_RIGHTBRACE",), '}': ("KEY_LEFTSHIFT", "KEY_RIGHTBRACE"),
- ';': ("KEY_SEMICOLON",), ':': ("KEY_LEFTSHIFT", "KEY_SEMICOLON"),
- "'": ("KEY_APOSTROPHE",), '"': ("KEY_LEFTSHIFT", "KEY_APOSTROPHE"),
- '\\': ("KEY_BACKSLASH",), '|': ("KEY_LEFTSHIFT", "KEY_BACKSLASH"),
- ',': ("KEY_COMMA",), '<': ("KEY_LEFTSHIFT", "KEY_COMMA"),
- '.': ("KEY_DOT",), '>': ("KEY_LEFTSHIFT", "KEY_DOT"),
- '/': ("KEY_SLASH",), '?': ("KEY_LEFTSHIFT", "KEY_SLASH"),
- }
- return c2s.get(c, c)
-
-mtEvents = {} # slot -> (tracking_id, x, y)
-
-def inputEventSend(inputDevFd, eventType, event, param):
- t = time.time()
- tsec = int(t)
- tusec = int(1000000*(t-tsec))
- os.write(inputDevFd, struct.pack(_input_event,
- tsec, tusec, eventType, event, param))
-
-def mtEventSend(eventType, event, param):
- """multitouch device event"""
- return inputEventSend(mtInputDevFd, eventType, event, param)
-
-def mtGestureStart(x, y):
- mtGestureStart.trackingId += 1
- trackingId = mtGestureStart.trackingId
-
- for freeSlot in xrange(16):
- if not freeSlot in mtEvents: break
- else: raise ValueError("No free multitouch event slots available")
-
- mtEvents[freeSlot] = [trackingId, x, y]
-
- mtEventSend(_EV_ABS, _ABS_MT_SLOT, freeSlot)
- mtEventSend(_EV_ABS, _ABS_MT_TRACKING_ID, trackingId)
- mtEventSend(_EV_ABS, _ABS_MT_POSITION_X, x)
- mtEventSend(_EV_ABS, _ABS_MT_POSITION_Y, y)
- mtEventSend(_EV_ABS, _ABS_X, x)
- mtEventSend(_EV_ABS, _ABS_Y, y)
- mtEventSend(0, 0, 0) # SYNC
- return freeSlot
-mtGestureStart.trackingId = 0
-
-def mtGestureMove(slot, x, y):
- if x == mtEvents[slot][1] and y == mtEvents[slot][2]: return
- mtEventSend(_EV_ABS, _ABS_MT_SLOT, slot)
- mtEventSend(_EV_ABS, _ABS_MT_TRACKING_ID, mtEvents[slot][0])
- if x != mtEvents[slot][1] and 0 <= x <= root_width:
- mtEventSend(_EV_ABS, _ABS_MT_POSITION_X, x)
- mtEvents[slot][1] = x
- if y != mtEvents[slot][2] and 0 <= y <= root_height:
- mtEventSend(_EV_ABS, _ABS_MT_POSITION_Y, y)
- mtEvents[slot][2] = y
- if 0 <= x <= root_width:
- mtEventSend(_EV_ABS, _ABS_X, x)
- if 0 <= y <= root_height:
- mtEventSend(_EV_ABS, _ABS_Y, y)
- mtEventSend(0, 0, 0)
-
-def mtGestureEnd(slot):
- mtEventSend(_EV_ABS, _ABS_MT_SLOT, slot)
- mtEventSend(_EV_ABS, _ABS_MT_TRACKING_ID, -1)
- mtEventSend(0, 0, 0) # SYNC
- del mtEvents[slot]
-
-def mtLinearGesture(listOfStartEndPoints, duration, movePoints, sleepBeforeMove=0, sleepAfterMove=0):
- # listOfStartEndPoints: [ [(finger1startX, finger1startY), (finger1endX, finger1endY)],
- # [(finger2startX, finger2startY), (finger2endX, finger2endY)], ...]
- startPoints = [startEnd[0] for startEnd in listOfStartEndPoints]
- xDist = [startEnd[1][0] - startEnd[0][0] for startEnd in listOfStartEndPoints]
- yDist = [startEnd[1][1] - startEnd[0][1] for startEnd in listOfStartEndPoints]
- movePointsF = float(movePoints)
- fingers = []
- for (x, y) in startPoints:
- fingers.append(mtGestureStart(x, y))
-
- if sleepBeforeMove > 0: time.sleep(sleepBeforeMove)
-
- if movePoints > 0:
- intermediateSleep = float(duration) / movePoints
- for i in xrange(1, movePoints + 1):
- if intermediateSleep > 0:
- time.sleep(intermediateSleep)
- for fingerIndex, finger in enumerate(fingers):
- mtGestureMove(finger,
- startPoints[fingerIndex][0] + int(xDist[fingerIndex]*i/movePointsF),
- startPoints[fingerIndex][1] + int(yDist[fingerIndex]*i/movePointsF))
-
- if sleepAfterMove > 0: time.sleep(sleepAfterMove)
-
- for finger in fingers:
- mtGestureEnd(finger)
- return True, None
-
-def typeCharX(origChar):
- modifiers = []
- c = specialCharToXString(origChar)
- keysym = libX11.XStringToKeysym(c)
- if keysym == NoSymbol:
- return False
- keycode = libX11.XKeysymToKeycode(display, keysym)
-
- first = (keycode - cMinKeycode.value) * cKeysymsPerKeycode.value
-
- try:
- if chr(keysyms[first + 1]) == origChar:
- modifiers.append(shiftModifier)
- except ValueError: pass
-
- for m in modifiers:
- libXtst.XTestFakeKeyEvent(display, m, X_True, X_CurrentTime)
-
- libXtst.XTestFakeKeyEvent(display, keycode, X_True, X_CurrentTime)
- libXtst.XTestFakeKeyEvent(display, keycode, X_False, X_CurrentTime)
-
- for m in modifiers[::-1]:
- libXtst.XTestFakeKeyEvent(display, m, X_False, X_CurrentTime)
- return True
-
-def typeCharHw(origChar):
- for c in origChar:
- modifiers = []
- keyCode = None
- c = specialCharToUsKeys(c)
- if isinstance(c, tuple):
- modifiers = c[:-1]
- keyCode = c[-1]
- elif c in string.uppercase:
- modifiers = ["KEY_LEFTSHIFT"]
- keyCode = "KEY_" + c
- elif c in string.lowercase or c in string.digits:
- keyCode = "KEY_" + c.upper()
- else:
- # do not know how to type the character
- pass
- if keyCode:
- for m in modifiers:
- keyboard_device.press(m)
- keyboard_device.tap(keyCode)
- for m in modifiers[::-1]:
- keyboard_device.release(m)
- return True
-
-if g_Xavailable:
- typeChar = typeCharX
-else:
- typeChar = typeCharHw
-
-def typeSequence(s, delayBetweenChars=0):
- skipped = []
- for c in s:
- if not typeChar(c):
- skipped.append(c)
- if delayBetweenChars != 0:
- time.sleep(delayBetweenChars)
- if skipped: return False, skipped
- else: return True, skipped
-
-def takeScreenshotOnX():
- image_p = libX11.XGetImage(display, root_window,
- 0, 0, root_width, root_height,
- X_AllPlanes, X_ZPixmap)
- image = image_p[0]
- # FMBTRAWX11 image format header:
- # FMBTRAWX11 [width] [height] [color depth] [bits per pixel]<linefeed>
- # Binary data
- rawfmbt_header = "FMBTRAWX11 %d %d %d %d\n" % (
- image.width, image.height, root_depth.value, image.bits_per_pixel)
- rawfmbt_data = ctypes.string_at(image.data, image.height * image.bytes_per_line)
- compressed_image = rawfmbt_header + zlib.compress(rawfmbt_data, 3)
- libX11.XDestroyImage(image_p)
- return True, compressed_image
-
-def westonTakeScreenshotRoot(retry=2):
- if westonTakeScreenshotRoot.ssFilenames == None:
- westonTakeScreenshotRoot.ssFilenames = findWestonScreenshotFilenames()
- if not westonTakeScreenshotRoot.ssFilenames:
- return False, "cannot find weston screenshot directory"
- try:
- for ssFilename in westonTakeScreenshotRoot.ssFilenames:
- if os.access(ssFilename, os.R_OK):
- os.remove(ssFilename)
- keyboard_device.press("KEY_LEFTMETA")
- keyboard_device.tap("s")
- keyboard_device.release("KEY_LEFTMETA")
- time.sleep(0.5)
- # find which screenshot file got created?
- for ssFilename in westonTakeScreenshotRoot.ssFilenames:
- if os.access(ssFilename, os.R_OK):
- break
- else:
- if retry > 0:
- return westonTakeScreenshotRoot(retry-1)
- else:
- return False, "weston did not create any of files %s" % (
- westonTakeScreenshotRoot.ssFilenames,)
- # wait for the screenshot writer to finish
- writerPid = fuser(ssFilename)
- if writerPid != None:
- time.sleep(0.1)
- while fuser(ssFilename, [writerPid]) != None:
- time.sleep(0.1)
- shutil.move(ssFilename, "/tmp/screenshot.png")
- os.chmod("/tmp/screenshot.png", 0666)
- except Exception, e:
- return False, str(e)
- return True, None
-westonTakeScreenshotRoot.ssFilenames = None
-
-def takeScreenshotOnWeston():
- if iAmRoot:
- rv, status = westonTakeScreenshotRoot()
- else:
- rv, status = subAgentCommand("root", "tizen", "ss weston-root")
- if rv == False:
- return rv, status
- return True, file("/tmp/screenshot.png").read()
-
-def fuser(filename, usualSuspects=None):
- """Returns the pid of a user of given file, or None"""
- filepath = os.path.realpath(filename)
- if not os.access(filepath, os.R_OK):
- raise ValueError('No such file: "%s"' % (filename,))
- if usualSuspects == None:
- procFds = glob.glob("/proc/[1-9][0-9][0-9]*/fd/*")
- else:
- procFds = []
- for pid in usualSuspects:
- procFds.extend(glob.glob("/proc/%s/fd/*" % (pid,)))
- for symlink in procFds:
- try:
- if os.path.realpath(symlink) == filepath:
- return int(symlink.split('/')[2])
- except OSError:
- pass
-
-def findWestonScreenshotFilenames():
- # find weston cwd
- dirs = []
- for exe in glob.glob("/proc/[1-9][0-9][0-9]*/exe"):
- try:
- if os.path.realpath(exe) == "/usr/bin/weston":
- dirs.append(os.path.realpath(os.path.dirname(exe) + "/cwd"))
- except OSError:
- pass
- return [d + "/wayland-screenshot.png" for d in sorted(set(dirs))]
-
-if g_Xavailable:
- takeScreenshot = takeScreenshotOnX
-else:
- takeScreenshot = takeScreenshotOnWeston
-
-def shellSOE(command, asyncStatus, asyncOut, asyncError, usePty):
- if usePty:
- command = '''python -c "import pty; pty.spawn(%s)" ''' % (repr(shlex.split(command)),),
- if (asyncStatus, asyncOut, asyncError) != (None, None, None):
- # prepare for decoupled asynchronous execution
- if asyncStatus == None: asyncStatus = "/dev/null"
- if asyncOut == None: asyncOut = "/dev/null"
- if asyncError == None: asyncError = "/dev/null"
- try:
- stdinFile = file("/dev/null", "r")
- stdoutFile = file(asyncOut, "a+")
- stderrFile = file(asyncError, "a+", 0)
- statusFile = file(asyncStatus, "a+")
- except IOError, e:
- return False, (None, None, e)
- try:
- if os.fork() > 0:
- # parent returns after successful fork, there no
- # direct visibility to async child process beyond this
- # point.
- stdinFile.close()
- stdoutFile.close()
- stderrFile.close()
- statusFile.close()
- return True, (0, None, None) # async parent finishes here
- except OSError, e:
- return False, (None, None, e)
- os.setsid()
- else:
- stdinFile = subprocess.PIPE
- stdoutFile = subprocess.PIPE
- stderrFile = subprocess.PIPE
- try:
- p = subprocess.Popen(command, shell=True,
- stdin=stdinFile,
- stdout=stdoutFile,
- stderr=stderrFile,
- close_fds=True)
- except Exception, e:
- return False, (None, None, e)
- if asyncStatus == None and asyncOut == None and asyncError == None:
- # synchronous execution, read stdout and stderr
- out, err = p.communicate()
- else:
- # asynchronous execution, store status to file
- statusFile.write(str(p.wait()) + "\n")
- statusFile.close()
- out, err = None, None
- sys.exit(0) # async child finishes here
- return True, (p.returncode, out, err)
-
-def waitOutput(nonblockingFd, acceptedOutputs, timeout, pollInterval=0.1):
- start = time.time()
- endTime = start + timeout
- s = ""
- try: s += nonblockingFd.read()
- except IOError: pass
- foundOutputs = [ao for ao in acceptedOutputs if ao in s]
- while len(foundOutputs) == 0 and time.time() < endTime:
- time.sleep(pollInterval)
- try: s += nonblockingFd.read()
- except IOError: pass
- foundOutputs = [ao for ao in acceptedOutputs if ao in s]
- return foundOutputs, s
-
-_subAgents = {}
-def openSubAgent(username, password):
- p = subprocess.Popen('''python -c 'import pty; pty.spawn(["su", "-c", "python /tmp/fmbttizen-agent.py --sub-agent", "-", "%s"])' ''' % (username,),
- shell=True,
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
-
- # Read in non-blocking mode to ensure agent starts correctly
- fl = fcntl.fcntl(p.stdout.fileno(), fcntl.F_GETFL)
- fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
-
- output2 = ""
- seenPrompts, output1 = waitOutput(p.stdout, ["Password:", "FMBTAGENT"], 5.0)
- if "Password:" in seenPrompts:
- p.stdin.write(password + "\r")
- output1 = ""
- seenPrompts, output2 = waitOutput(p.stdout, ["FMBTAGENT"], 5.0)
-
- if not "FMBTAGENT" in seenPrompts:
- p.terminate()
- return (None, 'fMBT agent with username "%s" does not answer.' % (username,),
- output1 + output2)
-
- # Agent is alive, continue in blocking mode
- fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, fl)
-
- return p, "", ""
-
-def subAgentCommand(username, password, cmd):
- if not username in _subAgents:
- process, output, error = openSubAgent(username, password)
- if process == None:
- return None, (-1, output, error)
- else:
- _subAgents[username] = process
- p = _subAgents[username]
- p.stdin.write(cmd + "\r")
- p.stdin.flush()
- answer = p.stdout.readline().rstrip()
- if answer.startswith("FMBTAGENT OK "):
- return True, _decode(answer[len("FMBTAGENT OK "):])
- else:
- return False, _decode(answer[len("FMBTAGENT ERROR "):])
-
-def closeSubAgents():
- for username in _subAgents:
- subAgentCommand(username, None, "quit")
-
-if __name__ == "__main__":
- try:
- origTermAttrs = termios.tcgetattr(sys.stdin.fileno())
- hasTerminal = True
- except termios.error:
- origTermAttrs = None
- hasTerminal = False
- if hasTerminal and not "--keep-echo" in sys.argv and not "--debug" in sys.argv:
- # Disable terminal echo
- newTermAttrs = origTermAttrs
- newTermAttrs[3] = origTermAttrs[3] & ~termios.ECHO
- termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, newTermAttrs)
-
- if "--no-x" in sys.argv:
- debug("X disabled")
- g_Xavailable = False
-
- platformInfo = {}
- platformInfo["input devices"] = fmbtuinput._g_deviceNames.keys()
-
- # Send version number, enter main loop
- write_response(True, platformInfo)
- cmd = read_cmd()
- while cmd:
- if cmd.startswith("bl "): # set display backlight time
- if iAmRoot:
- timeout = int(cmd[3:].strip())
- try:
- file("/opt/var/kdb/db/setting/lcd_backlight_normal","wb").write(struct.pack("ii",0x29,timeout))
- write_response(True, None)
- except Exception, e: write_response(False, e)
- else:
- write_response(*subAgentCommand("root", "tizen", cmd))
- elif cmd.startswith("er "): # event recorder
- if iAmRoot:
- cmd, arg = cmd.split(" ", 1)
- if arg.startswith("start "):
- filterOpts = _decode(arg.split()[1])
- if touch_device:
- filterOpts["touchScreen"] = touch_device
- fmbtuinput.startQueueingEvents(filterOpts)
- write_response(True, None)
- elif arg == "stop":
- events = fmbtuinput.stopQueueingEvents()
- write_response(True, None)
- elif arg == "fetch":
- events = fmbtuinput.fetchQueuedEvents()
- write_response(True, events)
- else:
- write_response(*subAgentCommand("root", "tizen", cmd))
- elif cmd.startswith("gd"): # get display status
- try:
- p = subprocess.Popen(['/usr/bin/xset', 'q'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- out, err = p.communicate()
- if "Monitor is Off" in out: write_response(True, "Off")
- elif "Monitor is On" in out: write_response(True, "On")
- else: write_response(False, err)
- except Exception, e: write_response(False, e)
- elif cmd.startswith("tm "): # touch move(x, y)
- xs, ys = cmd[3:].strip().split()
- if g_Xavailable:
- libXtst.XTestFakeMotionEvent(display, current_screen, int(xs), int(ys), X_CurrentTime)
- libX11.XFlush(display)
- else:
- if iAmRoot: rv, msg = sendHwMove(int(xs), int(ys))
- else: rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(True, None)
- elif cmd.startswith("tr "): # relative move(x, y)
- xd, yd = cmd[3:].strip().split()
- if iAmRoot: rv, msg = sendRelMove(int(xd), int(yd))
- else: rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(True, None)
- elif cmd.startswith("tt "): # touch tap(x, y, button)
- x, y, button = [int(i) for i in cmd[3:].strip().split()]
- if g_Xavailable:
- libXtst.XTestFakeMotionEvent(display, current_screen, x, y, X_CurrentTime)
- libXtst.XTestFakeButtonEvent(display, button, X_True, X_CurrentTime)
- libXtst.XTestFakeButtonEvent(display, button, X_False, X_CurrentTime)
- libX11.XFlush(display)
- rv, msg = True, None
- else:
- if iAmRoot: rv, msg = sendHwTap(x, y, button-1)
- else: rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(rv, msg)
- elif cmd.startswith("td "): # touch down(x, y, button)
- xs, ys, button = cmd[3:].strip().split()
- button = int(button)
- if g_Xavailable:
- libXtst.XTestFakeMotionEvent(display, current_screen, int(xs), int(ys), X_CurrentTime)
- libXtst.XTestFakeButtonEvent(display, button, X_True, X_CurrentTime)
- libX11.XFlush(display)
- else:
- if iAmRoot: rv, msg = sendHwFingerDown(int(xs), int(ys), button-1)
- else: rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(True, None)
- elif cmd.startswith("tu "): # touch up(x, y, button)
- xs, ys, button = cmd[3:].strip().split()
- button = int(button)
- if g_Xavailable:
- libXtst.XTestFakeMotionEvent(display, current_screen, int(xs), int(ys), X_CurrentTime)
- libXtst.XTestFakeButtonEvent(display, button, X_False, X_CurrentTime)
- libX11.XFlush(display)
- else:
- if iAmRoot: rv, msg = sendHwFingerUp(int(xs), int(ys), button-1)
- else: rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(True, None)
- elif cmd.startswith("kd "): # hw key down
- if iAmRoot: rv, msg = sendHwKey(cmd[3:], 0, -1)
- else: rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(rv, msg)
- elif cmd.startswith("kn"): # list input key names
- if "hwKeyDevice" in globals():
- hk = hwKeyDevice.keys()
- else:
- hk = []
- if "keyboard_device" in globals():
- ik = InputKeys
- else:
- ik = []
- write_response(True, sorted(ik + hk))
- elif cmd.startswith("kp "): # hw key press
- if iAmRoot: rv, msg = sendHwKey(cmd[3:], 0, 0)
- else: rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(rv, msg)
- elif cmd.startswith("ku "): # hw key up
- if iAmRoot: rv, msg = sendHwKey(cmd[3:], -1, 0)
- else: rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(rv, msg)
- elif cmd.startswith("kt "): # send x events
- if g_Xavailable:
- rv, skippedSymbols = typeSequence(_decode(cmd[3:]))
- libX11.XFlush(display)
- elif iAmRoot:
- rv, skippedSymbols = typeSequence(_decode(cmd[3:]),
- delayBetweenChars=0.05)
- else:
- rv, skippedSymbols = subAgentCommand("root", "tizen", cmd)
- write_response(rv, skippedSymbols)
- elif cmd.startswith("ml "): # send multitouch linear gesture
- if iAmRoot:
- rv, _ = mtLinearGesture(*_decode(cmd[3:]))
- else:
- rv, _ = subAgentCommand("root", "tizen", cmd)
- write_response(rv, _)
- elif cmd.startswith("ss"): # save screenshot
- if "R" in cmd.split() and g_Xavailable:
- resetXConnection()
- if "weston-root" in cmd.split(): # do Weston root part only
- write_response(*westonTakeScreenshotRoot())
- else:
- rv, compressedImage = takeScreenshot()
- write_response(rv, compressedImage)
- elif cmd.startswith("sd "): # set screen dimensions (width and height)
- _sw, _sh = cmd[3:].split()
- screenWidth, screenHeight = int(_sw), int(_sh)
- if iAmRoot:
- if touch_device:
- touch_device.setScreenSize((screenWidth, screenHeight))
- rv, msg = True, None
- else:
- rv, msg = True, "no touch device"
- else:
- rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(rv, msg)
- elif cmd.startswith("sa "): # set screenshot rotation angle (degrees)
- if iAmRoot:
- if touch_device:
- _sa = int(cmd[3:])
- # compensate it with opposite rotation
- touch_device.setScreenAngle(-_sa)
- rv, msg = True, None
- else:
- rv, msg = True, "no touch device"
- else:
- rv, msg = subAgentCommand("root", "tizen", cmd)
- write_response(rv, msg)
- elif cmd.startswith("es "): # execute shell
- shellCmd, username, password, asyncStatus, asyncOut, asyncError, usePty = _decode(cmd[3:])
- if username == "":
- rv, soe = shellSOE(shellCmd, asyncStatus, asyncOut, asyncError, usePty)
- else:
- rv, soe = subAgentCommand(username, password,
- "es " + _encode((shellCmd, "", "", asyncStatus, asyncOut, asyncError, usePty)))
- write_response(rv, soe)
- elif cmd.startswith("quit"): # quit
- write_response(rv, True)
- break
- else:
- write_response(False, 'Unknown command: "%s"' % (cmd,))
- cmd = read_cmd()
-
- closeSubAgents()
-
- if g_Xavailable:
- libX11.XCloseDisplay(display)
-
- if hasTerminal:
- termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, origTermAttrs)
+++ /dev/null
-# fMBT, free Model Based Testing tool
-# Copyright (c) 2013, Intel Corporation.
-#
-# This program is free software; you can redistribute it and/or modify it
-# under the terms and conditions of the GNU Lesser General Public License,
-# version 2.1, 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 Lesser General Public
-# License for more details.
-#
-# You should have received a copy of the GNU Lesser General Public
-# License along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA
-# 02110-1301 USA.
-
-# pylint: disable = C0103, C0111, R0913
-
-"""
-This library offers Python interface for Linux uinput system.
-
-Mouse, Touch and Keyboard classes can be used for
-creating new mouse, touch and keyboard devices and synthesizing user
-inputs through those devices.
-"""
-
-cmdline_usage = """
-Usage: python fmbtuinput.py -p <list-of-input-device-files>
-
-Example: python fmbtuinput.py -p /dev/input/event*
-"""
-
-import array
-import glob
-import os
-import platform
-import re
-import struct
-import thread
-import time
-import Queue
-
-if os.name != "nt":
- import fcntl
-else:
- class fcntl:
- def __getattr__(self, attr):
- raise NotImplementedError("%s not available on Windows" % (attr,))
-
-# See /usr/include/linux/input.h
-eventTypes = {
- "EV_SYN": 0x00,
- "EV_KEY": 0x01,
- "EV_REL": 0x02,
- "EV_ABS": 0x03,
- "EV_MSC": 0x04,
- "EV_SW": 0x05,
- "EV_LED": 0x11,
- "EV_SND": 0x12,
- "EV_REP": 0x14,
- "EV_FF": 0x15,
- "EV_PWR": 0x16,
- "EV_FF_STATUS": 0x17,
- "EV_MAX": 0x1f,
- }
-
-keyCodes = {
- "KEY_RESERVED": 0,
- "KEY_ESC": 1,
- "KEY_1": 2,
- "KEY_2": 3,
- "KEY_3": 4,
- "KEY_4": 5,
- "KEY_5": 6,
- "KEY_6": 7,
- "KEY_7": 8,
- "KEY_8": 9,
- "KEY_9": 10,
- "KEY_0": 11,
- "KEY_MINUS": 12,
- "KEY_EQUAL": 13,
- "KEY_BACKSPACE": 14,
- "KEY_TAB": 15,
- "KEY_Q": 16,
- "KEY_W": 17,
- "KEY_E": 18,
- "KEY_R": 19,
- "KEY_T": 20,
- "KEY_Y": 21,
- "KEY_U": 22,
- "KEY_I": 23,
- "KEY_O": 24,
- "KEY_P": 25,
- "KEY_LEFTBRACE": 26,
- "KEY_RIGHTBRACE": 27,
- "KEY_ENTER": 28,
- "KEY_LEFTCTRL": 29,
- "KEY_A": 30,
- "KEY_S": 31,
- "KEY_D": 32,
- "KEY_F": 33,
- "KEY_G": 34,
- "KEY_H": 35,
- "KEY_J": 36,
- "KEY_K": 37,
- "KEY_L": 38,
- "KEY_SEMICOLON": 39,
- "KEY_APOSTROPHE": 40,
- "KEY_GRAVE": 41,
- "KEY_LEFTSHIFT": 42,
- "KEY_BACKSLASH": 43,
- "KEY_Z": 44,
- "KEY_X": 45,
- "KEY_C": 46,
- "KEY_V": 47,
- "KEY_B": 48,
- "KEY_N": 49,
- "KEY_M": 50,
- "KEY_COMMA": 51,
- "KEY_DOT": 52,
- "KEY_SLASH": 53,
- "KEY_RIGHTSHIFT": 54,
- "KEY_KPASTERISK": 55,
- "KEY_LEFTALT": 56,
- "KEY_SPACE": 57,
- "KEY_CAPSLOCK": 58,
- "KEY_F1": 59,
- "KEY_F2": 60,
- "KEY_F3": 61,
- "KEY_F4": 62,
- "KEY_F5": 63,
- "KEY_F6": 64,
- "KEY_F7": 65,
- "KEY_F8": 66,
- "KEY_F9": 67,
- "KEY_F10": 68,
- "KEY_NUMLOCK": 69,
- "KEY_SCROLLLOCK": 70,
- "KEY_KP7": 71,
- "KEY_KP8": 72,
- "KEY_KP9": 73,
- "KEY_KPMINUS": 74,
- "KEY_KP4": 75,
- "KEY_KP5": 76,
- "KEY_KP6": 77,
- "KEY_KPPLUS": 78,
- "KEY_KP1": 79,
- "KEY_KP2": 80,
- "KEY_KP3": 81,
- "KEY_KP0": 82,
- "KEY_KPDOT": 83,
-
- "KEY_ZENKAKUHANKAKU": 85,
- "KEY_102ND": 86,
- "KEY_F11": 87,
- "KEY_F12": 88,
- "KEY_RO": 89,
- "KEY_KATAKANA": 90,
- "KEY_HIRAGANA": 91,
- "KEY_HENKAN": 92,
- "KEY_KATAKANAHIRAGANA": 93,
- "KEY_MUHENKAN": 94,
- "KEY_KPJPCOMMA": 95,
- "KEY_KPENTER": 96,
- "KEY_RIGHTCTRL": 97,
- "KEY_KPSLASH": 98,
- "KEY_SYSRQ": 99,
- "KEY_RIGHTALT": 100,
- "KEY_LINEFEED": 101,
- "KEY_HOME": 102,
- "KEY_UP": 103,
- "KEY_PAGEUP": 104,
- "KEY_LEFT": 105,
- "KEY_RIGHT": 106,
- "KEY_END": 107,
- "KEY_DOWN": 108,
- "KEY_PAGEDOWN": 109,
- "KEY_INSERT": 110,
- "KEY_DELETE": 111,
- "KEY_MACRO": 112,
- "KEY_MUTE": 113,
- "KEY_VOLUMEDOWN": 114,
- "KEY_VOLUMEUP": 115,
- "KEY_POWER": 116,
- "KEY_KPEQUAL": 117,
- "KEY_KPPLUSMINUS": 118,
- "KEY_PAUSE": 119,
- "KEY_SCALE": 120,
-
- "KEY_KPCOMMA": 121,
- "KEY_HANGEUL": 122,
- "KEY_HANJA": 123,
- "KEY_YEN": 124,
- "KEY_LEFTMETA": 125,
- "KEY_RIGHTMETA": 126,
- "KEY_COMPOSE": 127,
-
- "KEY_STOP": 128,
- "KEY_AGAIN": 129,
- "KEY_PROPS": 130,
- "KEY_UNDO": 131,
- "KEY_FRONT": 132,
- "KEY_COPY": 133,
- "KEY_OPEN": 134,
- "KEY_PASTE": 135,
- "KEY_FIND": 136,
- "KEY_CUT": 137,
- "KEY_HELP": 138,
- "KEY_MENU": 139,
- "KEY_CALC": 140,
- "KEY_SETUP": 141,
- "KEY_SLEEP": 142,
- "KEY_WAKEUP": 143,
- "KEY_FILE": 144,
- "KEY_SENDFILE": 145,
- "KEY_DELETEFILE": 146,
- "KEY_XFER": 147,
- "KEY_PROG1": 148,
- "KEY_PROG2": 149,
- "KEY_WWW": 150,
- "KEY_MSDOS": 151,
- "KEY_COFFEE": 152,
- "KEY_DIRECTION": 153,
- "KEY_CYCLEWINDOWS": 154,
- "KEY_MAIL": 155,
- "KEY_BOOKMARKS": 156,
- "KEY_COMPUTER": 157,
- "KEY_BACK": 158,
- "KEY_FORWARD": 159,
- "KEY_CLOSECD": 160,
- "KEY_EJECTCD": 161,
- "KEY_EJECTCLOSECD": 162,
- "KEY_NEXTSONG": 163,
- "KEY_PLAYPAUSE": 164,
- "KEY_PREVIOUSSONG": 165,
- "KEY_STOPCD": 166,
- "KEY_RECORD": 167,
- "KEY_REWIND": 168,
- "KEY_PHONE": 169,
- "KEY_ISO": 170,
- "KEY_CONFIG": 171,
- "KEY_HOMEPAGE": 172,
- "KEY_REFRESH": 173,
- "KEY_EXIT": 174,
- "KEY_MOVE": 175,
- "KEY_EDIT": 176,
- "KEY_SCROLLUP": 177,
- "KEY_SCROLLDOWN": 178,
- "KEY_KPLEFTPAREN": 179,
- "KEY_KPRIGHTPAREN": 180,
- "KEY_NEW": 181,
- "KEY_REDO": 182,
-
- "KEY_F13": 183,
- "KEY_F14": 184,
- "KEY_F15": 185,
- "KEY_F16": 186,
- "KEY_F17": 187,
- "KEY_F18": 188,
- "KEY_F19": 189,
- "KEY_F20": 190,
- "KEY_F21": 191,
- "KEY_F22": 192,
- "KEY_F23": 193,
- "KEY_F24": 194,
-
- "KEY_PLAYCD": 200,
- "KEY_PAUSECD": 201,
- "KEY_PROG3": 202,
- "KEY_PROG4": 203,
- "KEY_DASHBOARD": 204,
- "KEY_SUSPEND": 205,
- "KEY_CLOSE": 206,
- "KEY_PLAY": 207,
- "KEY_FASTFORWARD": 208,
- "KEY_BASSBOOST": 209,
- "KEY_PRINT": 210,
- "KEY_HP": 211,
- "KEY_CAMERA": 212,
- "KEY_SOUND": 213,
- "KEY_QUESTION": 214,
- "KEY_EMAIL": 215,
- "KEY_CHAT": 216,
- "KEY_SEARCH": 217,
- "KEY_CONNECT": 218,
- "KEY_FINANCE": 219,
- "KEY_SPORT": 220,
- "KEY_SHOP": 221,
- "KEY_ALTERASE": 222,
- "KEY_CANCEL": 223,
- "KEY_BRIGHTNESSDOWN": 224,
- "KEY_BRIGHTNESSUP": 225,
- "KEY_MEDIA": 226,
-
- "KEY_SWITCHVIDEOMODE": 227,
-
- "KEY_KBDILLUMTOGGLE": 228,
- "KEY_KBDILLUMDOWN": 229,
- "KEY_KBDILLUMUP": 230,
-
- "KEY_SEND": 231,
- "KEY_REPLY": 232,
- "KEY_FORWARDMAIL": 233,
- "KEY_SAVE": 234,
- "KEY_DOCUMENTS": 235,
-
- "KEY_BATTERY": 236,
-
- "KEY_BLUETOOTH": 237,
- "KEY_WLAN": 238,
- "KEY_UWB": 239,
-
- "KEY_UNKNOWN": 240,
-
- "KEY_VIDEO_NEXT": 241,
- "KEY_VIDEO_PREV": 242,
- "KEY_BRIGHTNESS_CYCLE": 243,
- "KEY_BRIGHTNESS_ZERO": 244,
- "KEY_DISPLAY_OFF": 245,
-
- "KEY_WIMAX": 246,
- "KEY_RFKILL": 247,
-
- "KEY_MICMUTE": 248,
-
- "BTN_MISC": 0x100,
- "BTN_0": 0x100,
- "BTN_1": 0x101,
- "BTN_2": 0x102,
- "BTN_3": 0x103,
- "BTN_4": 0x104,
- "BTN_5": 0x105,
- "BTN_6": 0x106,
- "BTN_7": 0x107,
- "BTN_8": 0x108,
- "BTN_9": 0x109,
-
- "BTN_MOUSE": 0x110,
- "BTN_LEFT": 0x110,
- "BTN_RIGHT": 0x111,
- "BTN_MIDDLE": 0x112,
- "BTN_SIDE": 0x113,
- "BTN_EXTRA": 0x114,
- "BTN_FORWARD": 0x115,
- "BTN_BACK": 0x116,
- "BTN_TASK": 0x117,
-
- "BTN_JOYSTICK": 0x120,
- "BTN_TRIGGER": 0x120,
- "BTN_THUMB": 0x121,
- "BTN_THUMB2": 0x122,
- "BTN_TOP": 0x123,
- "BTN_TOP2": 0x124,
- "BTN_PINKIE": 0x125,
- "BTN_BASE": 0x126,
- "BTN_BASE2": 0x127,
- "BTN_BASE3": 0x128,
- "BTN_BASE4": 0x129,
- "BTN_BASE5": 0x12a,
- "BTN_BASE6": 0x12b,
- "BTN_DEAD": 0x12f,
-
- "BTN_GAMEPAD": 0x130,
- "BTN_A": 0x130,
- "BTN_B": 0x131,
- "BTN_C": 0x132,
- "BTN_X": 0x133,
- "BTN_Y": 0x134,
- "BTN_Z": 0x135,
- "BTN_TL": 0x136,
- "BTN_TR": 0x137,
- "BTN_TL2": 0x138,
- "BTN_TR2": 0x139,
- "BTN_SELECT": 0x13a,
- "BTN_START": 0x13b,
- "BTN_MODE": 0x13c,
- "BTN_THUMBL": 0x13d,
- "BTN_THUMBR": 0x13e,
-
- "BTN_DIGI": 0x140,
- "BTN_TOOL_PEN": 0x140,
- "BTN_TOOL_RUBBER": 0x141,
- "BTN_TOOL_BRUSH": 0x142,
- "BTN_TOOL_PENCIL": 0x143,
- "BTN_TOOL_AIRBRUSH": 0x144,
- "BTN_TOOL_FINGER": 0x145,
- "BTN_TOOL_MOUSE": 0x146,
- "BTN_TOOL_LENS": 0x147,
- "BTN_TOOL_QUINTTAP": 0x148,
- "BTN_TOUCH": 0x14a,
- "BTN_STYLUS": 0x14b,
- "BTN_STYLUS2": 0x14c,
- "BTN_TOOL_DOUBLETAP": 0x14d,
- "BTN_TOOL_TRIPLETAP": 0x14e,
- "BTN_TOOL_QUADTAP": 0x14f,
-
- "BTN_WHEEL": 0x150,
- "BTN_GEAR_DOWN": 0x150,
- "BTN_GEAR_UP": 0x151,
- }
-
-relCodes = {
- "REL_X": 0x00,
- "REL_Y": 0x01,
- "REL_Z": 0x02,
- "REL_RX": 0x03,
- "REL_RY": 0x04,
- "REL_RZ": 0x05,
- "REL_HWHEEL": 0x06,
- "REL_DIAL": 0x07,
- "REL_WHEEL": 0x08,
- "REL_MISC": 0x09,
- "REL_MAX": 0x0f,
- }
-
-absCodes = {
- "ABS_X": 0x00,
- "ABS_Y": 0x01,
- "ABS_Z": 0x02,
- "ABS_RX": 0x03,
- "ABS_RY": 0x04,
- "ABS_RZ": 0x05,
- "ABS_THROTTLE": 0x06,
- "ABS_RUDDER": 0x07,
- "ABS_WHEEL": 0x08,
- "ABS_GAS": 0x09,
- "ABS_BRAKE": 0x0a,
- "ABS_HAT0X": 0x10,
- "ABS_HAT0Y": 0x11,
- "ABS_HAT1X": 0x12,
- "ABS_HAT1Y": 0x13,
- "ABS_HAT2X": 0x14,
- "ABS_HAT2Y": 0x15,
- "ABS_HAT3X": 0x16,
- "ABS_HAT3Y": 0x17,
- "ABS_PRESSURE": 0x18,
- "ABS_DISTANCE": 0x19,
- "ABS_TILT_X": 0x1a,
- "ABS_TILT_Y": 0x1b,
- "ABS_TOOL_WIDTH": 0x1c,
-
- "ABS_VOLUME": 0x20,
-
- "ABS_MISC": 0x28,
-
- "ABS_MT_SLOT": 0x2f,
- "ABS_MT_TOUCH_MAJOR": 0x30,
- "ABS_MT_TOUCH_MINOR": 0x31,
- "ABS_MT_WIDTH_MAJOR": 0x32,
- "ABS_MT_WIDTH_MINOR": 0x33,
- "ABS_MT_ORIENTATION": 0x34,
- "ABS_MT_POSITION_X": 0x35,
- "ABS_MT_POSITION_Y": 0x36,
- "ABS_MT_TOOL_TYPE": 0x37,
- "ABS_MT_BLOB_ID": 0x38,
- "ABS_MT_TRACKING_ID": 0x39,
- "ABS_MT_PRESSURE": 0x3a,
- "ABS_MT_DISTANCE": 0x3b,
-
- "ABS_MAX": 0x3f,
- }
-
-mscCodes = {
- "MSC_SERIAL": 0x00,
- "MSC_PULSELED": 0x01,
- "MSC_GESTURE": 0x02,
- "MSC_RAW": 0x03,
- "MSC_SCAN": 0x04,
- "MSC_TIMESTAMP": 0x05,
- "MSC_MAX": 0x07,
- "MSC_CNT": 0x08,
-}
-
-abs_count = absCodes['ABS_MAX'] + 1
-
-event_codetables = {
- eventTypes["EV_SYN"]: {},
- eventTypes["EV_KEY"]: keyCodes,
- eventTypes["EV_REL"]: relCodes,
- eventTypes["EV_ABS"]: absCodes,
-}
-
-BUS_PCI = 0x01
-BUS_ISAPNP = 0x02
-BUS_USB = 0x03
-BUS_HIL = 0x04
-BUS_BLUETOOTH = 0x05
-BUS_VIRTUAL = 0x06
-
-# See struct input_event in /usr/include/linux/input.h
-if platform.architecture()[0] == "32bit":
- struct_timeval = "II"
-else:
- struct_timeval = "QQ"
-
-struct_input_event = struct_timeval + 'HHi'
-sizeof_input_event = struct.calcsize(struct_input_event)
-
-struct_input_id = 'HHHH'
-struct_uinput_user_dev = ('80s' +
- struct_input_id +
- 'i' +
- str(abs_count) + 'i' +
- str(abs_count) + 'i' +
- str(abs_count) + 'i' +
- str(abs_count) + 'i')
-sizeof_uinput_user_dev = struct.calcsize(struct_uinput_user_dev)
-
-struct_input_absinfo = 'iiii'
-
-# asm-generic/ioctl.h:
-IOC_NRBITS = 8
-IOC_TYPEBITS = 8
-IOC_SIZEBITS = 14
-IOC_DIRBITS = 2
-
-IOC_NRSHIFT = 0
-IOC_TYPESHIFT = IOC_NRSHIFT + IOC_NRBITS
-IOC_SIZESHIFT = IOC_TYPESHIFT + IOC_TYPEBITS
-IOC_DIRSHIFT = IOC_SIZESHIFT + IOC_SIZEBITS
-
-IOC_NONE = 0
-IOC_WRITE = 1
-IOC_READ = 2
-
-def IOC(dir_, type_, nr, size):
- return ((dir_ << IOC_DIRSHIFT) |
- (type_ << IOC_TYPESHIFT) |
- (nr << IOC_NRSHIFT) |
- (size << IOC_SIZESHIFT))
-def IO(type_, nr):
- return IOC(IOC_NONE, type_, nr, 0)
-def IOR(type_, nr, size):
- return IOC(IOC_READ, type_, nr, struct.calcsize(size))
-def IOW(type_, nr, size):
- return IOC(IOC_WRITE, type_, nr, struct.calcsize(size))
-def EVIOCGABS(abs):
- return IOR(ord('E'), 0x40 + (abs), struct_input_absinfo)
-
-UINPUT_IOCTL_BASE = ord('U')
-UI_DEV_CREATE = IO(UINPUT_IOCTL_BASE, 1)
-UI_DEV_DESTROY = IO(UINPUT_IOCTL_BASE, 2)
-
-UI_SET_EVBIT = IOW(UINPUT_IOCTL_BASE, 100, 'i')
-UI_SET_KEYBIT = IOW(UINPUT_IOCTL_BASE, 101, 'i')
-UI_SET_RELBIT = IOW(UINPUT_IOCTL_BASE, 102, 'i')
-UI_SET_ABSBIT = IOW(UINPUT_IOCTL_BASE, 103, 'i')
-
-# inverse lookup tables for event/key/rel/abs codes
-eventTypesInv = {}
-keyCodesInv = {}
-relCodesInv = {}
-absCodesInv = {}
-for d in ["eventTypes", "keyCodes",
- "relCodes", "absCodes"]:
- globals()[d + "Inv"] = dict([(v, k) for k, v in globals()[d].iteritems()])
-
-def toKeyCode(keyCodeOrName):
- if isinstance(keyCodeOrName, int):
- return keyCodeOrName
- elif keyCodeOrName in keyCodes:
- return keyCodes[keyCodeOrName]
- elif keyCodeOrName.upper() in keyCodes:
- return keyCodes[keyCodeOrName.upper(keyCodeOrName)]
- elif ("KEY_" + keyCodeOrName.upper()) in keyCodes:
- return keyCodes["KEY_" + keyCodeOrName.upper()]
- else:
- raise ValueError('Invalid keycode "%s"' % (keyCodeOrName,))
-
-def toKeyName(keyCode):
- if keyCode in keyCodesInv:
- return keyCodesInv[keyCode]
- else:
- raise ValueError('Invalid keycode "%s"' % (keyCode,))
-
-def toButtonCode(buttonCodeOrName):
- if isinstance(buttonCodeOrName, str):
- buttonCode = toKeyCode(buttonCodeOrName)
- elif buttonCodeOrName < 0xf:
- buttonCode = keyCodes["BTN_MOUSE"] + buttonCodeOrName
- else:
- buttonCode = buttonCodeOrName
- return buttonCode
-
-def refreshDeviceInfo():
- global _g_devices
- global _g_deviceNames
- global _g_filenames
- _g_devices = file("/proc/bus/input/devices").read().split("\n\n")
- _g_deviceNames = {}
- _g_filenames = {}
- for d in _g_devices:
- if d.strip() == "":
- continue
- _name = [line.split('"')[1] for line in d.split('\n')
- if line.startswith('N: ')][0]
- _g_deviceNames[_name] = ("/dev/input/" +
- re.findall('[ =](event[0-9]+)\s', d)[0])
- _g_filenames[_g_deviceNames[_name]] = _name
-
-def toEventFilename(deviceName):
- return _g_deviceNames[deviceName]
-
-def toEventDeviceName(filename):
- return _g_filenames[filename]
-
-class InputDevice(object):
- def __init__(self):
- if not "_g_devices" in globals():
- refreshDeviceInfo()
- self._fd = -1
- self._filename = None
- self._uidev = None
- self._created = False
- self._opened = False
- self._name = None
-
- def __del__(self):
- if self._created:
- self.destroy()
-
- def __str__(self):
- return "%s(name=%s, filename=%s, created=%s, opened=%s, fd=%s)" % (
- self.__class__.__name__,
- repr(self._name),
- repr(self._filename),
- repr(self._created),
- repr(self._opened),
- repr(self._fd))
-
- def startCreating(self, name, vendor, product, version,
- absmin=None, absmax=None):
- if self._fd > 0:
- raise InputDeviceError("InputDevice is already open")
- self._fd = os.open("/dev/uinput", os.O_WRONLY | os.O_NONBLOCK)
- if absmin == None:
- absmin = [0 for _ in xrange(abs_count)]
- if absmax == None:
- absmax = [0 for _ in xrange(abs_count)]
- absfuzz = [0 for _ in xrange(abs_count)]
- absflat = [0 for _ in xrange(abs_count)]
- self._name = name
- self._uidev = struct.pack(struct_uinput_user_dev,
- name, # name
- BUS_USB, # id.bus_type
- vendor, # id.vendor
- product, # id.product
- version, # id.version
- 0, # ff_effects_max
- # TODO: why absmin + absmax gives
- # error for touch?
- *(absmax + absmin + absfuzz + absflat)
- )
-
- def finishCreating(self):
- if self._fd < 1:
- raise InputDeviceError("startCreating() not called")
- bytes_written = os.write(self._fd, self._uidev)
- if bytes_written != sizeof_uinput_user_dev:
- raise InputDeviceError(
- "Writing to /dev/uinput failed, wrote %s/%s bytes"
- % (bytes_written, sizeof_uinput_user_dev))
- rv = fcntl.ioctl(self._fd, UI_DEV_CREATE)
- if rv != 0:
- raise InputDeviceError(
- "Creating device failed, ioctl UI_DEV_CREATE returned %s"
- % (rv,))
- self._created = True
- return True
-
- def destroy(self):
- if self._created:
- fcntl.ioctl(self._fd, UI_DEV_DESTROY)
- self._created = False
- self.close()
-
- def open(self, filename):
- if self._fd > 0:
- raise InputDeviceError("InputDevice is already open")
- if not filename.startswith("/dev/input"):
- filename = toEventFilename(filename)
- self._fd = os.open(filename, os.O_WRONLY | os.O_NONBLOCK)
- self._filename = filename
- self._created = False
- self._name = toEventDeviceName(self._filename)
- return self
-
- def close(self):
- if self._fd > 0:
- os.close(self._fd)
- self._fd = -1
-
- def filename(self):
- return self._filename
-
- def addCap(self, capBit, capCodeOrName, capCode2Name):
- if self._fd < 1:
- raise InputDeviceError("startCreating() not called")
- if self._created or self._opened:
- raise InputDeviceError("Cannot add capabilities after creation")
- if isinstance(capCodeOrName, int):
- capCode = capCodeOrName
- elif capCodeOrName in capCode2Name:
- capCode = capCode2Name[capCodeOrName]
- else:
- raise InputDeviceError('Unknown name "%s"' % (capCodeOrName,))
- return fcntl.ioctl(self._fd, capBit, capCode)
-
- def addEvent(self, eventCodeOrName):
- return self.addCap(UI_SET_EVBIT, eventCodeOrName, eventTypes)
-
- def addKey(self, keyCodeOrName):
- return self.addCap(UI_SET_KEYBIT, keyCodeOrName, keyCodes)
-
- def addRel(self, relCodeOrName):
- return self.addCap(UI_SET_RELBIT, relCodeOrName, relCodes)
-
- def addAbs(self, absCodeOrName):
- return self.addCap(UI_SET_ABSBIT, absCodeOrName, absCodes)
-
- def send(self, type_, code, value):
- if self._fd < 1:
- raise InputDeviceError("InputDevice is not open")
- if isinstance(type_, str):
- typeCode = eventTypes[type_]
- else:
- typeCode = type_
- if isinstance(code, str):
- codeCode = event_codetables[typeCode][code]
- else:
- codeCode = code
- return sendInputEvent(self._fd, typeCode, codeCode, value)
-
- def sync(self):
- if self._fd < 1:
- raise InputDeviceError("InputDevice is not open")
- return sendInputSync(self._fd)
-
-class InputDeviceError(Exception):
- pass
-
-class Mouse(InputDevice):
- def __init__(self, absoluteMove=False):
- """
- Parameters:
-
- absoluteMove (boolean, optional)
- force move(x,y) to send absolute coordinates instead
- of standard relative movement. This helps avoiding
- mouse pointer drift in some occasions. The default
- is False.
- """
- InputDevice.__init__(self)
- self._x = 0
- self._y = 0
- self._sendAbs = absoluteMove
-
- def create(self, name="Virtual fMBT Mouse",
- vendor=0xf4b7, product=0x4053, version=1):
-
- self.startCreating(name, vendor, product, version)
- self.addEvent("EV_KEY")
- self.addEvent("EV_REL")
- if self._sendAbs:
- self.addEvent("EV_ABS")
- self.addEvent("EV_SYN")
- self.addRel("REL_X")
- self.addRel("REL_Y")
- self.addRel("REL_HWHEEL")
- self.addRel("REL_WHEEL")
- self.addKey("BTN_LEFT")
- self.addKey("BTN_RIGHT")
- self.addKey("BTN_MIDDLE")
- self.addKey("BTN_SIDE")
- self.addKey("BTN_EXTRA")
- self.addKey("BTN_FORWARD")
- self.addKey("BTN_BACK")
- self.addKey("BTN_TASK")
- if self._sendAbs:
- self.addAbs("ABS_X")
- self.addAbs("ABS_Y")
- self.finishCreating()
- return self
-
- def move(self, x, y):
- """
- Move mouse cursor to coordinates x, y.
- """
- if self._sendAbs:
- self.send("EV_ABS", "ABS_X", x)
- self.send("EV_ABS", "ABS_Y", y)
- else:
- deltaX = x - self._x
- deltaY = y - self._y
- self.send("EV_REL", "REL_X", deltaX)
- self.send("EV_REL", "REL_Y", deltaY)
- self.sync()
- self.setXY(x, y)
-
- def moveRel(self, deltaX, deltaY):
- self.send("EV_REL", "REL_X", deltaX)
- self.send("EV_REL", "REL_Y", deltaY)
- self.sync()
- self.setXY(self._x + deltaX, self._y + deltaY)
-
- def press(self, button):
- buttonCode = toButtonCode(button)
- self.send("EV_KEY", buttonCode, 1)
- self.sync()
-
- def release(self, button):
- buttonCode = toButtonCode(button)
- self.send("EV_KEY", buttonCode, 0)
- self.sync()
-
- def setXY(self, x, y):
- """
- Resets relative mouse position to (x, y), does not synthesize
- event. Example: disable possible mouse pointer drift:
-
- mouse.moveRel(-4096, -4096) # move to the top-left corner
- mouse.setXY(0, 0) # set current pointer coordinates to 0, 0
-
- After this, mouse.move(x, y) will synthesize relative mouse
- move event which will drive cursor to coordinates x, y.
- """
- self._x = x
- self._y = y
-
- def xy(self):
- return (self._x, self._y)
-
- def tap(self, x, y, button):
- self.move(x, y)
- self.press(button)
- self.release(button)
-
-class Touch(InputDevice):
- """
- Simulates touchpanel and touchpad
- """
- def __init__(self, maxX = None, maxY = None,
- screenWidth = None, screenHeight = None, screenAngle = None):
- InputDevice.__init__(self)
- self._maxX = maxX
- self._maxY = maxY
- self._screenW = screenWidth
- self._screenH = screenHeight
- self._screenA = screenAngle
- self._maxPressure = None
- self._multiTouch = True
- self._mtTrackingId = 0
- self._mtTracking = {}
- self._hoover = (0, 0)
-
- def create(self, name="Virtual fMBT Touch",
- vendor=0xf4b7, product=0x70c5, version=1,
- maxX=0xffff, maxY=0xffff, maxPressure=None,
- multiTouch = True):
- if maxX != None:
- self._maxX = maxX
- else:
- self._maxX = 0xffff
- if maxY != None:
- self._maxY = maxY
- else:
- self._maxY = 0xffff
- absmin = [0 for _ in xrange(abs_count)]
- absmax = [0 for _ in xrange(abs_count)]
- absmax[absCodes["ABS_X"]] = self._maxX
- absmax[absCodes["ABS_Y"]] = self._maxY
- if maxPressure != None:
- self._maxPressure = maxPressure
- absmax[absCodes["ABS_PRESSURE"]] = self._maxPressure
- absmax[absCodes["ABS_MT_SLOT"]] = 16
- absmax[absCodes["ABS_MT_TRACKING_ID"]] = 0x0fffffff
- absmax[absCodes["ABS_MT_POSITION_X"]] = self._maxX
- absmax[absCodes["ABS_MT_POSITION_Y"]] = self._maxY
- self._multiTouch = multiTouch
-
- self.startCreating(name, vendor, product, version,
- absmin=absmin, absmax=absmax)
- self.addEvent("EV_KEY")
- self.addEvent("EV_ABS")
- self.addEvent("EV_SYN")
- self.addKey("BTN_TOUCH")
- self.addAbs("ABS_X")
- self.addAbs("ABS_Y")
- if self._maxPressure != None:
- self.addAbs("ABS_PRESSURE")
- if self._multiTouch:
- self.addAbs("ABS_MT_SLOT")
- self.addAbs("ABS_MT_TRACKING_ID")
- self.addAbs("ABS_MT_POSITION_X")
- self.addAbs("ABS_MT_POSITION_Y")
- self.finishCreating()
- return self
-
- def open(self, filename):
- InputDevice.open(self, filename)
- # detect touch device capabilities and max values
- # nfo is struct input_absinfo
- nfo = array.array('i', range(6))
- fcntl.ioctl(self._fd, EVIOCGABS(absCodes["ABS_X"]), nfo, 1)
- self._maxX = nfo[2]
- fcntl.ioctl(self._fd, EVIOCGABS(absCodes["ABS_Y"]), nfo, 1)
- self._maxY = nfo[2]
- return self
-
- def setScreenSize(self, (width, height)):
- self._screenW, self._screenH = (width, height)
-
- def setScreenAngle(self, angle):
- self._screenA = angle
-
- def _angleXY(self, x, y, angle=None):
- """return x, y in screen without rotation"""
- if angle == None:
- angle = self._screenA
- sw, sh = self._screenW, self._screenH
- if angle:
- while angle < 0:
- angle += 360
- while angle > 360:
- angle -= 360
- if angle == 90:
- ax = self._screenH - y
- ay = x
- sw, sh = self._screenH, self._screenW
- elif angle == 180:
- ax = self._screenH - x
- ay = self._screenW - y
- elif angle == 270:
- ax = y
- ay = self._screenW - x
- sw, sh = self._screenH, self._screenW
- else:
- raise ValueError('Illegal screen rotation angle %s' %
- (self._screenA,))
- else:
- ax, ay = x, y
- return (sw, sh, ax, ay)
-
- def _tXY(self, x, y):
- """convert x, y to touch screen coordinates"""
- if self._screenW and self._maxX and self._screenH and self._maxY:
- w, h, x, y = self._angleXY(x, y)
- x = int((self._maxX * x) / w)
- y = int((self._maxY * y) / h)
- return (x, y)
- else:
- return (x, y)
-
- def absToScreenXY(self, absX, absY):
- if self._screenW and self._maxX and self._screenH and self._maxY:
- x = int(self._screenW * absX / self._maxX)
- y = int(self._screenH * absY / self._maxY)
- if self._screenA:
- _, _, x, y = self._angleXY(x, y, -self._screenA)
- return (x, y)
- else:
- return (absX, absY)
-
- def _startTracking(self, finger, x, y):
- self._mtTrackingId += 1
- usedSlots = set([self._mtTracking[fngr][0]
- for fngr in self._mtTracking])
- for freeSlot in xrange(16):
- if not freeSlot in usedSlots:
- break
- else:
- raise ValueError("No free slots for multitouch")
- self._mtTracking[finger] = [freeSlot, self._mtTrackingId, x, y]
- self._sendSlot(finger)
- self.send("EV_ABS", "ABS_MT_TRACKING_ID", self._mtTrackingId)
- tx, ty = self._tXY(x, y)
- self.send("EV_ABS", "ABS_MT_POSITION_X", tx)
- self.send("EV_ABS", "ABS_MT_POSITION_Y", ty)
- return self._mtTrackingId
-
- def _stopTracking(self, finger):
- self._sendSlot(finger)
- self.send("EV_ABS", "ABS_MT_TRACKING_ID", -1)
- del self._mtTracking[finger]
-
- def _sendSlot(self, finger):
- slot = self._mtTracking[finger][0]
- self.send("EV_ABS", "ABS_MT_SLOT", slot)
-
- def tap(self, x, y, pressure=None):
- self.pressFinger(-1, x, y, pressure)
- self.releaseFinger(-1)
-
- # Compatibility API to allow using a Touch almost like a Mouse
- def move(self, x, y):
- if len(self._mtTracking.keys()) == 0:
- self._hoover = (x, y)
- else:
- finger = sorted(self._mtTracking.keys())[0]
- return self.moveFinger(finger, x, y)
-
- def press(self, finger):
- return self.pressFinger(finger, *self._hoover)
-
- def release(self, finger):
- return self.releaseFinger(finger)
- # end of compatibility API
-
- # Multi-touch API
- def pressFinger(self, finger, x, y, pressure=None):
- """Add a finger to current multitouch gesture. If multitouch gesture
- is not started, it starts automatically.
- """
- if self._multiTouch and not finger in self._mtTracking:
- self._startTracking(finger, x, y)
- if pressure != None and self._maxPressure != None:
- self.send("EV_ABS", "ABS_PRESSURE", pressure)
- self.send("EV_KEY", "BTN_TOUCH", 1)
- tx, ty = self._tXY(x, y)
- self.send("EV_ABS", "ABS_X", tx)
- self.send("EV_ABS", "ABS_Y", ty)
- self.sync()
-
- def releaseFinger(self, finger):
- """Remove a finger from current multitouch gesture. When last finger
- is raised from the screen, multitouch gesture ends."""
- if self._multiTouch:
- self._stopTracking(finger)
- self.send("EV_KEY", "BTN_TOUCH", 0)
- for fngr in self._mtTracking:
- # still some finger pressed, non-multitouch reader gets
- # coordinates from one of those
- tx, ty = self._tXY(self._mtTracking[fngr][2],
- self._mtTracking[fngr][3])
- self.send("EV_ABS", "ABS_X", tx)
- self.send("EV_ABS", "ABS_Y", ty)
- break # only one coordinates will be sent.
- self.sync()
-
- def moveFinger(self, finger, x, y):
- """Move a finger in current multitouch gesture"""
- self._sendSlot(finger)
- tx, ty = self._tXY(x, y)
- if self._multiTouch:
- self.send("EV_ABS", "ABS_MT_POSITION_X", tx)
- self.send("EV_ABS", "ABS_MT_POSITION_Y", ty)
- self.send("EV_ABS", "ABS_X", tx)
- self.send("EV_ABS", "ABS_Y", ty)
- self._mtTracking[finger][2] = x # last X
- self._mtTracking[finger][3] = y # last Y
- self.sync()
-
-class Keyboard(InputDevice):
- def __init__(self):
- InputDevice.__init__(self)
-
- def create(self, name="Virtual fMBT Keyboard",
- vendor=0xf4b7, product=0x4ebd, version=1):
- self.startCreating(name, vendor, product, version)
- self.addEvent("EV_KEY")
- self.addEvent("EV_SYN")
- for keyName in keyCodes:
- if keyName.startswith("KEY_"):
- self.addKey(keyCodes[keyName])
- self.finishCreating()
- return self
-
- def press(self, keyCodeOrName):
- # TODO: there should be different MSC_SCAN matrix location for each key
- self.send("EV_MSC", mscCodes["MSC_SCAN"], 458793)
- self.send("EV_KEY", toKeyCode(keyCodeOrName), 1)
- self.sync()
-
- def release(self, keyCodeOrName):
- # TODO: there should be different MSC_SCAN matrix location for each key
- self.send("EV_MSC", mscCodes["MSC_SCAN"], 458793)
- self.send("EV_KEY", toKeyCode(keyCodeOrName), 0)
- self.sync()
-
- def tap(self, keyCodeOrName):
- keyCode = toKeyCode(keyCodeOrName)
- self.press(keyCode)
- self.release(keyCode)
-
-def sendInputSync(devFd):
- return sendInputEvent(devFd, 0, 0, 0)
-
-def sendInputEvent(devFd, type_, code, value):
- t = time.time()
- t_sec = int(t)
- t_usec = int(1000000*(t-t_sec))
- rv = os.write(devFd,
- struct.pack(struct_input_event,
- t_sec, t_usec,
- type_,
- code,
- value))
- return rv == sizeof_input_event
-
-def eventToString(inputEvent):
- tim, tus, typ, cod, val = struct.unpack(struct_input_event, inputEvent)
- styp = eventTypesInv.get(typ, "?")
- if styp == "EV_KEY":
- scod = keyCodesInv.get(cod, "?")
- elif styp == "EV_REL":
- scod = relCodesInv.get(cod, "?")
- elif styp == "EV_ABS":
- scod = absCodesInv.get(cod, "?")
- else:
- scod = "N/A"
- if typ == 0:
- return styp
- else:
- return "%8s.%s type: %4s (%5s), code: %5s (%15s) value: %8s" % \
- (tim, str(tus).zfill(6), typ, styp, cod, scod, val)
-
-def queueEventsFromFile(filename, queue, lock, filterOpts):
- if isinstance(filterOpts, dict) and "type" in filterOpts:
- allowedTypes = set()
- for t in filterOpts["type"]:
- if isinstance(t, str):
- allowedTypes.add(eventTypes[t])
- else:
- allowedTypes.add(t)
- else:
- allowedTypes = set(eventTypes.values())
- if ("touchScreen" in filterOpts and
- filename == filterOpts["touchScreen"].filename()):
- touchScreen = filterOpts["touchScreen"]
- absXCodes = set([absCodes["ABS_X"], absCodes["ABS_MT_POSITION_X"]])
- absYCodes = set([absCodes["ABS_Y"], absCodes["ABS_MT_POSITION_Y"]])
- absType = eventTypes["EV_ABS"]
- else:
- touchScreen = None
- fd = os.open(filename, os.O_RDONLY)
- try:
- while 1:
- eventData = os.read(fd, sizeof_input_event)
- if not lock.locked():
- return
- if not eventData:
- break
- (ts, tus, typ, cod, val) = struct.unpack(struct_input_event, eventData)
- if touchScreen and typ == absType:
- if cod in absXCodes:
- val, _ = touchScreen.absToScreenXY(val, 0)
- elif cod in absYCodes:
- _, val = touchScreen.absToScreenXY(0, val)
- if typ in allowedTypes:
- queue.put((ts, tus, typ, cod, val))
- finally:
- os.close(fd)
-
-# _g_recQL dictionary contains events being actively recorded
-# - key: filename, like "/dev/input/event0"
-# - value: (eventQueue, lock)
-# A thread is filling eventQueue with events from filename.
-# Once the lock is released, the thread will quit without writing
-# anything to the eventQueue anymore.
-_g_recQL = {}
-_g_unfetchedEvents = []
-def queueEventsFromFiles(listOfFilenames, filterOpts):
- global _g_recQL
- for filename in listOfFilenames:
- q = Queue.Queue()
- l = thread.allocate_lock()
- l.acquire()
- if filename in _g_recQL:
- # previous reader thread should quit
- _g_recQL[filename][1].release()
- thread.start_new_thread(
- queueEventsFromFile, (filename, q, l, filterOpts))
- _g_recQL[filename] = (q, l)
-
-def startQueueingEvents(filterOpts):
- refreshDeviceInfo()
- if len(_g_recQL) > 0:
- # already queueing, restart
- stopQueueingEvents()
- if "device" in filterOpts:
- deviceFiles = []
- for n in filterOpts["device"]:
- if n in _g_deviceNames:
- deviceFiles.append(_g_deviceNames[n])
- elif os.access(n, os.R_OK):
- deviceFiles.append(n)
- del filterOpts["device"]
- else:
- deviceFiles = glob.glob("/dev/input/event[0-9]*")
- queueEventsFromFiles(deviceFiles, filterOpts)
-
-def stopQueueingEvents():
- global _g_recQL
- global _g_unfetchedEvents
- for filename in _g_recQL:
- _g_recQL[filename][1].release()
- _g_unfetchedEvents = fetchQueuedEvents()
- _g_recQL = {}
-
-def fetchQueuedEvents():
- global _g_unfetchedEvents
- if len(_g_recQL) == 0: # no active recording
- rv = _g_unfetchedEvents
- _g_unfetchedEvents = []
- return rv
- else: # events are being recorded
- events = []
- for filename in _g_recQL:
- events.extend(fetchQueuedEventsFromFile(filename))
- return events
-
-def fetchQueuedEventsFromFile(filename):
- events = []
- q = _g_recQL[filename][0]
- deviceName = toEventDeviceName(filename)
- while 1:
- try:
- ts, tus, typ, cod, val = q.get_nowait()
- events.append((deviceName, ts + tus/1000000.0, typ, cod, val))
- except Queue.Empty:
- break
- return events
-
-def printEventsFromFile(filename):
- fd = os.open(filename, os.O_RDONLY)
-
- sdev = filename.split("/")[-1]
-
- try:
- while 1:
- inputEvent = os.read(fd, sizeof_input_event)
- if not inputEvent:
- break
- print sdev, eventToString(inputEvent)
- finally:
- os.close(fd)
-
-if __name__ == "__main__":
- import getopt
- import sys
-
- opt_print_devices = []
-
- opts, remainder = getopt.getopt(
- sys.argv[1:], 'hp',
- ['help', 'print'])
- for opt, arg in opts:
- if opt in ['-h', '--help']:
- print cmdline_usage
- sys.exit(0)
- elif opt in ['-p', '--print']:
- if not remainder:
- print cmdline_usage
- opt_print_devices = remainder
-
- if opt_print_devices:
- for deviceFilename in opt_print_devices:
- thread.start_new_thread(printEventsFromFile, (deviceFilename,))
- raw_input("Press ENTER to stop printing...\n")
+++ /dev/null
-import time
-
-class _USE_DEFAULTS:
- pass
-
-
-def int_coords((x,y), (width, height)):
- if 0 <= x <= 1 and type(x) == float:
- x = x * width
- if 0 <= y <= 1 and type(y) == float:
- y = y * height
- return (int(round(x)), int(round(y)))
-
-
-class GUITestConnection(object):
-
- def send_tap(self, x, y):
- return self.send_touchdown(x, y) and self.send_touchup(x, y)
-
- def send_press(self, keyname):
- return self.send_keydown(keyname) and self.send_keyup(keyname)
-
- def send_keydown(self, keyname):
- print ("send keydown(%s) needed but not implemented." % (keyname,))
-
- def send_keyup(self, keyname):
- print ("send keyup(%s) needed but not implemented." % (keyname,))
-
- def send_touchdown(self, x, y):
- print ("send touchdown(%d, %d) needed but not implemented" % (x, y))
-
- def send_touchup(self, x, y):
- print ("send touchup(%d, %d) needed but not implemented" % (x, y))
-
- def send_touchmove(self, x, y):
- print ("send touchmove(%d, %d) needed but not implemented" % (x, y))
-
-
-class GUITestInterface(object):
- def __init__(self):
- self._conn = None
- self.tap_defaults = {}
- self.longtap_holdtime = 2.0
-
- def setConnection(self, conn):
- self._conn = conn
-
- def screen_size(Self):
- return 720, 1280
-
- def pressKey(self, keyname, long=False, hold=0.0, modifiers=None):
- extra_params = {}
- if modifiers != None:
- extra_params['modifiers'] = modifiers
- if hold > 0.0:
- try:
- assert self.existing_connection().\
- send_keydown(keyname, **extra_params)
- time.sleep(hold)
- assert self.existing_connection().\
- send_keyup(keyname, **extra_params)
- except AssertionError:
- return False
- return True
- return self.existing_connection().send_press(keyname, **extra_params)
-
- def tap(self, (x, y), long=_USE_DEFAULTS, hold=_USE_DEFAULTS,\
- count=_USE_DEFAULTS, delay_between_taps=_USE_DEFAULTS,
- button=_USE_DEFAULTS):
- if long == _USE_DEFAULTS:
- long = self.tap_defaults.get("long", False)
- if hold == _USE_DEFAULTS:
- hold = self.tap_defaults.get("hold", 0.0)
- if count == _USE_DEFAULTS:
- count = self.tap_defaults.get("count", 1)
- if delay_between_taps == _USE_DEFAULTS:
- delay_between_taps = \
- self.tap_defaults.get("delay_between_taps", 0.5)
- if button == _USE_DEFAULTS:
- button = self.tap_defaults.get("button", None)
-
- x, y = self.int_coords((x,y))
- count = int(count)
- if long and hold == 0.0:
- hold = self.longtap_holdtime
- extra_params = {}
- if button != None:
- extra_params['button'] = button
- while count > 0:
- if hold > 0.0:
- try:
- assert self.existing_connection().\
- send_touchdown(x,y, **extra_params)
- time.sleep(hold)
- assert self.existing_connection().\
- send_touchup(x,y, **extra_params)
- except AssertionError:
- return False
- else:
- if delay_between_taps:
- time.sleep(delay_between_taps)
- if not self.existing_connection().send_tap(x, y, **extra_params):
- return False
- count = int(count) - 1
- return True
-
- def down_scroll(self, (x1, y1), (x2, y2)):
- x1, y1 = self.int_coords((x1, y1))
- x2, y2 = self.int_coords((x2, y2))
-
- self.existing_connection().send_touchdown(x1, y1)
- ytemp = y1 - y2
- yidx = 0
-
- while ytemp - yidx > 0:
- self.existing_connection().send_touchmove(x1, y1 - yidx)
- yidx += 5
-
- self.existing_connection().send_touchup(x2, y2)
-
- def up_scroll(self, (x1, y1), (x2, y2)):
- x1, y1 = self.int_coords((x1, y1))
- x2, y2 = self.int_coords((x2, y2))
-
- self.existing_connection().send_touchdown(x1, y1)
- ytemp = y2 - y1
- yidx = 0
-
- while ytemp - yidx > 0:
- self.existing_connection().send_touchmove(x1, y2 + yidx)
- yidx += 5
-
- self.existing_connection().send_touchup(x2, y2)
-
-
- def drag(self, (x1, y1), (x2, y2), delay_between_moves=0.01,\
- delay_before_moves=0, delay_after_moves=0, move_points=10,\
- button=_USE_DEFAULTS):
- x1, y1 = self.int_coords((x1, y1))
- x2, y2 = self.int_coords((x2, y2))
-
- extra_args = {}
- if button != _USE_DEFAULTS:
- extra_args["button"] = button
-
- if delay_before_moves >= 0:
- time.sleep(delay_before_moves)
- else:
- time.sleep(delay_between_moves)
- for i in xrange(0, move_points):
- nx = x1 + int(round(((x2 - x1) / float(move_points+1)) * (i+1)))
- ny = y1 + int(round(((y2 - y2) / float(move_points+1)) * (i+1)))
- if not self.existing_connection().\
- send_touchmove(nx, ny, **extra_args):
- return False
- time.sleep(delay_between_moves)
- if delay_after_moves > 0:
- self.existing_connection().send_touchmove(x2, y2, **extra_args)
- time.sleep(delay_after_moves)
- if delay_after_moves >= 0:
- if self.existing_connection().send_touchup(x2, y2, **extra_args):
- return True
- else:
- return False
- else:
- return True
-
-
-
- def existing_connection(self):
- if self._conn:
- return self._conn
- else:
- print ("not connected")
-
- def int_coords(self, (x, y)):
- width, height = self.screen_size()
- return int_coords((x,y), (width, height))
-
+++ /dev/null
-
-import os
-import time
-import subprocess
-import cPickle
-import base64
-import Queue
-import thread
-
-import monkey_gti
-
-from constants import Constants
-
-
-def _file_to_queue(f, out_queue):
- line = f.readline()
- while line != "":
- out_queue.put(line)
- line = f.readline()
- f.close()
-
-
-def _encode(obj):
- return base64.b64encode(cPickle.dumps(obj))
-
-
-def _decode(string):
- return cPickle.loads(base64.b64decode(string))
-
-
-def _run(cmd, expected_exitstatus=None):
- if type(cmd) == str:
- shell = True
- else:
- shell = False
-
- try:
- proc = subprocess.Popen(cmd, shell=shell, stdout=subprocess.PIPE,\
- stderr=subprocess.PIPE, close_fds=True)
- if expected_exitstatus != None:
- out, err = proc.communicate()
- else:
- out, err = ('', None)
- except Exception, ex:
- class fakeProcess(object):
- pass
- p = fakeProcess
- p.returncode = 127
- out, err = ('', ex)
-
- exit_status = proc.returncode
-
- if (expected_exitstatus != None and
- exit_status != expected_exitstatus and
- exit_status not in expected_exitstatus):
- msg = "Executing %s failed. Exit status: %s, expected %s" % \
- (cmd, exit_status, expected_exitstatus)
- raise FMBTTizenError(msg)
-
- return exit_status, out, err
-
-
-class Device(monkey_gti.GUITestInterface):
-
- def __init__(self, serial_number=None, debug_agentfile=None, \
- keyboard_device=None, touch_device=None, \
- mouse_device=None, **kwargs):
-
- monkey_gti.GUITestInterface.__init__(self, **kwargs)
- c = TizenDeviceConnection(serial_number=serial_number,\
- debug_agentfile=debug_agentfile,\
- keyboard_device=keyboard_device,\
- touch_device=touch_device,\
- mouse_device=mouse_device)
- self.setConnection(c)
- c.gti = self
-
- def connect(self):
- if hasattr(self, "_conn"):
- self._conn.open()
- return True
- else:
- return False
-
- def disconnect(self):
- if hasattr(self, "_conn"):
- self._conn.close()
- return True
- else:
- return False
-
- def pressPower(self, **pressKeyKwArgs):
- return self.pressKey("POWER", **pressKeyKwArgs)
-
- def pressBack(self, **pressKeyKwArgs):
- return self.pressKey("BACK", **pressKeyKwArgs)
-
- def pressMenu(self, **pressKeyKwArgs):
- return self.pressKey("MENU", **pressKeyKwArgs)
-
- def pressVolumeDown(self, **pressKeyKwArgs):
- return self.pressKey("VOLUMEDOWN", **pressKeyKwArgs)
-
- def pressVolumeUp(self, **pressKeyKwArgs):
- return self.pressKey("VOLUMEUP", **pressKeyKwArgs)
-
- def key_names(self):
- return self._conn.key_names()
-
-
-class TizenDeviceConnection(monkey_gti.GUITestConnection):
-
- def __init__(self, serial_number=None, debug_agentfile=None, \
- keyboard_device=None, touch_device=None, mouse_device=None):
- if serial_number == None:
- self.serial_number = "unknown"
- else:
- self.serial_number = serial_number
-
- self.sdb_shell = None
- self.agent_needs_resolution = True
- self.touch_device = touch_device
- self.keyboard_device = keyboard_device
- self.debug_agentfile = debug_agentfile
- self.mouse_device = mouse_device
- self.open()
-
- def open(self):
- if self.serial_number == "unknown":
- raise TizenDeviceNotFoundError("Tizen device not found.")
-
- self.close()
-
- agent_fname = "fmbttizen-agent.py"
- agent_uinput_fname = "fmbtuinput.py"
-
- agent_fname_path = Constants.AGENT_PATH
- uinput_fname_path = Constants.UINPUT_AGENT_PATH
- remote_upload_path = "/tmp/"
-
- remote_agent_fname = remote_upload_path + agent_fname
-
- upload_files = [(agent_fname_path, remote_upload_path), \
- (uinput_fname_path, remote_upload_path)]
-
- for src, dst in upload_files:
- upload_cmd = ["sdb", "-s", self.serial_number, "push", src, dst]
- status, out, err = _run(upload_cmd, range(256))
- if status == 127:
- raise TizenConnectionError("Executing sdb -s %s push failed." + \
- "Check your Tizen SDK installation." % \
- self.serial_number)
- elif status != 0:
- if "device not found" in err:
- raise TizenDeviceNotFoundError(\
- 'Tizen device "%s" not found.'% \
- self.serial_number)
- else:
- raise TizenConnectionError('Executing "%s" failed: %s' % \
- (' '.join(upload_cmd), err + " " + out))
-
- self.agent_args = []
- if self.keyboard_device:
- self.agent_args.append("--keyboard=%s" % (self.keyboard_device,))
- if self.touch_device:
- self.agent_args.append("--touch=%s" % (self.touch_device,))
- if self.mouse_device:
- self.agent_args.append("--mouse=%s" % (self.mouse_device,))
-
- remote_shellcmd = ["sdb", "-s", self.serial_number, "shell"]
- try:
- self.sdb_shell = subprocess.Popen(remote_shellcmd,\
- shell=False,
- stdin=subprocess.PIPE,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- close_fds=True)
- except OSError:
- raise TizenConnectionError("Executing %s failed" % \
- " ".join(remote_shellcmd),)
-
- self.sdbshell_errqueue = Queue.Queue()
- thread.start_new_thread(_file_to_queue, (self.sdb_shell.stderr, \
- self.sdbshell_errqueue))
- self.sdb_shell.stdin.write("\r")
- try:
- ok, self.platform_info = self._agent_cmd(\
- "python %s %s; exit" % \
- (remote_agent_fname, " ".join(self.agent_args)))
- except IOError, msg:
- raise TizenConnectionError(\
- ('Connecting to a Tizen device/emulator failed. Error: %s'
- '\nTry "sdb -s %s shell python %s --debug".') % \
- (msg, self.serial_number, remote_agent_fname))
-
- return ok
-
- def key_names(self):
- return self._agent_cmd("kn")[1]
-
- def send_keydown(self, keyname):
- print 'keydown %s' % keyname
- return self._agent_cmd("kd %s" % (keyname,))[0]
-
- def send_keyup(self, keyname):
- print 'keyup %s' % keyname
- return self._agent_cmd("ku %s" % (keyname,))[0]
-
- def send_press(self, keyname, modifiers=()):
- print 'send_press %s' % keyname
- rv = True
- for m in modifiers:
- rv = rv and self.send_keydown(m)
- rv = rv and self._agent_cmd("kp %s" % (keyname,))[0]
- for m in modifiers[::-1]:
- rv = rv and self.send_keyup(m)
- return rv
-
- def send_touchdown(self, x, y):
- print 'touchdown %s %s' % (x, y)
- return self._agent_cmd("td %s %s 1" % (x, y))[0]
-
- def send_touchup(self, x, y):
- print 'touchup %s %s' % (x, y)
- return self._agent_cmd("tu %s %s 1" % (x, y))[0]
-
- def send_tap(self, x, y):
- print 'tap %s %s' % (x, y)
- return self._agent_cmd("tt %s %s 1" % (x, y))[0]
-
- def send_touchmove(self, x, y):
- print 'touchmove %s %s' % (x, y)
- return self._agent_cmd("tm %s %s" % (x, y))[0]
-
- def _report_errors_inqueue(self):
- while True:
- try:
- l = self._sdbshell_errqueue.get_nowait()
- except Queue.Empty:
- return
- if self.debug_agentfile:
- self.debug_agentfile.write("<2 %s" % (l,))
-
- def _agent_cmd(self, cmd, retry=3):
- if cmd[:2] in ["tt", "td", "tm", "tu", "er"]:
- if self.agent_needs_resolution:
- self._agent_cmd("sd %s %s" % self.gti.screen_size())
- self.agent_needs_resolution = False
-
- if self.sdb_shell == None:
- return False, "disconnected"
-
- if self.debug_agentfile:
- self.debug_agentfile.write(">0 %s\n" % (cmd,))
- try:
- if len(cmd) > 0:
- self.sdb_shell.stdin.write("%s%s" % (cmd, '\n'))
- self.sdb_shell.stdin.flush()
- except IOError, msg:
- if retry > 0:
- time.sleep(2)
- self._report_errors_inqueue()
- print ("Error when sending command %s : %s" % (cmd, msg))
- self.open()
- self._agent_cmd(cmd, retry=retry - 1)
- return self._agent_answer()
-
- def _agent_answer(self):
- error_line_prefix = "FMBTAGENT ERROR "
- ok_line_prefix = "FMBTAGENT OK "
- l = self.sdb_shell.stdout.readline()
- output = []
- while True:
- if self.debug_agentfile:
- if len(l) > 72:
- self.debug_agentfile.write("<1 %s...\n" % (l[:72],))
- else:
- self.debug_agentfile.write("<1 %s\n" % (l,))
- if l.startswith(ok_line_prefix):
- return True, _decode(l[len(ok_line_prefix):])
- elif l.startswith(error_line_prefix):
- return False, _decode(l[len(error_line_prefix):])
- else:
- output.append(l)
- pass
- l = self.sdb_shell.stdout.readline()
- if l == "":
- raise IOError("Agent connection lost : %s" % \
- ("\n".join(output)))
- break
- l = l.strip()
-
- def close(self):
- if hasattr(self, "sdb_Shell") and self.sdb_shell != None:
- try:
- self._agent_cmd("quit", retry=0)
- except:
- pass
- try:
- self.sdb_shell.stdin.close()
- except:
- pass
- try:
- self.sdb_shell.stdout.close()
- except:
- pass
- try:
- self.sdb_shell.stderr.close()
- except:
- pass
- self._report_errors_inqueue()
- self.sdb_shell = None
-
-
-class FMBTTizenError(Exception):
- pass
-
-
-class TizenConnectionError(FMBTTizenError):
- pass
-
-
-class TizenDeviceNotFoundError(TizenConnectionError):
- pass
+++ /dev/null
-
-import os
-import threading
-import random
-
-from monkey_tizen import Device
-from sdbmanager import SdbManager
-from constants import Constants
-
-
-class RandomExecutor(threading.Thread):
- def __init__(self, _devid, _wrap):
- self.monkey_dev = Device(_devid, _wrap.get_debug_file(), \
- _wrap.get_key_dev(), _wrap.get_touch_dev(), \
- _wrap.get_mouse_dev())
- self.devid = _devid
- self.monkey_dev.connect()
- self.random_count = int(_wrap.get_random_count())
- self.result_path = _wrap.get_result_dirpath(_devid)
- self.back_count = _wrap.get_back_count()
-
- if _wrap.get_record_file():
- self.rec_file = open(_wrap.get_record_file(), 'w')
- else:
- self.rec_file = open(\
- os.path.join(self.result_path, \
- Constants.RECORD_FILE_NAME), 'w')
- threading.Thread.__init__(self)
-
- def run(self):
- for idx in range(self.random_count):
- x = random.uniform(0.0, 1.0)
- y = random.uniform(0.0, 1.0)
-
- self.rec_file.write("tap %s %s\n" % (x, y))
- self.monkey_dev.tap((x, y))
-
- if self.back_count and idx >= int(self.back_count):
- if idx % int(self.back_count) == 0:
- self.rec_file.write("pressBack\n")
- self.monkey_dev.pressBack()
-
- SdbManager.exportDumpFiles(self.devid, \
- os.path.join(self.result_path, 'random'))
- self.monkey_dev.disconnect()
- self.rec_file.close()
-
-
-class ReplayExecutor(threading.Thread):
- def __init__(self, _devid, _wrap):
- self.monkey_dev = Device(_devid, _wrap.get_debug_file(), \
- _wrap.get_key_dev(), _wrap.get_touch_dev(), \
- _wrap.get_mouse_dev())
- self.devid = _devid
- self.monkey_dev.connect()
- self.replay_filepath = _wrap.get_replay_file()
- self.replay_file = None
-
- self.result_path = _wrap.get_result_dirpath(_devid)
-
- if self.replay_filepath:
- self.replay_file = open(self.replay_filepath, 'r')
-
- threading.Thread.__init__(self)
-
- def run(self):
- while True:
- line = self.replay_file.readline()
- if not line:
- break
- msg = line.split()
- if msg[0].find('tap') > -1:
- self.monkey_dev.tap((float(msg[1]), float(msg[2])))
- elif msg[0].find('pressBack') > -1:
- self.monkey_dev.pressBack()
-
- self.replay_file.close()
- self.monkey_dev.disconnect()
- SdbManager.exportDumpFiles(self.devid, \
- os.path.join(self.result_path, 'replay'))
+++ /dev/null
-
-import os
-import datetime
-
-from optparse import *
-from constants import Constants
-
-
-def varnarg(option, opt_str, value, parser):
- """ parser srg"""
- value = []
- import re
- for arg in parser.rargs:
- if re.search('^--.+', arg) or re.search('^-[\D]', arg):
- break
- value.append(arg)
-
- del parser.rargs[:len(value)]
- setattr(parser.values, option.dest, value)
-
-
-class MonkeyWrapper:
- def __init__(self):
- self.options = None
- self.USAGE = "\n\""
-
- def print_usage(self):
- print self.USAGE
-
- def parse_options(self, argv):
- option_list = [
- make_option("--py-install", dest="python_install", \
- action="store_true", default=False, help=""),
- make_option("--random", dest="random_count", action="callback", \
- callback=varnarg, help=""),
- make_option("--record", dest="record_file", action="callback", \
- callback=varnarg, help=""),
- make_option("--debug", dest="debug_file", action="callback", \
- callback=varnarg, help=""),
- make_option("--replay", dest="replay_file", action="callback", \
- callback=varnarg, help=""),
- make_option("--key-dev", dest="key_device", action="callback", \
- callback=varnarg, help=""),
- make_option("--touch-dev", dest="touch_device", \
- action="callback", callback=varnarg, help=""),
- make_option("--mouse_dev", dest="mouse_device", \
- action="callback", callback=varnarg, help=""),
- make_option("--output", dest="result_dir", action="callback", \
- callback=varnarg, help=""),
- make_option("--back-key", dest="back_count", action="callback", \
- callback=varnarg, help="")
- ]
-
- # detect non-params
- if len(argv) == 1:
- pass
- argv.append("--help")
-
- PARSERS = OptionParser(option_list=option_list, usage=self.USAGE)
- (self.options, args) = PARSERS.parse_args()
-
- def is_py_install(self):
- return self.options.python_install
-
- def python_install(self, _devid):
- os.system('sdb -s %s root on' % _devid)
- curr_path = Constants.LIB_DIR
- os.system('sdb -s %s push %s %s' % (_devid, os.path.join(curr_path, 'libpython-2.7.1-1.7.armv7l.rpm'), '/tmp/'))
- os.system('sdb -s %s push %s %s' % (_devid, os.path.join(curr_path, 'python-2.7.1-1.4.armv7l.rpm'), '/tmp/'))
- os.system('sdb -s %s push %s %s' % (_devid, os.path.join(curr_path, 'python-base-2.7.1-1.7.armv7l.rpm'), '/tmp/'))
- os.system('sdb -s %s shell rpm -ivh /tmp/libpython-2.7.1-1.7.armv7l.rpm' % _devid)
- os.system('sdb -s %s shell rpm -ivh /tmp/python-base-2.7.1-1.7.armv7l.rpm' % _devid)
- os.system('sdb -s %s shell rpm -ivh /tmp/python-2.7.1-1.4.armv7l.rpm' % _devid)
-
- def get_replay_file(self):
- if self.options.replay_file:
- return self.options.replay_file[0]
- else:
- return None
-
- def get_record_file(self):
- if self.options.record_file:
- return self.options.record_file[0]
- else:
- return None
-
- def get_random_count(self):
- return self.options.random_count[0]
-
- def get_back_count(self):
- if self.options.back_count:
- return self.options.back_count[0]
- else:
- return None
-
- def get_debug_file(self):
- if self.options.debug_file:
- return self.options.debug_file[0]
- else:
- return None
-
- def get_key_dev(self):
- if self.options.key_device:
- return self.options.key_device[0]
- else:
- return None
-
- def get_touch_dev(self):
- if self.options.touch_device:
- return str(self.options.touch_device[0])
- else:
- return None
-
- def get_mouse_dev(self):
- if self.options.mouse_device:
- self.options.mouse_device[0]
- else:
- return None
-
- def is_random_mode(self):
- if self.options.random_count and self.options.random_count[0] > 0:
- return True
- else:
- return False
-
- def is_replay_mode(self):
- if self.options.replay_file:
- return True
- else:
- return False
-
- def get_result_dirpath(self, _devid):
- curr_time = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S')
- result_path = os.path.join(Constants.RESULT_DIR, _devid, curr_time)
- if not os.path.exists(result_path):
- os.makedirs(result_path)
-
- return result_path
+++ /dev/null
-
-import os
-import time
-import subprocess
-
-from constants import Constants
-
-class SdbManager:
-
- @staticmethod
- def sdbCommand(command, timeout=90):
- #LOGGER.debug("sdbCommand : %s" % command)
- proc = subprocess.Popen(command,
- shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- time_out = 0
- while time_out < timeout:
- exit_code = proc.poll()
- if exit_code is not None:
- break
- time_out += 0.5
- time.sleep(0.5)
- if exit_code is None:
- pass
- #LOGGER.error("sdb time out,kill subprocess...")
- #killall(proc.pid)
-
- return exit_code, proc.stdout, proc.stderr
-
-
- @staticmethod
- def sdbDevices():
- dev_cmd = "sdb devices"
- start_server_cmd = "sdb start-server"
- SdbManager.sdbCommand(start_server_cmd, 8)
- exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(dev_cmd, 5)
-
- return re_stdout.read()
-
-
- @staticmethod
- def checkDirExist(_devid, _dirname):
- existed = True
- lscmd = Constants.SDB_LS % _devid + " " + _dirname
- exit_code, std_out, std_err = SdbManager.sdbCommand(lscmd)
- out_log = std_out.read()
- if out_log and out_log.find("No such file or directory") > -1:
- existed = False
- return existed
-
- @staticmethod
- def sdbShell(deviceId, cmd):
- shell_cmd = Constants.SDB_SHELL % deviceId + " " + cmd
- exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(shell_cmd)
-
- if exit_code is None:
- return False
- else:
- outLog = re_stdout.read()
- if outLog and outLog.find('command not found') > -1:
- return False
-
- return outLog
-
- @staticmethod
- def exportDumpFiles(_devid, _resultDir):
- dumpPath = os.path.join(_resultDir, "dump")
- if not os.path.exists(dumpPath):
- os.makedirs(dumpPath)
- remote = Constants.DUMP_DIR_PATH
- SdbManager.sdbPull(_devid, remote, dumpPath)
- SdbManager.sdbShell(_devid, 'rm -rf ' + remote)
-
-
- @staticmethod
- def sdbPull(_devid, remote, local):
- rmtFileCheck_cmd = Constants.SDB_SHELL % _devid + " " \
- + Constants.FILE_FOUND_SCRIPT % remote
- exit_code, re_stdout, re_stderr = \
- SdbManager.sdbCommand(rmtFileCheck_cmd)
-
- if exit_code is None:
- return False
-
- pull_cmd = Constants.SDB_PULL % _devid + " " + remote + " " + local
- exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(pull_cmd)
-
- if exit_code is None:
- return False
-
- if Constants.checkFileExists(local) is False:
- return False
- else:
- pass
-
- return True
-
-
-
+++ /dev/null
-#!/bin/bash
-
-THE_CLASSPATH=
-for i in `ls /opt/tools/manager/lib/*.jar`
-do
- THE_CLASSPATH=${THE_CLASSPATH}:${i}
-done
-
-
-java -cp /opt/tools/manager/config/:${THE_CLASSPATH} org.tizen.tct.tool.mgr.PackageList "${@}"
-chmod 777 /opt/tools/manager/tmp/
+++ /dev/null
-TCT 2.3 Release Notes\r
-\r
-1. Content overview\r
- +----doc\r
- |---- Web_TCT_2.3_Behavior_Test_Tool_User_Guide_v1.0.pdf\r
- |---- Web_TCT_2.3_Manager_User_Guide_v1.0.pdf\r
- |---- Web_TCT_2.3_Shell_User_Guide_v1.0.pdf\r
- |---- Web_TCT_2.3_TestSuite_Packaging_Guide_v1.0.pdf\r
- |---- Web_TCT_2.3_Tool_Packaging_Guide_v1.0.pdf\r
- |---- Web_TCT_2.3_Tool_Packaging_Ubuntu_Guide_v1.0.pdf\r
- |---- Web_TCT_2.3_User_Guide_v1.0.pdf\r
- |---- RELEASE_NOTES\r
- +----package\r
- +---- common\r
- +---- mobile\r
- +---- wearable\r
- +---- pkg_infos\r
- +----resource\r
- |---- getCap.wgt\r
- |---- tct-testconfig-2.3-1.zip\r
- |---- org.tizen.datacontrolprovider-1.0.0-arm.tpk\r
- |---- org.tizen.datacontrolprovider-1.0.0-i386.tpk\r
- +---- testkit-stub\r
- +---- tinyweb subdirectory\r
- +----tools\r
- |---- healthcheck.ini\r
- |---- full_pkg_generator\r
- |---- tct-config-device.py\r
- |---- tct-config-host.py\r
- |---- tct-shell\r
- |---- testkit-lite\r
- |---- tct-mgr\r
- +---- sdb\r
- +---- shell\r
- +---- testkitlite\r
- +---- manager\r
- +---- tct-manager related files\r
-\r
-2 Getting started\r
-\r
-2.1 TCT tools overview\r
-Tizen Compliance Tests (TCT) tools consist of these components:\r
-* Web TCT Manager: A java GUI tool that runs on the host machine, allowing users to create a test execution plan, trigger test execution, and view the test report.\r
-* Web TCT Shell: A lightweight console tool that runs on the host machine, allowing users to trigger TCT testing with an existing test plan, or a package list, or a test case ID.\r
-* Web TCT Behavior Test Tool: A device behavior checker developed using jQuery.\r
-\r
-2.2 Setting up the environment and installing the tools\r
-Follow instructions in doc/Web_TCT_2.3_User_Guide_v1.0.pdf to set up the environment of both the host and the device, and to install the tools.\r
-\r
-2.3 Using the tools\r
-Consult these documents below for detailed usage information:\r
-* doc/Web_TCT_Manager_2.3_User_Guide_v1.0.pdf\r
-* doc/Web_TCT_Shell_2.3_User_Guide_v1.0.pdf\r
-* doc/Web_TCT_Behavior_Test_Tool_2.3_User_Guide_v1.0.pdf\r
-\r
-3. Contacting us\r
-We're counting on your feedback to further improve our tools. In the meantime, we'll help you out if you encounter any problems. Please contact cathy.shen@intel.com if you'd like to get help, offer feedback, or contribute new ideas.\r
-\r
-4. Upcoming features and enhancements\r
-Upcoming features and enhancements include:\r
-* Manual test cases will be automated, as much as possible, to save execution effort.\r
-* TCT tools and cases will be modified according to TCS changes and feedback.\r
-* Manual case support for Web TCT Shell and the "--manual" command option are placeholders, currently.\r
-\r
+++ /dev/null
-log4j.rootLogger=INFO,CONSOLE,FILE, ROLLING_FILE
-#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
-log4j.addivity.org.apache=true
-###################
-# Console Appender
-###################
-log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
-log4j.appender.Threshold=DEBUG
-log4j.appender.CONSOLE.Target=System.out
-log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
-log4j.appender.CONSOLE.layout.ConversionPattern=[%p]-%d-[%t] %c (%F:%L) - %m%n
-#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
-#####################
-# File Appender
-#####################
-log4j.appender.FILE=org.apache.log4j.FileAppender
-log4j.appender.FILE.File=/opt/tools/manager/log/file.log
-log4j.appender.FILE.Append=false
-log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
-#log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
-log4j.appender.FILE.layout.ConversionPattern=[%p]-%d-[%t] %c (%F:%L) - %m%n
-########################
-# Rolling File
-########################
-log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
-log4j.appender.ROLLING_FILE.Threshold=ERROR
-log4j.appender.ROLLING_FILE.File=/opt/tools/manager/log/rolling.log
-log4j.appender.ROLLING_FILE.Append=true
-log4j.appender.ROLLING_FILE.MaxFileSize=10KB
-log4j.appender.ROLLING_FILE.MaxBackupIndex=1
-log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
-#log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
-log4j.appender.ROLLING_FILE.layout.ConversionPattern=[%p]-%d-[%t] %c (%F:%L) - %m%n
+++ /dev/null
-TIZENV=tizen_web_2.3,tizen_native_2.3,tizen_web_2.3.1,tizen_native_2.3.1,tizen_web_2.3.2,tizen_native_2.3.2,tizen_web_2.4,tizen_native_2.4,tizen_web_3.0,tizen_native_3.0,tizen_csharp_3.0,tizen_web_4.0,tizen_native_4.0,tizen_csharp_4.0,tizen_web_5.0,tizen_native_5.0,tizen_csharp_5.0,tizen_web_5.5,tizen_native_5.5,tizen_csharp_5.5
-PROFILE=mobile,wearable,tv,common_iot
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_mobile" profile="mobile">\r
- <execute_type>All</execute_type>\r
- <suite name="tct-webdatabase-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>247</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>247</total_tcn>\r
- <pkg_name>mobile/tct-webdatabase-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>141</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>159</total_tcn>\r
- <pkg_name>mobile/tct-multicolumn-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-mms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>123</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>123</total_tcn>\r
- <pkg_name>mobile/tct-messaging-mms-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>86</total_tcn>\r
- <pkg_name>mobile/tct-workers-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-email-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>308</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>309</total_tcn>\r
- <pkg_name>mobile/tct-messaging-email-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>470</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>470</total_tcn>\r
- <pkg_name>mobile/tct-time-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>151</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>151</total_tcn>\r
- <pkg_name>mobile/tct-forms-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>98</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>101</total_tcn>\r
- <pkg_name>mobile/tct-fileapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-ext01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>64</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>64</total_tcn>\r
- <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>133</auto_tcn>\r
- <manual_tcn>78</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>mobile/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>mobile/tct-privilege-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>mobile/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>mobile/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>176</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>176</total_tcn>\r
- <pkg_name>mobile/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>12</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>93</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>94</total_tcn>\r
- <pkg_name>mobile/tct-notification-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fmradio-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>67</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>74</total_tcn>\r
- <pkg_name>mobile/tct-fmradio-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>mobile/tct-appcache-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystemapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>208</total_tcn>\r
- <pkg_name>mobile/tct-filesystemapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>9</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>270</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>270</total_tcn>\r
- <pkg_name>mobile/tct-websocket-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>28</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>548</auto_tcn>\r
- <manual_tcn>25</manual_tcn>\r
- <total_tcn>573</total_tcn>\r
- <pkg_name>mobile/tct-extra-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>mobile/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>29</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>400</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>400</total_tcn>\r
- <pkg_name>mobile/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>73</total_tcn>\r
- <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-networkbearerselection-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>mobile/tct-networkbearerselection-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>41</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-push-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>mobile/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-browserstate-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>262</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>262</total_tcn>\r
- <pkg_name>mobile/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>80</total_tcn>\r
- <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>mobile/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>195</auto_tcn>\r
- <manual_tcn>35</manual_tcn>\r
- <total_tcn>230</total_tcn>\r
- <pkg_name>mobile/tct-nfc-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contact-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>441</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>441</total_tcn>\r
- <pkg_name>mobile/tct-contact-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>245</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>245</total_tcn>\r
- <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-notification-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>82</manual_tcn>\r
- <total_tcn>150</total_tcn>\r
- <pkg_name>mobile/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>mobile/tct-websetting-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>333</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>334</total_tcn>\r
- <pkg_name>mobile/tct-audio-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>mobile/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>184</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>192</total_tcn>\r
- <pkg_name>mobile/tct-application-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>257</auto_tcn>\r
- <manual_tcn>142</manual_tcn>\r
- <total_tcn>399</total_tcn>\r
- <pkg_name>mobile/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>mobile/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>131</manual_tcn>\r
- <total_tcn>142</total_tcn>\r
- <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-ui01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>19</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>422</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>422</total_tcn>\r
- <pkg_name>mobile/tct-webaudio-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filewriterapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>mobile/tct-filewriterapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>119</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>119</total_tcn>\r
- <pkg_name>mobile/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>mobile/tct-secureelement-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>56</total_tcn>\r
- <pkg_name>mobile/tct-power-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>65</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>65</total_tcn>\r
- <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-account-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>mobile/tct-account-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>mobile/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bookmark-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>mobile/tct-bookmark-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>mobile/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>354</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>354</total_tcn>\r
- <pkg_name>mobile/tct-calendar-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>148</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>149</total_tcn>\r
- <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>113</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>113</total_tcn>\r
- <pkg_name>mobile/tct-datacontrol-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-appcontrol-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-callhistory-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>27</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>mobile/tct-callhistory-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>846</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>864</total_tcn>\r
- <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>44</total_tcn>\r
- <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-testconfig" launcher="WRTLauncher">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>20</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>common/tct-testconfig-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>68</total_tcn>\r
- <pkg_name>mobile/tct-sse-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>33</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacontroller-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>162</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>165</total_tcn>\r
- <pkg_name>mobile/tct-mediacontroller-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests03" category="Web UI Framework">\r
- <auto_tcn>179</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>179</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests03-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests04" category="Web UI Framework">\r
- <auto_tcn>375</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>375</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests04-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>304</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>304</total_tcn>\r
- <pkg_name>mobile/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests05" category="Web UI Framework">\r
- <auto_tcn>322</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>322</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests05-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>289</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>292</total_tcn>\r
- <pkg_name>mobile/tct-filesystem-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests06" category="Web UI Framework">\r
- <auto_tcn>98</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>98</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests06-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests01" category="Web UI Framework">\r
- <auto_tcn>355</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>355</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests01-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests02" category="Web UI Framework">\r
- <auto_tcn>455</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>455</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests02-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-sms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>184</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>184</total_tcn>\r
- <pkg_name>mobile/tct-messaging-sms-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>177</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>181</total_tcn>\r
- <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-behavior-tests">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>30</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-behavior-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>mobile/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>541</auto_tcn>\r
- <manual_tcn>74</manual_tcn>\r
- <total_tcn>615</total_tcn>\r
- <pkg_name>mobile/tct-backgrounds-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>361</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>365</total_tcn>\r
- <pkg_name>mobile/tct-video-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>889</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>889</total_tcn>\r
- <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_mobile" profile="mobile">\r
- <execute_type>All</execute_type>\r
- <suite name="tct-webdatabase-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>247</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>247</total_tcn>\r
- <pkg_name>mobile/tct-webdatabase-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>141</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>159</total_tcn>\r
- <pkg_name>mobile/tct-multicolumn-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-mms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>123</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>123</total_tcn>\r
- <pkg_name>mobile/tct-messaging-mms-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>86</total_tcn>\r
- <pkg_name>mobile/tct-workers-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-email-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>308</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>309</total_tcn>\r
- <pkg_name>mobile/tct-messaging-email-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>470</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>470</total_tcn>\r
- <pkg_name>mobile/tct-time-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>151</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>151</total_tcn>\r
- <pkg_name>mobile/tct-forms-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>98</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>101</total_tcn>\r
- <pkg_name>mobile/tct-fileapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-ext01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>64</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>64</total_tcn>\r
- <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>133</auto_tcn>\r
- <manual_tcn>78</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>mobile/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>mobile/tct-privilege-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>mobile/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>mobile/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>176</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>176</total_tcn>\r
- <pkg_name>mobile/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>12</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>93</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>94</total_tcn>\r
- <pkg_name>mobile/tct-notification-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fmradio-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>67</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>74</total_tcn>\r
- <pkg_name>mobile/tct-fmradio-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>mobile/tct-appcache-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystemapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>208</total_tcn>\r
- <pkg_name>mobile/tct-filesystemapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>9</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>270</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>270</total_tcn>\r
- <pkg_name>mobile/tct-websocket-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>28</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>548</auto_tcn>\r
- <manual_tcn>25</manual_tcn>\r
- <total_tcn>573</total_tcn>\r
- <pkg_name>mobile/tct-extra-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>mobile/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>29</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>400</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>400</total_tcn>\r
- <pkg_name>mobile/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>73</total_tcn>\r
- <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-networkbearerselection-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>mobile/tct-networkbearerselection-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>41</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-push-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>mobile/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-browserstate-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>262</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>262</total_tcn>\r
- <pkg_name>mobile/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>80</total_tcn>\r
- <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>mobile/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>195</auto_tcn>\r
- <manual_tcn>35</manual_tcn>\r
- <total_tcn>230</total_tcn>\r
- <pkg_name>mobile/tct-nfc-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contact-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>441</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>441</total_tcn>\r
- <pkg_name>mobile/tct-contact-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>245</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>245</total_tcn>\r
- <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-notification-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>82</manual_tcn>\r
- <total_tcn>150</total_tcn>\r
- <pkg_name>mobile/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>mobile/tct-websetting-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>333</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>334</total_tcn>\r
- <pkg_name>mobile/tct-audio-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>mobile/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>184</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>192</total_tcn>\r
- <pkg_name>mobile/tct-application-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>257</auto_tcn>\r
- <manual_tcn>142</manual_tcn>\r
- <total_tcn>399</total_tcn>\r
- <pkg_name>mobile/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>mobile/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>131</manual_tcn>\r
- <total_tcn>142</total_tcn>\r
- <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-ui01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>19</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>422</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>422</total_tcn>\r
- <pkg_name>mobile/tct-webaudio-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filewriterapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>mobile/tct-filewriterapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>119</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>119</total_tcn>\r
- <pkg_name>mobile/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>mobile/tct-secureelement-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>56</total_tcn>\r
- <pkg_name>mobile/tct-power-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>65</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>65</total_tcn>\r
- <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-account-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>mobile/tct-account-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>mobile/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bookmark-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>mobile/tct-bookmark-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>mobile/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>354</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>354</total_tcn>\r
- <pkg_name>mobile/tct-calendar-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>148</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>149</total_tcn>\r
- <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>113</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>113</total_tcn>\r
- <pkg_name>mobile/tct-datacontrol-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-appcontrol-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-callhistory-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>27</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>mobile/tct-callhistory-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>846</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>864</total_tcn>\r
- <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>44</total_tcn>\r
- <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-testconfig" launcher="WRTLauncher">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>20</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>common/tct-testconfig-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>68</total_tcn>\r
- <pkg_name>mobile/tct-sse-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>33</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacontroller-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>162</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>165</total_tcn>\r
- <pkg_name>mobile/tct-mediacontroller-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests03" category="Web UI Framework">\r
- <auto_tcn>179</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>179</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests03-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests04" category="Web UI Framework">\r
- <auto_tcn>375</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>375</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests04-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>304</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>304</total_tcn>\r
- <pkg_name>mobile/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests05" category="Web UI Framework">\r
- <auto_tcn>322</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>322</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests05-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>289</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>292</total_tcn>\r
- <pkg_name>mobile/tct-filesystem-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests06" category="Web UI Framework">\r
- <auto_tcn>98</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>98</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests06-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests01" category="Web UI Framework">\r
- <auto_tcn>355</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>355</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests01-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests02" category="Web UI Framework">\r
- <auto_tcn>455</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>455</total_tcn>\r
- <pkg_name>mobile/tct-webuifw-tests02-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-sms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>184</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>184</total_tcn>\r
- <pkg_name>mobile/tct-messaging-sms-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>177</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>181</total_tcn>\r
- <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-behavior-tests">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>30</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-behavior-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>mobile/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>541</auto_tcn>\r
- <manual_tcn>74</manual_tcn>\r
- <total_tcn>615</total_tcn>\r
- <pkg_name>mobile/tct-backgrounds-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>361</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>365</total_tcn>\r
- <pkg_name>mobile/tct-video-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>889</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>889</total_tcn>\r
- <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_tv" profile="tv">\r
- <execute_type>All</execute_type>\r
- <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>141</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>159</total_tcn>\r
- <pkg_name>tv/tct-multicolumn-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>86</total_tcn>\r
- <pkg_name>tv/tct-workers-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>459</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>459</total_tcn>\r
- <pkg_name>tv/tct-time-tizen-tests-2.4-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>146</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>146</total_tcn>\r
- <pkg_name>tv/tct-forms-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>97</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>97</total_tcn>\r
- <pkg_name>tv/tct-fileapi-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-ext01-wrt-tests-2.3-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tv-channel-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>123</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>123</total_tcn>\r
- <pkg_name>tv/tct-tv-channel-tizen-tests-2.4-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>63</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>63</total_tcn>\r
- <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>133</auto_tcn>\r
- <manual_tcn>78</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>common/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>common/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>175</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>175</total_tcn>\r
- <pkg_name>tv/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>12</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>tv/tct-appcache-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>9</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>28</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>268</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>268</total_tcn>\r
- <pkg_name>tv/tct-websocket-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>544</auto_tcn>\r
- <manual_tcn>25</manual_tcn>\r
- <total_tcn>569</total_tcn>\r
- <pkg_name>tv/tct-extra-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>tv/tct-fullscreen-nonw3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>29</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>391</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>391</total_tcn>\r
- <pkg_name>tv/tct-indexeddb-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>73</total_tcn>\r
- <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>tv/tct-browserstate-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>202</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>202</total_tcn>\r
- <pkg_name>tv/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>tv/tct-navigationtiming-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>80</total_tcn>\r
- <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>common/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>tv/tct-pagevisibility-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>230</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>230</total_tcn>\r
- <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>tv/tct-notification-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tv-displaycontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>tv/tct-tv-displaycontrol-tizen-tests-2.4-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>51</manual_tcn>\r
- <total_tcn>69</total_tcn>\r
- <pkg_name>tv/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>tv/tct-websetting-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>338</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>339</total_tcn>\r
- <pkg_name>common/tct-audio-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>tv/tct-screenorientation-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>common/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>159</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>165</total_tcn>\r
- <pkg_name>tv/tct-application-tizen-tests-2.3-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>47</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>47</total_tcn>\r
- <pkg_name>common/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>131</manual_tcn>\r
- <total_tcn>142</total_tcn>\r
- <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>tv/tct-ui01-wrt-tests-2.4-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dynamicbox-wrt-tests" category="Web Runtime">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>common/tct-dynamicbox-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tv-window-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>70</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>70</total_tcn>\r
- <pkg_name>tv/tct-tv-window-tizen-tests-2.4-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>422</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>422</total_tcn>\r
- <pkg_name>tv/tct-webaudio-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>100</auto_tcn>\r
- <manual_tcn>19</manual_tcn>\r
- <total_tcn>119</total_tcn>\r
- <pkg_name>common/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>56</total_tcn>\r
- <pkg_name>common/tct-power-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tv-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>tv/tct-tv-inputdevice-tizen-tests-2.4-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>70</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>70</total_tcn>\r
- <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tv-audiocontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>tv/tct-tv-audiocontrol-tizen-tests-2.4-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>75</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>tv/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>209</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>212</total_tcn>\r
- <pkg_name>common/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>148</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>149</total_tcn>\r
- <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>846</auto_tcn>\r
- <manual_tcn>19</manual_tcn>\r
- <total_tcn>865</total_tcn>\r
- <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>44</total_tcn>\r
- <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-testconfig" launcher="WRTLauncher">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>19</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>common/tct-testconfig-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>68</total_tcn>\r
- <pkg_name>tv/tct-sse-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>33</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests03" category="Web UI Framework">\r
- <auto_tcn>179</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>179</total_tcn>\r
- <pkg_name>tv/tct-webuifw-tests03-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests04" category="Web UI Framework">\r
- <auto_tcn>375</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>375</total_tcn>\r
- <pkg_name>tv/tct-webuifw-tests04-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-maxLength-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests05" category="Web UI Framework">\r
- <auto_tcn>322</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>322</total_tcn>\r
- <pkg_name>tv/tct-webuifw-tests05-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>291</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>294</total_tcn>\r
- <pkg_name>tv/tct-filesystem-tizen-tests-2.3-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>276</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>276</total_tcn>\r
- <pkg_name>tv/tct-systeminfo-tizen-tests-2.3-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests06" category="Web UI Framework">\r
- <auto_tcn>98</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>98</total_tcn>\r
- <pkg_name>tv/tct-webuifw-tests06-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests01" category="Web UI Framework">\r
- <auto_tcn>355</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>355</total_tcn>\r
- <pkg_name>tv/tct-webuifw-tests01-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests02" category="Web UI Framework">\r
- <auto_tcn>455</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>455</total_tcn>\r
- <pkg_name>tv/tct-webuifw-tests02-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>common/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-behavior-tests">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>tv/tct-behavior-tests-2.4-1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>177</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>181</total_tcn>\r
- <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>52</total_tcn>\r
- <pkg_name>tv/tct-mediaqueries-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>common/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>541</auto_tcn>\r
- <manual_tcn>74</manual_tcn>\r
- <total_tcn>615</total_tcn>\r
- <pkg_name>tv/tct-backgrounds-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>366</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>370</total_tcn>\r
- <pkg_name>tv/tct-video-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>889</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>889</total_tcn>\r
- <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_wearable" profile="wearable">\r
- <execute_type>All</execute_type>\r
- <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>63</manual_tcn>\r
- <total_tcn>131</total_tcn>\r
- <pkg_name>wearable/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>338</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>339</total_tcn>\r
- <pkg_name>common/tct-audio-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>common/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>86</total_tcn>\r
- <pkg_name>wearable/tct-workers-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>159</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>165</total_tcn>\r
- <pkg_name>wearable/tct-application-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>47</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>47</total_tcn>\r
- <pkg_name>common/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>214</auto_tcn>\r
- <manual_tcn>44</manual_tcn>\r
- <total_tcn>258</total_tcn>\r
- <pkg_name>common/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>131</manual_tcn>\r
- <total_tcn>142</total_tcn>\r
- <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>wearable/tct-ui01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dynamicbox-wrt-tests" category="Web Runtime">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>common/tct-dynamicbox-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>146</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>146</total_tcn>\r
- <pkg_name>wearable/tct-forms-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>470</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>470</total_tcn>\r
- <pkg_name>wearable/tct-time-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>98</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>101</total_tcn>\r
- <pkg_name>wearable/tct-fileapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-ext01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>63</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>63</total_tcn>\r
- <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>133</auto_tcn>\r
- <manual_tcn>78</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>common/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>119</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>119</total_tcn>\r
- <pkg_name>common/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
- <auto_tcn>142</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>142</total_tcn>\r
- <pkg_name>wearable/tct-privilege-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>56</total_tcn>\r
- <pkg_name>common/tct-power-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>66</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>common/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>175</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>175</total_tcn>\r
- <pkg_name>wearable/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>12</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>wearable/tct-notification-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>wearable/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>9</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>209</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>212</total_tcn>\r
- <pkg_name>common/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>148</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>149</total_tcn>\r
- <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>268</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>268</total_tcn>\r
- <pkg_name>wearable/tct-websocket-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>28</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>544</auto_tcn>\r
- <manual_tcn>25</manual_tcn>\r
- <total_tcn>569</total_tcn>\r
- <pkg_name>wearable/tct-extra-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>29</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>391</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>391</total_tcn>\r
- <pkg_name>wearable/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>73</total_tcn>\r
- <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>83</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>83</total_tcn>\r
- <pkg_name>wearable/tct-camera-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>44</total_tcn>\r
- <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>846</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>864</total_tcn>\r
- <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-testconfig" launcher="WRTLauncher">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>19</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>common/tct-testconfig-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>202</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>202</total_tcn>\r
- <pkg_name>wearable/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>281</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>281</total_tcn>\r
- <pkg_name>wearable/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>289</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>289</total_tcn>\r
- <pkg_name>wearable/tct-filesystem-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>80</total_tcn>\r
- <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>common/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>common/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>wearable/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-behavior-tests">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>19</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>wearable/tct-behavior-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>177</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>181</total_tcn>\r
- <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests" category="Web UI Framework">\r
- <auto_tcn>524</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>524</total_tcn>\r
- <pkg_name>wearable/tct-webuifw-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>52</total_tcn>\r
- <pkg_name>wearable/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>230</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>230</total_tcn>\r
- <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>common/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>366</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>370</total_tcn>\r
- <pkg_name>wearable/tct-video-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>541</auto_tcn>\r
- <manual_tcn>74</manual_tcn>\r
- <total_tcn>615</total_tcn>\r
- <pkg_name>wearable/tct-backgrounds-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>889</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>889</total_tcn>\r
- <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-function getScrollTop() {
- return f_scrollTop();
-}
-
-function f_scrollTop() {
- return f_filterResults($(window) ? $(window).scrollTop() : 0,
- document.documentElement ? document.documentElement.scrollTop : 0,
- document.body ? document.body.scrollTop : 0);
-}
-function f_filterResults(n_win, n_docel, n_body) {
- var n_result = n_win ? n_win : 0;
- if (n_docel && (!n_result || (n_result > n_docel)))
- n_result = n_docel;
- return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
-}
-
-function setScrollTop() {
- $(window) ? $(window).scrollTop(0) : 0;
- document.documentElement ? document.documentElement.scrollTop = 0 : 0;
- document.body ? document.body.scrollTop = 0 : 0;
-}
-
-function goTopEx() {
- $node = $('#goTopBtn');
- if (getScrollTop() > 0) {
- $node.show();
- } else {
- $node.hide();
- }
-
- $(window).scroll(function() {
- if (getScrollTop() > 0) {
- $node.show();
- } else {
- $node.hide();
- }
- });
-
- $node.click(function() {
- setScrollTop();
- });
-}
-
-function drawRatio() {
- $('.suite_item').each(function(i, node) {
- drawSuiteRatio(node)
- });
-}
-
-$(".see_all").click(function(){
- $("#see_all").show();
- $("#see_fail").hide();
- $("#see_block").hide();
- $("#see_na").hide();
- updateToggles();
- return false;
-});
-
-$(".see_failed").click(function(){
- $("#see_all").hide();
- $("#see_fail").show();
- $("#see_block").hide();
- $("#see_na").hide();
- updateToggles();
- return false;
-});
-
-$(".see_blocked").click(function(){
- $("#see_all").hide();
- $("#see_fail").hide();
- $("#see_block").show();
- $("#see_na").hide();
- updateToggles();
- return false;
-});
-
-$(".see_na").click(function(){
- $("#see_all").hide();
- $("#see_fail").hide();
- $("#see_block").hide();
- $("#see_na").show();
- updateToggles();
- return false;
-});
-
-$("a.test_case_popup").click(function(){
- var $this = $(this);
- Popup.show($this.attr('id'));
- return false;
-});
-
-$(".see_capabilities").click(function(){
- if ($('#capability_table').css('display') == 'none') {
- $("#capability_table").show();
- }else{
- $("#capability_table").hide();
- }
- return false;
-});
-
-function drawSuiteRatio(node) {
- arrTitle = new Array("Passed", "Failed", "Blocked", "Not Executed");
- var $node = $(node);
- var $total = $node.find('.total');
- var $pass = $node.find('.pass');
- var $fail = $node.find('.fail');
- var $block = $node.find('.block');
- var $na = $node.find('.na');
- var $div = $node.find('.RatioGraphic');
-
- var total_int = parseInt($total.text());
- var pass_int = parseInt($pass.text());
- var fail_int = parseInt($fail.text());
- var block_int = parseInt($block.text());
- var na_int = parseInt($na.text());
-
- var pass_rate = pass_int * 100 / total_int;
- var fail_rate = fail_int * 100 / total_int;
- var block_rate = block_int * 100 / total_int;
- var na_rate = na_int * 100 / total_int;
-
- var areaWidth = 380;
-
- var pass_width = areaWidth * pass_rate / 100;
- var fail_width = areaWidth * fail_rate / 100;
- var block_width = areaWidth * block_rate / 100;
- var na_width = areaWidth * na_rate / 100;
-
- pass_rate = pass_rate.toFixed(2);
- fail_rate = fail_rate.toFixed(2);
- block_rate = block_rate.toFixed(2);
- na_rate = na_rate.toFixed(2);
-
- var pass_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/blue.jpg");"
- var fail_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/red.jpg");"
- var block_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/orange.jpg");"
- var na_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/gray.jpg");"
-
- var html = "<table width=\"380.68\" align=\"center\"><tbody><tr>";
- if (pass_width > 0){
- html += "<td width=\""
- + pass_width
- + "\" style=\""
- + pass_style
- + "\" title=\"Passed :"
- + pass_rate
- + "%\">";
- if (pass_width > 20){
- html += pass_rate + "%"
- }
- html += "</td>";
- }
- if (fail_width > 0){
- html += "<td width=\""
- + fail_width
- + "\" style=\""
- + fail_style
- + "\" title=\"Failed :"
- + fail_rate
- + "%\">";
- if (fail_width > 20){
- html += fail_rate + "%"
- }
- html += "</td>";
- }
- if (block_width > 0){
- html += "<td width=\""
- + block_width
- + "\" style=\""
- + block_style
- + "\" title=\"Blocked :"
- + block_rate
- + "%\">";
- if (block_width > 20){
- html += block_rate + "%"
- }
- html += "</td>";
- }
- if (na_width > 0){
- html += "<td width=\""
- + na_width
- + "\" style=\""
- + na_style
- + "\" title=\"Blocked :"
- + na_rate
- + "%\">";
- if (na_width > 20){
- html += na_rate + "%"
- }
- html += "</td>";
- }
- html += "</tr></tbody></table>";
- $div.html(html);
-}
+++ /dev/null
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
-f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
-{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
+++ /dev/null
-/**
- * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
- *
- * Dual licensed under the MIT and GPL licenses.
- * This basically means you can use this code however you want for
- * free, but don't claim to have written it yourself!
- * Donations always accepted: http://www.JavascriptToolbox.com/donate/
- *
- * Please do not link to the .js files on javascripttoolbox.com from
- * your site. Copy the files locally to your server instead.
- *
- */
-/* ******************************************************************* */
-/* UTIL FUNCTIONS */
-/* ******************************************************************* */
-var Util = {'$VERSION':1.06};
-
-// Util functions - these are GLOBAL so they
-// look like built-in functions.
-
-// Determine if an object is an array
-function isArray(o) {
- return (o!=null && typeof(o)=="object" && typeof(o.length)=="number" && (o.length==0 || defined(o[0])));
-};
-
-// Determine if an object is an Object
-function isObject(o) {
- return (o!=null && typeof(o)=="object" && defined(o.constructor) && o.constructor==Object && !defined(o.nodeName));
-};
-
-// Determine if a reference is defined
-function defined(o) {
- return (typeof(o)!="undefined");
-};
-
-// Iterate over an array, object, or list of items and run code against each item
-// Similar functionality to Perl's map() function
-function map(func) {
- var i,j,o;
- var results = [];
- if (typeof(func)=="string") {
- func = new Function('$_',func);
- }
- for (i=1; i<arguments.length; i++) {
- o = arguments[i];
- if (isArray(o)) {
- for (j=0; j<o.length; j++) {
- results[results.length] = func(o[j]);
- }
- }
- else if (isObject(o)) {
- for (j in o) {
- results[results.length] = func(o[j]);
- }
- }
- else {
- results[results.length] = func(o);
- }
- }
- return results;
-};
-
-// Set default values in an object if they are undefined
-function setDefaultValues(o,values) {
- if (!defined(o) || o==null) {
- o = {};
- }
- if (!defined(values) || values==null) {
- return o;
- }
- for (var val in values) {
- if (!defined(o[val])) {
- o[val] = values[val];
- }
- }
- return o;
-};
-
-/* ******************************************************************* */
-/* DEFAULT OBJECT PROTOTYPE ENHANCEMENTS */
-/* ******************************************************************* */
-// These functions add useful functionality to built-in objects
-Array.prototype.contains = function(o) {
- var i,l;
- if (!(l = this.length)) { return false; }
- for (i=0; i<l; i++) {
- if (o==this[i]) {
- return true;
- }
- }
-};
-
-/* ******************************************************************* */
-/* DOM FUNCTIONS */
-/* ******************************************************************* */
-var DOM = (function() {
- var dom = {};
-
- // Get a parent tag with a given nodename
- dom.getParentByTagName = function(o,tagNames) {
- if(o==null) { return null; }
- if (isArray(tagNames)) {
- tagNames = map("return $_.toUpperCase()",tagNames);
- while (o=o.parentNode) {
- if (o.nodeName && tagNames.contains(o.nodeName)) {
- return o;
- }
- }
- }
- else {
- tagNames = tagNames.toUpperCase();
- while (o=o.parentNode) {
- if (o.nodeName && tagNames==o.nodeName) {
- return o;
- }
- }
- }
- return null;
- };
-
- // Remove a node from its parent
- dom.removeNode = function(o) {
- if (o!=null && o.parentNode && o.parentNode.removeChild) {
- // First remove all attributes which are func references, to avoid memory leaks
- for (var i in o) {
- if (typeof(o[i])=="function") {
- o[i] = null;
- }
- }
- o.parentNode.removeChild(o);
- return true;
- }
- return false;
- };
-
- // Get the outer width in pixels of an object, including borders, padding, and margin
- dom.getOuterWidth = function(o) {
- if (defined(o.offsetWidth)) {
- return o.offsetWidth;
- }
- return null;
- };
-
- // Get the outer height in pixels of an object, including borders, padding, and margin
- dom.getOuterHeight = function(o) {
- if (defined(o.offsetHeight)) {
- return o.offsetHeight;
- }
- return null;
- };
-
- // Resolve an item, an array of items, or an object of items
- dom.resolve = function() {
- var results = new Array();
- var i,j,o;
- for (var i=0; i<arguments.length; i++) {
- var o = arguments[i];
- if (o==null) {
- if (arguments.length==1) {
- return null;
- }
- results[results.length] = null;
- }
- else if (typeof(o)=='string') {
- if (document.getElementById) {
- o = document.getElementById(o);
- }
- else if (document.all) {
- o = document.all[o];
- }
- if (arguments.length==1) {
- return o;
- }
- results[results.length] = o;
- }
- else if (isArray(o)) {
- for (j=0; j<o.length; j++) {
- results[results.length] = o[j];
- }
- }
- else if (isObject(o)) {
- for (j in o) {
- results[results.length] = o[j];
- }
- }
- else if (arguments.length==1) {
- return o;
- }
- else {
- results[results.length] = o;
- }
- }
- return results;
- };
- dom.$ = dom.resolve;
-
- return dom;
-})();
-
-/* ******************************************************************* */
-/* CSS FUNCTIONS */
-/* ******************************************************************* */
-var CSS = (function(){
- var css = {};
-
- // Convert an RGB string in the form "rgb (255, 255, 255)" to "#ffffff"
- css.rgb2hex = function(rgbString) {
- if (typeof(rgbString)!="string" || !defined(rgbString.match)) { return null; }
- var result = rgbString.match(/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/);
- if (result==null) { return rgbString; }
- var rgb = +result[1] << 16 | +result[2] << 8 | +result[3];
- var hex = "";
- var digits = "0123456789abcdef";
- while(rgb!=0) {
- hex = digits.charAt(rgb&0xf)+hex;
- rgb>>>=4;
- }
- while(hex.length<6) { hex='0'+hex; }
- return "#" + hex;
- };
-
- // Convert hyphen style names like border-width to camel case like borderWidth
- css.hyphen2camel = function(property) {
- if (!defined(property) || property==null) { return null; }
- if (property.indexOf("-")<0) { return property; }
- var str = "";
- var c = null;
- var l = property.length;
- for (var i=0; i<l; i++) {
- c = property.charAt(i);
- str += (c!="-")?c:property.charAt(++i).toUpperCase();
- }
- return str;
- };
-
- // Determine if an object or class string contains a given class.
- css.hasClass = function(obj,className) {
- if (!defined(obj) || obj==null || !RegExp) { return false; }
- var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
- if (typeof(obj)=="string") {
- return re.test(obj);
- }
- else if (typeof(obj)=="object" && obj.className) {
- return re.test(obj.className);
- }
- return false;
- };
-
- // Add a class to an object
- css.addClass = function(obj,className) {
- if (typeof(obj)!="object" || obj==null || !defined(obj.className)) { return false; }
- if (obj.className==null || obj.className=='') {
- obj.className = className;
- return true;
- }
- if (css.hasClass(obj,className)) { return true; }
- obj.className = obj.className + " " + className;
- return true;
- };
-
- // Remove a class from an object
- css.removeClass = function(obj,className) {
- if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
- if (!css.hasClass(obj,className)) { return false; }
- var re = new RegExp("(^|\\s+)" + className + "(\\s+|$)");
- obj.className = obj.className.replace(re,' ');
- return true;
- };
-
- // Fully replace a class with a new one
- css.replaceClass = function(obj,className,newClassName) {
- if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
- css.removeClass(obj,className);
- css.addClass(obj,newClassName);
- return true;
- };
-
- // Get the currently-applied style of an object
- css.getStyle = function(o, property) {
- if (o==null) { return null; }
- var val = null;
- var camelProperty = css.hyphen2camel(property);
- // Handle "float" property as a special case
- if (property=="float") {
- val = css.getStyle(o,"cssFloat");
- if (val==null) {
- val = css.getStyle(o,"styleFloat");
- }
- }
- else if (o.currentStyle && defined(o.currentStyle[camelProperty])) {
- val = o.currentStyle[camelProperty];
- }
- else if (window.getComputedStyle) {
- val = window.getComputedStyle(o,null).getPropertyValue(property);
- }
- else if (o.style && defined(o.style[camelProperty])) {
- val = o.style[camelProperty];
- }
- // For color values, make the value consistent across browsers
- // Convert rgb() colors back to hex for consistency
- if (/^\s*rgb\s*\(/.test(val)) {
- val = css.rgb2hex(val);
- }
- // Lowercase all #hex values
- if (/^#/.test(val)) {
- val = val.toLowerCase();
- }
- return val;
- };
- css.get = css.getStyle;
-
- // Set a style on an object
- css.setStyle = function(o, property, value) {
- if (o==null || !defined(o.style) || !defined(property) || property==null || !defined(value)) { return false; }
- if (property=="float") {
- o.style["cssFloat"] = value;
- o.style["styleFloat"] = value;
- }
- else if (property=="opacity") {
- o.style['-moz-opacity'] = value;
- o.style['-khtml-opacity'] = value;
- o.style.opacity = value;
- if (defined(o.style.filter)) {
- o.style.filter = "alpha(opacity=" + value*100 + ")";
- }
- }
- else {
- o.style[css.hyphen2camel(property)] = value;
- }
- return true;
- };
- css.set = css.setStyle;
-
- // Get a unique ID which doesn't already exist on the page
- css.uniqueIdNumber=1000;
- css.createId = function(o) {
- if (defined(o) && o!=null && defined(o.id) && o.id!=null && o.id!="") {
- return o.id;
- }
- var id = null;
- while (id==null || document.getElementById(id)!=null) {
- id = "ID_"+(css.uniqueIdNumber++);
- }
- if (defined(o) && o!=null && (!defined(o.id)||o.id=="")) {
- o.id = id;
- }
- return id;
- };
-
- return css;
-})();
-
-/* ******************************************************************* */
-/* EVENT FUNCTIONS */
-/* ******************************************************************* */
-
-var Event = (function(){
- var ev = {};
-
- // Resolve an event using IE's window.event if necessary
- // --------------------------------------------------------------------
- ev.resolve = function(e) {
- if (!defined(e) && defined(window.event)) {
- e = window.event;
- }
- return e;
- };
-
- // Add an event handler to a function
- // Note: Don't use 'this' within functions added using this method, since
- // the attachEvent and addEventListener models differ.
- // --------------------------------------------------------------------
- ev.add = function( obj, type, fn, capture ) {
- if (obj.addEventListener) {
- obj.addEventListener( type, fn, capture );
- return true;
- }
- else if (obj.attachEvent) {
- obj.attachEvent( "on"+type, fn );
- return true;
- }
- return false;
- };
-
- // Get the mouse position of an event
- // --------------------------------------------------------------------
- // PageX/Y, where they exist, are more reliable than ClientX/Y because
- // of some browser bugs in Opera/Safari
- ev.getMouseX = function(e) {
- e = ev.resolve(e);
- if (defined(e.pageX)) {
- return e.pageX;
- }
- if (defined(e.clientX)) {
- return e.clientX+Screen.getScrollLeft();
- }
- return null;
- };
- ev.getMouseY = function(e) {
- e = ev.resolve(e);
- if (defined(e.pageY)) {
- return e.pageY;
- }
- if (defined(e.clientY)) {
- return e.clientY+Screen.getScrollTop();
- }
- return null;
- };
-
- // Stop the event from bubbling up to parent elements.
- // Two method names map to the same function
- // --------------------------------------------------------------------
- ev.cancelBubble = function(e) {
- e = ev.resolve(e);
- if (typeof(e.stopPropagation)=="function") { e.stopPropagation(); }
- if (defined(e.cancelBubble)) { e.cancelBubble = true; }
- };
- ev.stopPropagation = ev.cancelBubble;
-
- // Prevent the default handling of the event to occur
- // --------------------------------------------------------------------
- ev.preventDefault = function(e) {
- e = ev.resolve(e);
- if (typeof(e.preventDefault)=="function") { e.preventDefault(); }
- if (defined(e.returnValue)) { e.returnValue = false; }
- };
-
- return ev;
-})();
-
-/* ******************************************************************* */
-/* SCREEN FUNCTIONS */
-/* ******************************************************************* */
-var Screen = (function() {
- var screen = {};
-
- // Get a reference to the body
- // --------------------------------------------------------------------
- screen.getBody = function() {
- if (document.body) {
- return document.body;
- }
- if (document.getElementsByTagName) {
- var bodies = document.getElementsByTagName("BODY");
- if (bodies!=null && bodies.length>0) {
- return bodies[0];
- }
- }
- return null;
- };
-
- // Get the amount that the main document has scrolled from top
- // --------------------------------------------------------------------
- screen.getScrollTop = function() {
- if (document.documentElement && defined(document.documentElement.scrollTop) && document.documentElement.scrollTop>0) {
- return document.documentElement.scrollTop;
- }
- if (document.body && defined(document.body.scrollTop)) {
- return document.body.scrollTop;
- }
- return null;
- };
-
- // Get the amount that the main document has scrolled from left
- // --------------------------------------------------------------------
- screen.getScrollLeft = function() {
- if (document.documentElement && defined(document.documentElement.scrollLeft) && document.documentElement.scrollLeft>0) {
- return document.documentElement.scrollLeft;
- }
- if (document.body && defined(document.body.scrollLeft)) {
- return document.body.scrollLeft;
- }
- return null;
- };
-
- // Util function to default a bad number to 0
- // --------------------------------------------------------------------
- screen.zero = function(n) {
- return (!defined(n) || isNaN(n))?0:n;
- };
-
- // Get the width of the entire document
- // --------------------------------------------------------------------
- screen.getDocumentWidth = function() {
- var width = 0;
- var body = screen.getBody();
- if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
- var rightMargin = parseInt(CSS.get(body,'marginRight'),10) || 0;
- var leftMargin = parseInt(CSS.get(body,'marginLeft'), 10) || 0;
- width = Math.max(body.offsetWidth + leftMargin + rightMargin, document.documentElement.clientWidth);
- }
- else {
- width = Math.max(body.clientWidth, body.scrollWidth);
- }
- if (isNaN(width) || width==0) {
- width = screen.zero(self.innerWidth);
- }
- return width;
- };
-
- // Get the height of the entire document
- // --------------------------------------------------------------------
- screen.getDocumentHeight = function() {
- var body = screen.getBody();
- var innerHeight = (defined(self.innerHeight)&&!isNaN(self.innerHeight))?self.innerHeight:0;
- if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
- var topMargin = parseInt(CSS.get(body,'marginTop'),10) || 0;
- var bottomMargin = parseInt(CSS.get(body,'marginBottom'), 10) || 0;
- return Math.max(body.offsetHeight + topMargin + bottomMargin, document.documentElement.clientHeight, document.documentElement.scrollHeight, screen.zero(self.innerHeight));
- }
- return Math.max(body.scrollHeight, body.clientHeight, screen.zero(self.innerHeight));
- };
-
- // Get the width of the viewport (viewable area) in the browser window
- // --------------------------------------------------------------------
- screen.getViewportWidth = function() {
- if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
- return document.documentElement.clientWidth;
- }
- else if (document.compatMode && document.body) {
- return document.body.clientWidth;
- }
- return screen.zero(self.innerWidth);
- };
-
- // Get the height of the viewport (viewable area) in the browser window
- // --------------------------------------------------------------------
- screen.getViewportHeight = function() {
- if (!window.opera && document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
- return document.documentElement.clientHeight;
- }
- else if (document.compatMode && !window.opera && document.body) {
- return document.body.clientHeight;
- }
- return screen.zero(self.innerHeight);
- };
-
- return screen;
-})();var Sort = (function(){
- var sort = {};
- sort.AlphaNumeric = function(a,b) {
- if (a==b) { return 0; }
- if (a<b) { return -1; }
- return 1;
- };
-
- sort.Default = sort.AlphaNumeric;
-
- sort.NumericConversion = function(val) {
- if (typeof(val)!="number") {
- if (typeof(val)=="string") {
- val = parseFloat(val.replace(/,/g,''));
- if (isNaN(val) || val==null) { val=0; }
- }
- else {
- val = 0;
- }
- }
- return val;
- };
-
- sort.Numeric = function(a,b) {
- return sort.NumericConversion(a)-sort.NumericConversion(b);
- };
-
- sort.IgnoreCaseConversion = function(val) {
- if (val==null) { val=""; }
- return (""+val).toLowerCase();
- };
-
- sort.IgnoreCase = function(a,b) {
- return sort.AlphaNumeric(sort.IgnoreCaseConversion(a),sort.IgnoreCaseConversion(b));
- };
-
- sort.CurrencyConversion = function(val) {
- if (typeof(val)=="string") {
- val = val.replace(/^[^\d\.]/,'');
- }
- return sort.NumericConversion(val);
- };
-
- sort.Currency = function(a,b) {
- return sort.Numeric(sort.CurrencyConversion(a),sort.CurrencyConversion(b));
- };
-
- sort.DateConversion = function(val) {
- // inner util function to parse date formats
- function getdate(str) {
- // inner util function to convert 2-digit years to 4
- function fixYear(yr) {
- yr = +yr;
- if (yr<50) { yr += 2000; }
- else if (yr<100) { yr += 1900; }
- return yr;
- };
- var ret;
- // YYYY-MM-DD
- if (ret=str.match(/(\d{2,4})-(\d{1,2})-(\d{1,2})/)) {
- return (fixYear(ret[1])*10000) + (ret[2]*100) + (+ret[3]);
- }
- // MM/DD/YY[YY] or MM-DD-YY[YY]
- if (ret=str.match(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/)) {
- return (fixYear(ret[3])*10000) + (ret[1]*100) + (+ret[2]);
- }
- return 99999999; // So non-parsed dates will be last, not first
- };
- return getdate(val);
- };
-
- sort.Date = function(a,b) {
- return sort.Numeric(sort.DateConversion(a),sort.DateConversion(b));
- };
-
- return sort;
-})();
-
-var Position = (function() {
- // Resolve a string identifier to an object
- // ========================================
- function resolveObject(s) {
- if (document.getElementById && document.getElementById(s)!=null) {
- return document.getElementById(s);
- }
- else if (document.all && document.all[s]!=null) {
- return document.all[s];
- }
- else if (document.anchors && document.anchors.length && document.anchors.length>0 && document.anchors[0].x) {
- for (var i=0; i<document.anchors.length; i++) {
- if (document.anchors[i].name==s) {
- return document.anchors[i]
- }
- }
- }
- }
-
- var pos = {};
- pos.$VERSION = 1.0;
-
- // Set the position of an object
- // =============================
- pos.set = function(o,left,top) {
- if (typeof(o)=="string") {
- o = resolveObject(o);
- }
- if (o==null || !o.style) {
- return false;
- }
-
- // If the second parameter is an object, it is assumed to be the result of getPosition()
- if (typeof(left)=="object") {
- var pos = left;
- left = pos.left;
- top = pos.top;
- }
-
- o.style.left = left + "px";
- o.style.top = top + "px";
- return true;
- };
-
- // Retrieve the position and size of an object
- // ===========================================
- pos.get = function(o) {
- var fixBrowserQuirks = true;
- // If a string is passed in instead of an object ref, resolve it
- if (typeof(o)=="string") {
- o = resolveObject(o);
- }
-
- if (o==null) {
- return null;
- }
-
- var left = 0;
- var top = 0;
- var width = 0;
- var height = 0;
- var parentNode = null;
- var offsetParent = null;
-
-
- offsetParent = o.offsetParent;
- var originalObject = o;
- var el = o; // "el" will be nodes as we walk up, "o" will be saved for offsetParent references
- while (el.parentNode!=null) {
- el = el.parentNode;
- if (el.offsetParent==null) {
- }
- else {
- var considerScroll = true;
- /*
- In Opera, if parentNode of the first object is scrollable, then offsetLeft/offsetTop already
- take its scroll position into account. If elements further up the chain are scrollable, their
- scroll offsets still need to be added in. And for some reason, TR nodes have a scrolltop value
- which must be ignored.
- */
- if (fixBrowserQuirks && window.opera) {
- if (el==originalObject.parentNode || el.nodeName=="TR") {
- considerScroll = false;
- }
- }
- if (considerScroll) {
- if (el.scrollTop && el.scrollTop>0) {
- top -= el.scrollTop;
- }
- if (el.scrollLeft && el.scrollLeft>0) {
- left -= el.scrollLeft;
- }
- }
- }
- // If this node is also the offsetParent, add on the offsets and reset to the new offsetParent
- if (el == offsetParent) {
- left += o.offsetLeft;
- if (el.clientLeft && el.nodeName!="TABLE") {
- left += el.clientLeft;
- }
- top += o.offsetTop;
- if (el.clientTop && el.nodeName!="TABLE") {
- top += el.clientTop;
- }
- o = el;
- if (o.offsetParent==null) {
- if (o.offsetLeft) {
- left += o.offsetLeft;
- }
- if (o.offsetTop) {
- top += o.offsetTop;
- }
- }
- offsetParent = o.offsetParent;
- }
- }
-
-
- if (originalObject.offsetWidth) {
- width = originalObject.offsetWidth;
- }
- if (originalObject.offsetHeight) {
- height = originalObject.offsetHeight;
- }
-
- return {'left':left, 'top':top, 'width':width, 'height':height
- };
- };
-
- // Retrieve the position of an object's center point
- // =================================================
- pos.getCenter = function(o) {
- var c = this.get(o);
- if (c==null) { return null; }
- c.left = c.left + (c.width/2);
- c.top = c.top + (c.height/2);
- return c;
- };
-
- return pos;
-})();// CLASS CONSTRUCTOR
-// --------------------------------------------------------------------
-var Popup = function(div, options) {
- this.div = defined(div)?div:null;
- this.index = Popup.maxIndex++;
- this.ref = "Popup.objects["+this.index+"]";
- Popup.objects[this.index] = this;
- // Store a reference to the DIV by id, also
- if (typeof(this.div)=="string") {
- Popup.objectsById[this.div] = this;
- }
- if (defined(this.div) && this.div!=null && defined(this.div.id)) {
- Popup.objectsById[this.div.id] = this.div.id;
- }
- // Apply passed-in options
- if (defined(options) && options!=null && typeof(options)=="object") {
- for (var i in options) {
- this[i] = options[i];
- }
- }
- return this;
-};
-
-// CLASS PROPERTIES
-// --------------------------------------------------------------------
-// Index of popup objects, to maintain a global reference if necessary
-Popup.maxIndex = 0;
-Popup.objects = {};
-Popup.objectsById = {};
-
-// The z-index value that popups will start at
-Popup.minZIndex = 101;
-
-// Class names to assign to other objects
-Popup.screenClass = "PopupScreen";
-Popup.iframeClass = "PopupIframe";
-Popup.screenIframeClass = "PopupScreenIframe";
-
-// CLASS METHODS
-// --------------------------------------------------------------------
-
-// Hide all currently-visible non-modal dialogs
-Popup.hideAll = function() {
- for (var i in Popup.objects) {
- var p = Popup.objects[i];
- if (!p.modal && p.autoHide) {
- p.hide();
- }
- }
-};
-// Catch global events as a trigger to hide auto-hide popups
-Event.add(document, "mouseup", Popup.hideAll, false);
-
-// A simple class method to show a popup without creating an instance
-Popup.show = function(divObject, referenceObject, position, options, modal) {
- var popup;
- if (defined(divObject)) {
- popup = new Popup(divObject);
- }
- else {
- popup = new Popup();
- popup.destroyDivOnHide = true;
- }
- if (defined(referenceObject)) { popup.reference = DOM.resolve(referenceObject); }
- if (defined(position)) { popup.position = position; }
- if (defined(options) && options!=null && typeof(options)=="object") {
- for (var i in options) {
- popup[i] = options[i];
- }
- }
- if (typeof(modal)=="boolean") {
- popup.modal = modal;
- }
- popup.destroyObjectsOnHide = true;
- popup.show();
- return popup;
-};
-
-// A simple class method to show a modal popup
-Popup.showModal = function(divObject, referenceObject, position, options) {
- Popup.show(divObject, referenceObject, position, options, true);
-};
-
-// A method to retrieve a popup object based on a div ID
-Popup.get = function(divId) {
- if (defined(Popup.objectsById[divId])) {
- return Popup.objectsById[divId];
- }
- return null;
-};
-
-// A method to hide a popup based on a div id
-Popup.hide = function(divId) {
- var popup = Popup.get(divId);
- if (popup!=null) {
- popup.hide();
- }
-};
-
-// PROTOTYPE PROPERTIES
-// --------------------------------------------------------------------
-Popup.prototype.content = null;
-Popup.prototype.className = "PopupDiv";
-Popup.prototype.style = null; // Styles to be applied to the DIV
-Popup.prototype.width = null;
-Popup.prototype.height = null;
-Popup.prototype.top = null;
-Popup.prototype.left = null;
-Popup.prototype.offsetLeft = 0;
-Popup.prototype.offsetTop = 0;
-Popup.prototype.constrainToScreen = true;
-Popup.prototype.autoHide = true;
-Popup.prototype.useIframeShim = false; /*@cc_on @*/ /*@if (@_win32) {Popup.prototype.useIframeShim = true;} @end @*/
-Popup.prototype.iframe = null;
-Popup.prototype.position = null; // vertical: "above top center bottom below", horizontal: "adjacent-left,left,center,right,adjacent-right"
-Popup.prototype.reference = null;
-Popup.prototype.modal = false;
-Popup.prototype.destroyDivOnHide = false;
-Popup.prototype.destroyObjectsOnHide = false;
-Popup.prototype.screen = null;
-Popup.prototype.screenIframeShim = null;
-Popup.prototype.screenOpacity=.4;
-Popup.prototype.screenColor="#cccccc";
-
-// INSTANCE METHODS
-// --------------------------------------------------------------------
-
-// Show the popup
-// --------------------------------------------------------------------
-Popup.prototype.show = function(options, modal) {
- this.modal = this.modal || (typeof(modal)=="boolean" && modal);
- if (defined(options) && options!=null && typeof(options)=="object") {
- for (var i in options) {
- this[i] = options[i];
- }
- }
- this.div = DOM.resolve(this.div);
- CSS.setStyle(this.div,'position','absolute');
-
- // If there is no div pre-defined to use, create one
- if (this.div==null) {
- this.div = this.createDiv();
- }
- if (this.content!=null) {
- this.div.innerHTML = this.content;
- this.content = null;
- }
- if (this.className!=null) {
- this.div.className = this.className;
- }
- if (this.style!=null) {
- this.applyStyle();
- }
- if (this.width!=null) {
- this.div.style.width = this.width+"px";
- this.div.style.overflowX="auto";
- }
- if (this.height!=null) {
- this.div.style.height = this.height+"px";
- this.div.style.overflowY="auto";
- }
-
- // Do the actual display - this is a separate method so display transitions can be implemented
- this.transition();
-
- // Make sure clicks on the DIV don't bubble up to the document
- this.div.onclick = function(e) {
- Event.cancelBubble(Event.resolve(e));
- };
- this.div.onmouseup = this.div.onclick;
-
- // Focus to the DIV if possible
- if (this.modal && this.div.focus) {
- this.div.focus();
- }
-};
-
-// Show the popup but make it modal
-// --------------------------------------------------------------------
-Popup.prototype.transition = function() {
- if (this.modal) {
- this.addScreen();
- }
-
- // Make the DIV displayed but hidden so its size can be measured
- CSS.setStyle(this.div,'visibility','hidden');
- CSS.setStyle(this.div,'display','block');
-
- // Position the popup
- this.setPosition();
-
- // Add the shim if necessary
- if (this.useIframeShim) {
- this.addIframeShim();
- }
-
- // Make sure the DIV is higher than the shim
- this.div.style.zIndex = Popup.minZIndex++;
-
- CSS.setStyle(this.div,'display','block');
- CSS.setStyle(this.div,'visibility','visible');
-};
-
-// Show the popup but make it modal
-// --------------------------------------------------------------------
-Popup.prototype.showModal = function(options) {
- this.show(options,true);
-};
-
-// Apply user styles to the DIV
-// --------------------------------------------------------------------
-Popup.prototype.applyStyle = function() {
- if (this.div!=null && this.style!=null && typeof(this.style)=="object") {
- for (var i in this.style) {
- this.div.style[i] = this.style[i];
- }
- }
-};
-
-// Hide the popup
-// --------------------------------------------------------------------
-Popup.prototype.hide = function() {
- // If this was a temp object creating on-the-fly, then remove objects from the DOM so
- // The document doesn't get littered with extra objects
- if (this.destroyDivOnHide) {
- DOM.removeNode(this.div);
- this.div = null;
- delete Popup.objects[this.id];
- }
- else if (this.div!=null) {
- CSS.setStyle(this.div,'display','none');
- }
-
- if (this.destroyObjectsOnHide) {
- DOM.removeNode(this.iframe);
- DOM.removeNode(this.screen);
- DOM.removeNode(this.screenIframeShim);
- }
- else {
- if (this.iframe!=null) {
- this.iframe.style.display = "none";
- }
- if (this.screen!=null) {
- this.screen.style.display = "none";
- }
- if (this.screenIframeShim!=null) {
- this.screenIframeShim.style.display = "none";
- }
- }
-};
-
-// Util funcs for position
-// --------------------------------------------------------------------
-Popup.prototype.setTop = function(top) {
- this.div.style.top = top+"px";
-};
-Popup.prototype.setLeft = function(left) {
- this.div.style.left = left+"px";
-};
-Popup.prototype.getTop = function() {
- return parseInt(CSS.getStyle(this.div,"top"),10);
-};
-Popup.prototype.getLeft = function() {
- return parseInt(CSS.getStyle(this.div,"left"),10);
-};
-
-// All the logic to position the popup based on various criteria
-// --------------------------------------------------------------------
-Popup.prototype.setPosition = function() {
- if (this.position!=null) {
- var m = this.position.match(/^(\S+)\s+(\S+)/);
- if (m!=null && m.length==3) {
- var v = m[1];
- var h = m[2];
-
- var ref = this.reference;
- if (ref==null) { ref = Screen.getBody(); }
- var p = Position.get(ref);
- var refTop = p.top;
- var refLeft = p.left;
- var refWidth = DOM.getOuterWidth(ref);
- var refHeight = DOM.getOuterHeight(ref);
-
- var width = DOM.getOuterWidth(this.div);
- var height = DOM.getOuterHeight(this.div);
-
- var scrollLeft = Screen.getScrollLeft();
- var scrollTop = Screen.getScrollTop();
-
- // Set vertical position relative to reference object
- if (v=="above") { this.setTop(refTop-height+this.offsetTop); }
- else if (v=="top") { this.setTop(refTop+this.offsetTop); }
- else if (v=="center") { this.setTop(refTop+(refHeight/2)-(height/2)+this.offsetTop); }
- else if (v=="bottom") { this.setTop(refTop+refHeight-height+this.offsetTop); }
- else if (v=="below") { this.setTop(refTop+refHeight+this.offsetTop); }
-
- // Set horizontal position relative to reference object
- if (h=="adjacent-left") { this.setLeft(refLeft-width+this.offsetLeft); }
- else if (h=="left") { this.setLeft(refLeft+this.offsetLeft); }
- else if (h=="center") { this.setLeft(refLeft+(refWidth/2)-(width/2)+this.offsetLeft); }
- else if (h=="right") { this.setLeft(refLeft+refWidth-width+this.offsetLeft); }
- else if (h=="adjacent-right") { this.setLeft(refLeft+refWidth+this.offsetLeft); }
- }
- }
- else if (this.top==null && this.left==null) {
- this.center();
- }
- else {
- if (this.top==null) { this.top=0; }
- if (this.left==null) { this.left=0; }
- this.div.style.top = this.top+this.offsetTop+"px";
- this.div.style.left = this.left+this.offsetLeft+"px";
- }
-
- // Re-position to make sure it stays on the screen
- if (this.constrainToScreen) {
- this.fitToScreen();
- }
-};
-
-// Append an object to the body
-// --------------------------------------------------------------------
-Popup.prototype.appendToBody = function(o) {
- var body = Screen.getBody();
- if (body && body.appendChild) {
- body.appendChild(o);
- }
-};
-
-// Create a new DIV object to be used for a popup
-// --------------------------------------------------------------------
-Popup.prototype.createDiv = function() {
- if (document.createElement) {
- var d = document.createElement("DIV");
- d.style.position="absolute";
- d.style.display="block";
- d.style.visibility="hidden";
- this.appendToBody(d);
- return d;
- }
- alert("ERROR: Couldn't create DIV element in Popup.prototype.createDiv()");
- return null;
-};
-
-// Create a new IFRAME object to be used behind the popup
-// --------------------------------------------------------------------
-Popup.prototype.createIframe = function() {
- if (document.createElement) {
- var i= document.createElement("IFRAME");
- i.style.position="absolute";
- i.style.display="block";
- i.style.visibility="hidden";
- i.style.background="none";
- this.appendToBody(i);
- return i;
- }
- else {
- alert("ERROR: Couldn't create IFRAME object in Popup.prototype.createIframe()");
- }
-};
-
-// Add an IFRAME shim for the DIV
-// --------------------------------------------------------------------
-Popup.prototype.addIframeShim = function() {
- if (this.iframe==null) {
- this.iframe = this.createIframe();
- }
- this.iframe.className = Popup.iframeClass;
- CSS.setStyle(this.iframe,'top',this.getTop()+"px");
- CSS.setStyle(this.iframe,'left',this.getLeft()+"px");
- CSS.setStyle(this.iframe,'width',DOM.getOuterWidth(this.div) + "px");
- CSS.setStyle(this.iframe,'height',DOM.getOuterHeight(this.div) + "px");
- CSS.setStyle(this.iframe,'zIndex',Popup.minZIndex++);
- CSS.setStyle(this.iframe,'opacity',0);
- CSS.setStyle(this.iframe,'visibility','visible');
- CSS.setStyle(this.iframe,'display','block');
-};
-
-// Create a "screen" to make a popup modal
-// --------------------------------------------------------------------
-Popup.prototype.addScreen = function() {
- if (this.screen==null) {
- this.screen = this.createDiv();
- this.screen.style.top="0px";
- this.screen.style.left="0px";
- this.screen.style.backgroundColor = this.screenColor;
- this.screen.className=Popup.screenClass;;
- CSS.setStyle(this.screen,"opacity",this.screenOpacity);
- this.screen.onclick = function(e) { Event.cancelBubble(Event.resolve(e)); }
- }
- if (this.screenIframeShim==null) {
- this.screenIframeShim = this.createIframe();
- this.screenIframeShim.style.top="0px";
- this.screenIframeShim.style.left="0px";
- this.screenIframeShim.className=Popup.screenIframeClass;
- CSS.setStyle(this.screenIframeShim,"opacity",0);
- }
- this.screen.style.width = Screen.getDocumentWidth()+"px";
- this.screen.style.height = Screen.getDocumentHeight()+"px";
- this.screenIframeShim.style.width = Screen.getDocumentWidth()+"px";
- this.screenIframeShim.style.height = Screen.getDocumentHeight()+"px";
- this.screenIframeShim.style.zIndex = Popup.minZIndex++;
- this.screenIframeShim.style.visibility="visible";
- this.screenIframeShim.style.display="block";
- this.screen.style.zIndex = Popup.minZIndex++;
- this.screen.style.visibility="visible";
- this.screen.style.display="block";
-};
-
-// Re-position the DIV so it stays on the screen
-// --------------------------------------------------------------------
-Popup.prototype.fitToScreen = function() {
- var width = DOM.getOuterWidth(this.div);
- var height = DOM.getOuterHeight(this.div);
- var top = this.getTop();
- var left = this.getLeft();
-
- var clientWidth = Screen.getViewportWidth();
- var clientHeight = Screen.getViewportHeight();
-
- var scrollLeft = Screen.getScrollLeft();
- var scrollTop = Screen.getScrollTop();
-
- if (top-scrollTop+height>clientHeight) {
- top = top - ((top+height) - (scrollTop+clientHeight));
- this.div.style.top = top + "px";
- }
- if (left-scrollLeft+width>clientWidth) {
- left = left - ((left+width) - (scrollLeft+clientWidth));
- this.div.style.left = left + "px";
- }
- if (top<scrollTop) {
- this.div.style.top=scrollTop+"px";
- }
- if (left<scrollLeft) {
- this.div.style.left=scrollLeft+"px";
- }
-};
-
-// Center the DIV object
-// --------------------------------------------------------------------
-Popup.prototype.center = function() {
- var left = DOM.getOuterWidth(this.div);
- var top = DOM.getOuterHeight(this.div);
- if (isNaN(left)) { left=0; }
- if (isNaN(top)) { top=0; }
- var clientW = Screen.getViewportWidth();
- var clientH = Screen.getViewportHeight();
- if (clientW!=null && clientH!=null) {
- top = (clientH-top)/2;
- left = (clientW-left)/2;
- }
- top += Screen.getScrollTop();
- left += Screen.getScrollLeft();
-
- this.div.style.top = top+this.offsetTop+"px";
- this.div.style.left = left+this.offsetLeft+"px";
-};
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="html" version="1.0" encoding="UTF-8"
- indent="yes" />
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "./style/tests.css";
- </STYLE>
- <head>
- <script type="text/javascript" src="./style/jquery.min.js" />
- </head>
- <body>
- <div id="testcasepage">
- <div id="title">
- <table>
- <tr>
- <td>
- <h1>TCT Report</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="overview">
- <table>
- <tr>
- <td>
- <div id="summary">
- <table>
- <tr>
- <th colspan="2">Test Summary</th>
- </tr>
- <tr>
- <td>TCT Version</td>
- <td>
- <xsl:value-of select="result_summary/environment/@tct_version" />
- </td>
- </tr>
- <tr>
- <td>Test Plan Name</td>
- <td>
- <xsl:value-of select="result_summary/@plan_name" />
- </td>
- </tr>
- <tr>
- <td>Test Profile</td>
- <td>
- <xsl:value-of select="result_summary/environment/@tct_profile" />
- </td>
- </tr>
- <tr>
- <td>Build ID</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@build_id">
- <xsl:if test="result_summary/environment/@build_id = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@build_id" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Test Total</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/total_case)" />
- </td>
- </tr>
- <tr>
- <td>Test Passed</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/pass_case)" />
- </td>
- </tr>
- <tr>
- <td>Test Failed</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/fail_case)" />
- </td>
- </tr>
- <tr>
- <td>Test Blocked</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/block_case)" />
- </td>
- </tr>
- <tr>
- <td>Test Not Executed</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/na_case)" />
- </td>
- </tr>
- <tr>
- <td>Time</td>
- <td>
- <xsl:value-of select="result_summary/summary/start_at" />
- ~
- <xsl:value-of select="result_summary/summary/end_at" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- <td>
- <div id="device">
- <table>
- <tr>
- <th colspan="2">Device Information</th>
- </tr>
- <tr>
- <td>Host Device</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@host">
- <xsl:if test="result_summary/environment/@host = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@host" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Manufacturer</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@manufacturer">
- <xsl:if test="result_summary/environment/@manufacturer = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@manufacturer" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Device Model</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@device_model">
- <xsl:if test="result_summary/environment/@device_model = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@device_model" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Device ID</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@device_id">
- <xsl:if test="result_summary/environment/@device_id = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@device_id" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Screen Size</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@screen_size">
- <xsl:if test="result_summary/environment/@screen_size = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@screen_size" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Resolution</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@resolution">
- <xsl:if test="result_summary/environment/@resolution = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@resolution" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
- </div>
- <div id="capability">
- <div id="title">
- <a name="contents"></a>
- <table>
- <tr>
- <td class="title">
- <h1><a href="#" class="see_capabilities">Device Capability</a></h1>
- </td>
- </tr>
- </table>
- </div>
- <xsl:choose>
- <xsl:when test="result_summary/capabilities">
- <div id="capability_table" style="display:none;">
- <table>
- <tr>
- <th>Capability Name</th>
- <th>Type</th>
- <th>Value</th>
- </tr>
- <xsl:for-each select="result_summary/capabilities/capability">
- <xsl:sort select="@name" />
- <tr>
- <td>
- <xsl:value-of select="@name" />
- </td>
- <td>
- <xsl:value-of select="@type" />
- </td>
- <td>
- <xsl:choose>
- <xsl:when test="value">
- <xsl:value-of select="value" />
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="@support" />
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </div>
- </xsl:when>
- <xsl:otherwise>
- The information of device capability is not available.
- </xsl:otherwise>
- </xsl:choose>
- </div>
- <div id="btc">
- <table>
- <tr>
- <td>
- <a href="#" class="see_all">Show all</a>
- </td>
- <td>
- <a href="#" class="see_failed">Show only failed</a>
- </td>
- <td>
- <a href="#" class="see_blocked">Show only blocked</a>
- </td>
- <td>
- <a href="#" class="see_na">Show only not executed</a>
- </td>
- </tr>
- </table>
- </div>
- <div id="title">
- <h1></h1>
- </div>
- <div id="suite_summary">
- <div id="title">
- <a name="contents"></a>
- <table>
- <tr>
- <td class="title">
- <h1>Test Summary by Suite</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="see_all">
- <table>
- <tr>
- <th>Suite</th>
- <th>Total</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Executed</th>
- <th class="Ratio">Ratio</th>
- </tr>
- <xsl:for-each select="result_summary/suite">
- <xsl:if test="total_case > 0">
- <tr class="suite_item">
- <xsl:attribute name="id">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- <td>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@name" />.xml</xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td class="total">
- <xsl:value-of select="total_case" />
- </td>
- <td class="pass">
- <xsl:value-of select="pass_case" />
- </td>
- <td class="fail">
- <xsl:value-of select="fail_case" />
- </td>
- <td class="block">
- <xsl:value-of select="block_case" />
- </td>
- <td class="na">
- <xsl:value-of select="na_case" />
- </td>
- <td class="Ratio">
- <div class="RatioGraphic" />
- </td>
- </tr>
- </xsl:if>
- </xsl:for-each>
- </table>
- </div>
- <div id="see_fail" style="display:none;">
- <table>
- <tr>
- <th>Suite</th>
- <th>Total</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Executed</th>
- <th class="Ratio">Ratio</th>
- </tr>
- <xsl:for-each select="result_summary/suite">
- <xsl:if test="fail_case > 0">
- <tr class="suite_item">
- <xsl:attribute name="id">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- <td>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@name" />.xml</xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td class="total">
- <xsl:value-of select="total_case" />
- </td>
- <td class="pass">
- <xsl:value-of select="pass_case" />
- </td>
- <td class="fail">
- <xsl:value-of select="fail_case" />
- </td>
- <td class="block">
- <xsl:value-of select="block_case" />
- </td>
- <td class="na">
- <xsl:value-of select="na_case" />
- </td>
- <td class="Ratio">
- <div class="RatioGraphic" />
- </td>
- </tr>
- </xsl:if>
- </xsl:for-each>
- </table>
- </div>
- <div id="see_block" style="display:none;">
- <table>
- <tr>
- <th>Suite</th>
- <th>Total</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Executed</th>
- <th class="Ratio">Ratio</th>
- </tr>
- <xsl:for-each select="result_summary/suite">
- <xsl:if test="block_case > 0">
- <tr class="suite_item">
- <xsl:attribute name="id">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- <td>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@name" />.xml</xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td class="total">
- <xsl:value-of select="total_case" />
- </td>
- <td class="pass">
- <xsl:value-of select="pass_case" />
- </td>
- <td class="fail">
- <xsl:value-of select="fail_case" />
- </td>
- <td class="block">
- <xsl:value-of select="block_case" />
- </td>
- <td class="na">
- <xsl:value-of select="na_case" />
- </td>
- <td class="Ratio">
- <div class="RatioGraphic" />
- </td>
- </tr>
- </xsl:if>
- </xsl:for-each>
- </table>
- </div>
- <div id="see_na" style="display:none;">
- <table>
- <tr>
- <th>Suite</th>
- <th>Total</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Executed</th>
- <th class="Ratio">Ratio</th>
- </tr>
- <xsl:for-each select="result_summary/suite">
- <xsl:if test="na_case > 0">
- <tr class="suite_item">
- <xsl:attribute name="id">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- <td>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@name" />.xml</xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td class="total">
- <xsl:value-of select="total_case" />
- </td>
- <td class="pass">
- <xsl:value-of select="pass_case" />
- </td>
- <td class="fail">
- <xsl:value-of select="fail_case" />
- </td>
- <td class="block">
- <xsl:value-of select="block_case" />
- </td>
- <td class="na">
- <xsl:value-of select="na_case" />
- </td>
- <td class="Ratio">
- <div class="RatioGraphic" />
- </td>
- </tr>
- </xsl:if>
- </xsl:for-each>
- </table>
- </div>
- </div>
- </div>
- <div id="goTopBtn">
- <img border="0" src="./style/back_top.png" />
- </div>
- <script type="text/javascript" src="./style/application.js" />
- <script language="javascript" type="text/javascript">
- $(document).ready(function(){
- goTopEx();
- drawRatio();
- });
- </script>
- </body>
- </html>
- </xsl:template>
- <xsl:template name="br-replace">
- <xsl:param name="word" />
- <xsl:variable name="cr">
- <xsl:text>\n</xsl:text>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="contains($word,$cr)">
- <xsl:value-of select="substring-before($word,$cr)" />
- <br />
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word" select="substring-after($word,$cr)" />
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$word" />
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="html" version="1.0" encoding="UTF-8"
- indent="yes" />
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "./style/tests.css";
- </STYLE>
- <head>
- <script type="text/javascript" src="./style/jquery.min.js" />
- <script type="text/javascript" src="./style/popup.js" />
- </head>
- <body>
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1 align="center">Suite Test Results</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="btc">
- <table>
- <tr>
- <td>
- <a href="#" class="see_all">Show all</a>
- </td>
- <td>
- <a href="#" class="see_failed">Show only failed</a>
- </td>
- <td>
- <a href="#" class="see_blocked">Show only blocked</a>
- </td>
- <td>
- <a href="#" class="see_na">Show only not executed</a>
- </td>
- <td>
- <a href="summary.xml">Summary</a>
- </td>
- </tr>
- </table>
- </div>
- <div id="testcasepage">
- <div id="cases">
- <div id="see_all">
- <xsl:for-each select="test_definition/suite">
- <div id="suite_title">
- <h2>
- Test Suite:
- <xsl:value-of select="@name" />
- (All)
- </h2>
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <tr>
- <xsl:choose>
- <xsl:when test="@name">
- <td colspan="3">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- <td colspan="1">
- <h4>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@set_debug_msg" /></xsl:attribute>
- dlog
- </a>
- </h4>
- </td>
- </xsl:when>
- <xsl:otherwise>
- <td colspan="4">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- </xsl:otherwise>
- </xsl:choose>
- </tr>
- <xsl:for-each select=".//testcase">
- <tr>
- <td>
- <div
- style="background-color:#F5DEB3;border:1px solid black;display:none;">
- <xsl:attribute name="id"><xsl:value-of
- select="@id" /></xsl:attribute>
- <p>
- <xsl:for-each select="./description/steps//step">
- <xsl:sort select="@order" />
- <B>
- Step
- <xsl:value-of select="@order" />
- :
- </B>
- <br />
- <xsl:value-of select=".//step_desc" />
- <br />
- <B>Expected:</B>
- <xsl:value-of select=".//expected" />
- <br />
- </xsl:for-each>
- </p>
- <p>
- <br />
- <B>
- Entry:
- <br />
- </B>
- <xsl:value-of select="./description//test_script_entry" />
- <br />
- </p>
- </div>
- <a href="#" class="test_case_popup">
- <xsl:attribute name="id"><xsl:value-of
- select="@id" /></xsl:attribute>
- <xsl:value-of select="@id" />
- </a>
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <xsl:choose>
- <xsl:when test="@result">
- <xsl:if test="@result = 'FAIL'">
- <td class="red_rate">
- <xsl:value-of select="@result" />
- </td>
- </xsl:if>
- <xsl:if test="@result = 'PASS'">
- <td class="green_rate">
- <xsl:value-of select="@result" />
- </td>
- </xsl:if>
- <xsl:if test="@result = 'BLOCK' ">
- <td class="orange_rate">
- BLOCK
- </td>
- </xsl:if>
- <xsl:if
- test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
- <td class="gray_rate">
- Not Run
- </td>
- </xsl:if>
- </xsl:when>
- <xsl:otherwise>
- <td>
-
- </td>
- </xsl:otherwise>
- </xsl:choose>
- <td>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word"
- select=".//result_info/stdout" />
- </xsl:call-template>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- <div id="see_fail" style="display:none;">
- <xsl:for-each select="test_definition/suite">
- <div id="suite_title">
- <h2>
- Test Suite:
- <xsl:value-of select="@name" />
- (Failed only)
- </h2>
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <tr>
- <xsl:choose>
- <xsl:when test="@name">
- <td colspan="3">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- <td colspan="1">
- <h4>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@set_debug_msg" /></xsl:attribute>
- dlog
- </a>
- </h4>
- </td>
- </xsl:when>
- <xsl:otherwise>
- <td colspan="4">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- </xsl:otherwise>
- </xsl:choose>
- </tr>
- <xsl:for-each select=".//testcase[@result='FAIL']">
- <tr>
- <td>
- <div
- style="background-color:#F5DEB3;border:1px solid black;display:none;">
- <xsl:attribute name="id">fail_<xsl:value-of
- select="@id" /></xsl:attribute>
- <p>
- <xsl:for-each select="./description/steps//step">
- <xsl:sort select="@order" />
- <B>
- Step
- <xsl:value-of select="@order" />
- :
- </B>
- <br />
- <xsl:value-of select=".//step_desc" />
- <br />
- <B>Expected:</B>
- <xsl:value-of select=".//expected" />
- <br />
- </xsl:for-each>
- </p>
- <p>
- <br />
- <B>
- Entry:
- <br />
- </B>
- <xsl:value-of select="./description//test_script_entry" />
- <br />
- </p>
- </div>
- <a href="#" class="test_case_popup">
- <xsl:attribute name="id">fail_<xsl:value-of
- select="@id" /></xsl:attribute>
- <xsl:value-of select="@id" />
- </a>
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <td class="red_rate">
- <xsl:value-of select="@result" />
- </td>
- <td>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word"
- select=".//result_info/stdout" />
- </xsl:call-template>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- <div id="see_block" style="display:none;">
- <xsl:for-each select="test_definition/suite">
- <div id="suite_title">
- <h2>
- Test Suite:
- <xsl:value-of select="@name" />
- (Blocked Only)
- </h2>
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <tr>
- <xsl:choose>
- <xsl:when test="@name">
- <td colspan="3">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- <td colspan="1">
- <h4>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@set_debug_msg" /></xsl:attribute>
- dlog
- </a>
- </h4>
- </td>
- </xsl:when>
- <xsl:otherwise>
- <td colspan="4">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- </xsl:otherwise>
- </xsl:choose>
- </tr>
- <xsl:for-each select=".//testcase[@result='BLOCK']">
- <tr>
- <td>
- <div
- style="background-color:#F5DEB3;border:1px solid black;display:none;">
- <xsl:attribute name="id">block_<xsl:value-of
- select="@id" /></xsl:attribute>
- <p>
- <xsl:for-each select="./description/steps//step">
- <xsl:sort select="@order" />
- <B>
- Step
- <xsl:value-of select="@order" />
- :
- </B>
- <br />
- <xsl:value-of select=".//step_desc" />
- <br />
- <B>Expected:</B>
- <xsl:value-of select=".//expected" />
- <br />
- </xsl:for-each>
- </p>
- <p>
- <br />
- <B>
- Entry:
- <br />
- </B>
- <xsl:value-of select="./description//test_script_entry" />
- <br />
- </p>
- </div>
- <a href="#" class="test_case_popup">
- <xsl:attribute name="id">block_<xsl:value-of
- select="@id" /></xsl:attribute>
- <xsl:value-of select="@id" />
- </a>
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <td class="orange_rate">
- <xsl:value-of select="@result" />
- </td>
- <td>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word"
- select=".//result_info/stdout" />
- </xsl:call-template>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- <div id="see_na" style="display:none;">
- <xsl:for-each select="test_definition/suite">
- <div id="suite_title">
- <h2>
- Test Suite:
- <xsl:value-of select="@name" />
- (Not executed Only)
- </h2>
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <tr>
- <xsl:choose>
- <xsl:when test="@name">
- <td colspan="3">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- <td colspan="1">
- <h4>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@set_debug_msg" /></xsl:attribute>
- dlog
- </a>
- </h4>
- </td>
- </xsl:when>
- <xsl:otherwise>
- <td colspan="4">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- </xsl:otherwise>
- </xsl:choose>
- </tr>
- <xsl:for-each select=".//testcase[@result='N/A']">
- <tr>
- <td>
- <div
- style="background-color:#F5DEB3;border:1px solid black;display:none;">
- <xsl:attribute name="id">na_<xsl:value-of
- select="@id" /></xsl:attribute>
- <p>
- <xsl:for-each select="./description/steps//step">
- <xsl:sort select="@order" />
- <B>
- Step
- <xsl:value-of select="@order" />
- :
- </B>
- <br />
- <xsl:value-of select=".//step_desc" />
- <br />
- <B>Expected:</B>
- <xsl:value-of select=".//expected" />
- <br />
- </xsl:for-each>
- </p>
- <p>
- <br />
- <B>
- Entry:
- <br />
- </B>
- <xsl:value-of select="./description//test_script_entry" />
- <br />
- </p>
- </div>
- <a href="#" class="test_case_popup">
- <xsl:attribute name="id">na_<xsl:value-of
- select="@id" /></xsl:attribute>
- <xsl:value-of select="@id" />
- </a>
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <td class="gray_rate">
- <xsl:value-of select="@result" />
- </td>
- <td>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word"
- select=".//result_info/stdout" />
- </xsl:call-template>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- </div>
- </div>
- <div id="goTopBtn">
- <img border="0" src="./style/back_top.png" />
- </div>
- <script type="text/javascript" src="./style/application.js" />
- <script language="javascript" type="text/javascript">
- $(document).ready(function(){
- goTopEx();
- });
- </script>
- </body>
- </html>
- </xsl:template>
- <xsl:template name="br-replace">
- <xsl:param name="word" />
- <xsl:variable name="cr">
- <xsl:text>\n</xsl:text>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="contains($word,$cr)">
- <xsl:value-of select="substring-before($word,$cr)" />
- <br />
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word" select="substring-after($word,$cr)" />
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$word" />
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-</xsl:stylesheet>
+++ /dev/null
-@charset "UTF-8";\r
-/* CSS Document */\r
-#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td\r
- {\r
- margin: 0;\r
- padding: 0;\r
- border: 0;\r
- font-weight: inherit;\r
- font-style: inherit;\r
- font-size: 0.96em;\r
- font-family: arial;\r
- vertical-align: baseline;\r
-}\r
-\r
-#title td, #btc td{\r
- margin: 0;\r
- padding: 0;\r
- border: 0;\r
- font-weight: inherit;\r
- font-style: inherit;\r
- font-size: 0.96em;\r
- font-family: arial;\r
- vertical-align: baseline;\r
-}\r
-\r
-td.Ratio {\r
- text-align: left;\r
- font-weight: normal;\r
- padding: 4px 10px 4px 5px;\r
- vertical-align: middle;\r
-}\r
-\r
-th.Ratio {\r
- width: 400px;\r
-}\r
-\r
-#testcasepage p {\r
- text-align: left;\r
-}\r
-\r
-#suite_title {\r
- text-align: left;\r
-}\r
-\r
-#btc {\r
- text-align: right;\r
-}\r
-\r
-#btc table {\r
- position: absolute;\r
- right: 0px;\r
- width: 600px;\r
-}\r
-\r
-#testcasepage table {\r
- border-collapse: separate;\r
- border-spacing: 0;\r
- margin-bottom: 1.4em;\r
- vertical-align: middle;\r
-}\r
-\r
-#testcasepage th,#testcasepage td {\r
- text-align: left;\r
- font-weight: normal;\r
- padding: 4px 10px 4px 5px;\r
- vertical-align: middle;\r
-}\r
-\r
-#cases table {\r
- width: 101%;\r
-}\r
-\r
-#cases td {\r
- border-left: 0px;\r
- font-weight: normal;\r
- border-bottom: 0px;\r
-}\r
-\r
-#suite_summary table {\r
- width: 100%;\r
-}\r
-\r
-\r
-#overview table {\r
- width: 101%;\r
-}\r
-\r
-#overview table, #overview td, #overview tr {\r
- border-left: none;\r
- border-bottom: none;\r
- border-right: none;\r
- vertical-align: top;\r
-}\r
-\r
-#overview td{\r
- width: 50%;\r
-}\r
-\r
-#capability table {\r
- width: 50%;\r
-}\r
-\r
-#fail_cases table {\r
- width: 101%;\r
-}\r
-\r
-#title table {\r
- width: 101%;\r
-}\r
-\r
-#device table {\r
- width: 100%;\r
-}\r
-\r
-#summary table {\r
- width: 100%;\r
-}\r
-\r
-#testcasepage th {\r
- border-bottom: 1px solid #000;\r
- background-color: #AAAAAA;\r
- border-left: 1px solid #000;\r
- border-top: 1px solid #000;\r
- color: #000;\r
- font-weight: bold;\r
- vertical-align: bottom;\r
-}\r
-\r
-#summary th:last-child,#summary td:last-child, #device th:last-child,#device td:last-child, #suite_summary th:last-child,#suite_summary td:last-child,#cases th:last-child,#cases td:last-child,#capability th:last-child,#capability td:last-child {\r
- border-right: 1px solid #000;\r
-}\r
-\r
-#testcasepage td {\r
- font-weight: normal;\r
-}\r
-\r
-#summary td, #device td, #capability td, #suite_summary td, #cases td{\r
- border-left: 1px solid;\r
- font-weight: normal;\r
- border-bottom: 1px solid;\r
-}\r
-\r
-#testcasepage td.yellow_rate {\r
- background-color: #ffcc00;\r
-}\r
-\r
-#testcasepage td.green_rate {\r
- background-color: #1E90FF;\r
-}\r
-\r
-#testcasepage td.dgreen_rate {\r
- background-color: #339933;\r
-}\r
-\r
-#testcasepage td.red_rate {\r
- background-color: #FF3333;\r
-}\r
-\r
-#testcasepage td.orange_rate {\r
- background-color: #FFA500;\r
-}\r
-\r
-#testcasepage td.gray_rate {\r
- background-color: #AAAAAA;\r
-}\r
-\r
-#title table,#title tr,#title td {\r
- border-left: none;\r
- border-bottom: none;\r
- text-align: center;\r
-}\r
-\r
-#title td:last-child {\r
- border-right: none;\r
-}\r
-\r
-#testcasepage h1 {\r
- font-size: 2em;\r
- font-family: Arial, sans-serif;\r
- font-weight: bold;\r
- line-height: 1;\r
- color: #000;\r
- margin-bottom: 0.75em;\r
- padding-top: 0.25em;\r
- font-weight: bold;\r
-}\r
-\r
-#goTopBtn {\r
- right: 0px;\r
- bottom: 0px;\r
- position: fixed; +\r
- position: absolute;\r
- top: expression(parseInt(document.body.scrollTop)+document.body.clientHeight-40\r
- );\r
-}\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
- <storageModule moduleId="org.eclipse.cdt.core.settings">
- <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660" moduleId="org.eclipse.cdt.core.settings" name="Debug">
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactName="{TESTSUITE_NAME}" buildArtefactType="org.tizen.nativecore.buildArtefactType.app" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.app" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660" name="Debug" parent="org.tizen.nativecore.config.sbi.gcc45.app.debug">
- <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660." name="/" resourcePath="">
- <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.app.debug.1784086492" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.app.debug">
- <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.165304646" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
- <builder autoBuildTarget="all" buildPath="${workspace_loc:/{TESTSUITE_NAME}/Debug}" enableAutoBuild="true" id="org.tizen.nativecore.target.sbi.gnu.builder.910776161" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
- <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.707842937" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
- <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.1219153705" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
- <option id="gnu.cpp.compiler.option.optimization.level.235211314" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
- <option id="sbi.gnu.cpp.compiler.option.debugging.level.275888905" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
- <option id="sbi.gnu.cpp.compiler.option.debug.applog.437831432" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.cpp.compiler.option.debug.applog" value="true" valueType="boolean"/>
- <option id="sbi.gnu.cpp.compiler.option.2067868547" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
- <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
- </option>
- <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.1395160493" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-x-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ewebkit2-0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
- </option>
- <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.2042453024" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
- <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
- <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
- <listOptionValue builtIn="false" value=" -fPIE"/>
- <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
- </option>
- <option id="gnu.cpp.compiler.option.include.paths.1491943414" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
- </option>
- <option id="sbi.gnu.cpp.compiler.option.frameworks.core.399579441" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
- <listOptionValue builtIn="false" value="Native_API"/>
- </option>
- <option id="gnu.cpp.compiler.option.preprocessor.def.1290489636" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="_DEBUG"/>
- </option>
- <inputType id="sbi.gnu.cpp.compiler.tizen.inputType.1444030222"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.828773414" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.1332097163" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
- <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.option.optimization.level.569133032" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
- <option id="sbi.gnu.c.compiler.option.debugging.level.1038790997" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
- <option id="sbi.gnu.c.compiler.option.debug.applog.30619937" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.c.compiler.option.debug.applog" value="true" valueType="boolean"/>
- <option id="sbi.gnu.c.compiler.option.2093892473" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
- <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
- </option>
- <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.1795177369" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-x-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ewebkit2-0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
- </option>
- <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.129230233" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
- <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
- <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
- <listOptionValue builtIn="false" value=" -fPIE"/>
- <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
- </option>
- <option id="gnu.c.compiler.option.include.paths.2147015964" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
- </option>
- <option id="sbi.gnu.c.compiler.option.frameworks.core.435620859" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
- <listOptionValue builtIn="false" value="Native_API"/>
- </option>
- <option id="gnu.c.compiler.option.preprocessor.def.symbols.927058880" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
- <listOptionValue builtIn="false" value="_DEBUG"/>
- </option>
- <inputType id="sbi.gnu.c.compiler.tizen.inputType.386884738"/>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.981494680" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.640241801" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
- <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.901135465" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
- <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.787442281" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
- <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
- <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
- <listOptionValue builtIn="false" value="-pie -lpthread "/>
- <listOptionValue builtIn="false" value="-Xlinker -rpath="/home/developer/sdk_tools/lib""/>
- <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
- <listOptionValue builtIn="false" value="-Xlinker --version-script="${PROJ_PATH}/.exportMap""/>
- <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/usr/lib""/>
- <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
- </option>
- <option id="gnu.cpp.link.option.paths.1307041173" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
- <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib}""/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.2119600729" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- <tool command="i386-linux-gnueabi-as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.2146766494" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.2008442855" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool id="org.tizen.nativecore.tool.sbi.po.compiler.248419226" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
- <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.2010848909" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler"/>
- <tool id="org.tizen.nativecore.tool.fnmapgen.147350839" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
- <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.2051940365" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
- <tool id="org.tizen.nativecore.tool.ast.1075947210" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
- <tool id="org.tizen.nativecore.tool.ast.cpp.255856593" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
- <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.1173374538" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- </cconfiguration>
- <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853">
- <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853" moduleId="org.eclipse.cdt.core.settings" name="Release">
- <externalSettings/>
- <extensions>
- <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
- <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
- </extensions>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <configuration artifactName="${ProjName}" buildArtefactType="org.tizen.nativecore.buildArtefactType.app" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.app" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853" name="Release" parent="org.tizen.nativecore.config.sbi.gcc45.app.release">
- <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853." name="/" resourcePath="">
- <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.app.release.1698569602" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.app.release">
- <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.530558826" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
- <builder buildPath="${workspace_loc:/{TESTSUITE_NAME}/Release}" id="org.tizen.nativecore.target.sbi.gnu.builder.975214550" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
- <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.1514849212" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
- <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.1790549045" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
- <option id="gnu.cpp.compiler.option.optimization.level.316489008" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
- <option id="sbi.gnu.cpp.compiler.option.debugging.level.1500294719" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level"/>
- <option id="sbi.gnu.cpp.compiler.option.debug.applog.220428565" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.cpp.compiler.option.debug.applog"/>
- <option id="sbi.gnu.cpp.compiler.option.900296718" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
- <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
- </option>
- <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.1334366520" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-x-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ewebkit2-0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
- </option>
- <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.528700311" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
- <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
- <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
- <listOptionValue builtIn="false" value=" -fPIE"/>
- <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
- </option>
- <option id="gnu.cpp.compiler.option.include.paths.623797688" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
- </option>
- <option id="sbi.gnu.cpp.compiler.option.frameworks.core.1909718066" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
- <listOptionValue builtIn="false" value="Native_API"/>
- </option>
- <inputType id="sbi.gnu.cpp.compiler.tizen.inputType.1912377546"/>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.916984243" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
- </tool>
- <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.2061633942" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
- <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.2022990414" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
- <option id="sbi.gnu.c.compiler.option.debugging.level.2037589780" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level"/>
- <option id="sbi.gnu.c.compiler.option.debug.applog.930351060" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.c.compiler.option.debug.applog"/>
- <option id="sbi.gnu.c.compiler.option.623943791" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
- <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
- </option>
- <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.1091342970" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-x-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ewebkit2-0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
- <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
- </option>
- <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.1782808167" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
- <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
- <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
- <listOptionValue builtIn="false" value=" -fPIE"/>
- <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
- </option>
- <option id="gnu.c.compiler.option.include.paths.499488519" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
- <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
- </option>
- <option id="sbi.gnu.c.compiler.option.frameworks.core.120447946" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
- <listOptionValue builtIn="false" value="Native_API"/>
- </option>
- <inputType id="sbi.gnu.c.compiler.tizen.inputType.1431704404"/>
- <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.27305889" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
- </tool>
- <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.267766539" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
- <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.1382202266" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
- <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.476062144" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
- <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
- <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
- <listOptionValue builtIn="false" value="-pie -lpthread "/>
- <listOptionValue builtIn="false" value="-Xlinker -rpath="/home/developer/sdk_tools/lib""/>
- <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
- <listOptionValue builtIn="false" value="-Xlinker --version-script="${PROJ_PATH}/.exportMap""/>
- <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/usr/lib""/>
- <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
- </option>
- <option id="gnu.cpp.link.option.paths.29188932" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
- <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib}""/>
- </option>
- <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.140241049" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
- <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
- <additionalInput kind="additionalinput" paths="$(LIBS)"/>
- </inputType>
- </tool>
- <tool command="i386-linux-gnueabi-as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.1380224608" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
- <inputType id="cdt.managedbuild.tool.gnu.assembler.input.383736666" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
- </tool>
- <tool id="org.tizen.nativecore.tool.sbi.po.compiler.1356965384" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
- <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.1251472052" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler"/>
- <tool id="org.tizen.nativecore.tool.fnmapgen.1001165225" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
- <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.259998567" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
- <tool id="org.tizen.nativecore.tool.ast.277372493" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
- <tool id="org.tizen.nativecore.tool.ast.cpp.616356266" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
- <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.1007103551" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
- </toolChain>
- </folderInfo>
- <sourceEntries>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
- <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
- </sourceEntries>
- </configuration>
- </storageModule>
- <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
- </cconfiguration>
- </storageModule>
- <storageModule moduleId="cdtBuildSystem" version="4.0.0">
- <project id="{TESTSUITE_NAME}.org.tizen.nativecore.target.sbi.gcc45.app.893663013" name="Tizen Core Application" projectType="org.tizen.nativecore.target.sbi.gcc45.app"/>
- </storageModule>
- <storageModule moduleId="com.samsung.tizen.nativeapp.projectInfo" version="1.0.0"/>
- <storageModule moduleId="scannerConfiguration"/>
- <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
-</cproject>
+++ /dev/null
-{
- global: main;
- local: *;
-};
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
- <name>{TESTSUITE_NAME}</name>
- <comment></comment>
- <projects>
- </projects>
- <buildSpec>
- <buildCommand>
- <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
- <arguments>
- <dictionary>
- <key>?name?</key>
- <value></value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.append_environment</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
- <value>all</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.buildArguments</key>
- <value></value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.buildCommand</key>
- <value>sbi-make</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.buildLocation</key>
- <value>${workspace_loc:/{TESTSUITE_NAME}/Debug}</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
- <value>clean</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.contents</key>
- <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.enableFullBuild</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
- <value>all</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.stopOnError</key>
- <value>true</value>
- </dictionary>
- <dictionary>
- <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
- <value>true</value>
- </dictionary>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
- <triggers>full,incremental,</triggers>
- <arguments>
- </arguments>
- </buildCommand>
- <buildCommand>
- <name>org.tizen.nativecore.apichecker.core.builder</name>
- <arguments>
- </arguments>
- </buildCommand>
- </buildSpec>
- <natures>
- <nature>org.eclipse.cdt.core.cnature</nature>
- <nature>org.eclipse.cdt.core.ccnature</nature>
- <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
- <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
- <nature>org.tizen.nativecore.apichecker.core.tizenCppNature</nature>
- </natures>
- <filteredResources>
- <filter>
- <id>1360216703005</id>
- <name></name>
- <type>26</type>
- <matcher>
- <id>org.eclipse.ui.ide.multiFilter</id>
- <arguments>1.0-projectRelativePath-matches-false-false-*/.tpk</arguments>
- </matcher>
- </filter>
- </filteredResources>
-</projectDescription>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<tproject xmlns="http://www.tizen.org/tproject">
- <platforms>
- <platform>
- <name>mobile-2.4</name>
- </platform>
- </platforms>
-</tproject>
+++ /dev/null
-# Appendix
+++ /dev/null
-# Add inputs and outputs from these tool invocations to the build variables
-
-C_DEPS +=
-
-USES_EFL = yes
-USES_USR_INC = yes
-
-SYSROOT = $(SBI_SYSROOT)
-
-ifneq ($(strip $(SYSROOT)),)
-
-ifeq ($(strip $(USES_EFL)),yes)
-_EFL_INCS := \
- ecore-1 \
- ecore-audio-1 \
- ecore-avahi-1 \
- ecore-con-1 \
- ecore-evas-1 \
- ecore-fb-1 \
- ecore-file-1 \
- ecore-imf-1 \
- ecore-imf-evas-1 \
- ecore-input-1 \
- ecore-input-evas-1 \
- ecore-ipc-1 \
- ecore-x-1 \
- e_dbus-1 \
- edje-1 \
- eet-1 \
- efl-1 \
- efl-extension efl-extension/default efl-extension/circle \
- efreet-1 \
- eina-1 eina-1/eina \
- eio-1 \
- eldbus-1 \
- elementary-1 \
- embryo-1 \
- eo-1 \
- eom \
- ethumb-1 \
- ethumb-client-1 \
- evas-1 \
- ewebkit2-0
-_EFL_INC_ROOT := $(SYSROOT)/usr/include
-EFL_INCS := $(addprefix -I $(_EFL_INC_ROOT)/,$(_EFL_INCS))
-endif
-
-ifeq ($(strip $(USES_USR_INC)),yes)
-_USR_INCS := \
- usr/include \
- usr/include/AL \
- usr/include/feedback \
- usr/include/ui-extension \
- usr/include/vconf \
- usr/include/weconn \
- usr/include/wipc \
- usr/include/wnoti-service \
- usr/include/appcore-agent \
- usr/include/appcore-watch \
- usr/include/appfw \
- usr/include/badge \
- usr/include/base \
- usr/include/cairo \
- usr/include/calendar-service2 \
- usr/include/ckm \
- usr/include/contacts-svc \
- usr/include/content \
- usr/include/context-manager \
- usr/include/context-service \
- usr/include/dali \
- usr/include/dali-toolkit \
- usr/include/dbus-1.0 \
- usr/include/device \
- usr/include/dlog \
- usr/include/fontconfig \
- usr/include/freetype2 \
- usr/include/geofence \
- usr/include/gio-unix-2.0 \
- usr/include/glib-2.0 \
- usr/include/json-glib-1.0 \
- usr/include/json-glib-1.0/json-glib \
- usr/include/libxml2 \
- usr/include/location \
- usr/include/maps \
- usr/include/media \
- usr/include/media-content \
- usr/include/messaging \
- usr/include/metadata-editor \
- usr/include/minicontrol \
- usr/include/minizip \
- usr/include/network \
- usr/include/notification \
- usr/include/phonenumber-utils \
- usr/include/sensor \
- usr/include/shortcut \
- usr/include/storage \
- usr/include/system \
- usr/include/telephony \
- usr/include/ui \
- usr/include/web \
- usr/include/widget_service \
- usr/include/widget_viewer_evas \
- usr/include/wifi-direct \
- usr/lib/dbus-1.0/include \
- usr/lib/glib-2.0/include
-_USR_INC_ROOT := $(SYSROOT)
-USR_INCS := $(addprefix -I $(_USR_INC_ROOT)/,$(_USR_INCS))
-endif
-
-PLATFORM_INCS = $(USR_INCS) $(EFL_INCS) \
- -I"$(SDK_PATH)/library"
-
-endif
+++ /dev/null
-
-COMPILE_FLAGS = $(DEBUG_OP) $(OPTIMIZATION_OP) -Wall -c -fmessage-length=0
-
-CPP_COMPILE_FLAGS = $(DEBUG_OP) $(OPTIMIZATION_OP)
-
-LINK_FLAGS =
-
-AR_FLAGS =
-
-EDC_COMPILE_FLAGS =
\ No newline at end of file
+++ /dev/null
-BUILD_SCRIPT_VERSION := 1.0.6
-
-BSLASH := \\#
-
-PROJ_ROOT := $(subst $(BSLASH),/,$(PROJPATH))
-
--include $(PROJ_ROOT)/project_def.prop
--include basedef.mk
--include tooldef.mk
--include flags.mk
--include prepost.mk
-
-APPTYPE := $(type)
-
-OBJ_OUTPUT := $(OUTPUT_DIR)/objs
-
-OS_NAME = $(shell $(UNAME))
-
-ifneq ($(strip $(PLATFORM_INCS)),)
-PLATFORM_INCS_FILE := $(OBJ_OUTPUT)/platform_incs_file.inc
-endif
-
-FIND_FILES = $(shell $(FIND) $(PROJ_ROOT)/$(dir $(1)) -type f -name $(notdir $(1)) -printf '$(dir $(1))%P ')
-
-#USER_SRCS2 := $(shell sed -n '/^\s*USER_SRCS\s*=/s/USER_SRCS\s*=\s*//gp' '$(PROJ_ROOT)/project_def.prop')
-USER_SRCS2 := $(shell sed --version)
-
-NORMAL_SRCS := $(filter-out %*.c %*.cpp,$(USER_SRCS))
-WIDLCARD_SRCS := $(filter %*.c %*.cpp,$(USER_SRCS))
-ALL_SRCS := $(NORMAL_SRCS) $(foreach var,$(WIDLCARD_SRCS),$(call FIND_FILES,$(var)))
-
-C_SRCS := $(filter %.c,$(ALL_SRCS))
-CPP_SRCS := $(filter %.cpp,$(ALL_SRCS))
-
-USER_EDCS := $(subst $(BSLASH),/,$(USER_EDCS))
-NORMAL_EDCS := $(filter-out %*.edc,$(USER_EDCS))
-WIDLCARD_EDCS := $(filter %*.edc,$(USER_EDCS))
-EDCS := $(NORMAL_EDCS) $(foreach var,$(WIDLCARD_EDCS),$(call FIND_FILES,$(var)))
-
-NORMAL_POS := $(filter-out %*.po,$(USER_POS))
-WIDLCARD_POS := $(filter %*.po,$(USER_POS))
-POS := $(NORMAL_POS) $(foreach var,$(WIDLCARD_POS),$(call FIND_FILES,$(var)))
-
-LIBPATHS := $(addprefix -L$(PROJ_ROOT)/,$(USER_LIB_DIRS)) \
- $(addprefix -L,$(USER_LIB_DIRS_ABS))
-LIBS += $(addprefix -l,$(USER_LIBS))
-UOBJS := $(addprefix $(PROJ_ROOT)/,$(USER_OBJS)) \
- $(USER_OBJS_ABS)
-
-M_OPT = -MMD -MP -MF"$(@:%.o=%.d)"
-
-#LOWER_APPNAME := $(shell echo translit($(APPNAME),[A-Z],[a-z])|$(M4))
-LOWER_APPNAME := $(shell echo $(APPNAME)|$(TR) [A-Z] [a-z])
-
-ifeq ($(strip $(APPTYPE)),app)
-APPFILE := $(OUTPUT_DIR)/$(LOWER_APPNAME)
-endif
-ifeq ($(strip $(APPTYPE)),staticLib)
-APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).a
-endif
-ifeq ($(strip $(APPTYPE)),sharedLib)
-APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).so
-endif
-
-FUNC_C2O = $(patsubst %.c,$(OBJ_OUTPUT)/%.o,$(1))
-FUNC_CPP2O = $(patsubst %.cpp,$(OBJ_OUTPUT)/%.o,$(1))
-FUNC_EDC2EDJ = $(patsubst %.edc,$(OUTPUT_DIR)/%.edj,$(1))
-FUNC_PO2MO = $(patsubst %.po,$(OUTPUT_DIR)/res/locale/%/LC_MESSAGES/$(LOWER_APPNAME).mo,$(notdir $(1)))
-
-
-C_OBJS := $(call FUNC_C2O,$(C_SRCS))
-CPP_OBJS := $(call FUNC_CPP2O,$(CPP_SRCS))
-OBJS := $(C_OBJS) $(CPP_OBJS)
-EDJ_FILES := $(call FUNC_EDC2EDJ,$(EDCS))
-MO_FILES := $(call FUNC_PO2MO,$(POS))
-DEPS := $(OBJS:.o=.d)
-
-
-all : preproc $(APPFILE) secondary-outputs postproc
-
-ifneq ($(strip $(DEPS)),)
--include $(DEPS)
-endif
-
-ifeq ($(strip $(APPTYPE)),app)
-$(APPFILE) : $(OBJS) $(UOBJS)
- @echo ' Building target: $@'
- @echo ' Invoking: C/C++ Linker'
- @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
- $(CXX) -o "$(APPFILE)" $(OBJS) $(UOBJS) $(LIBPATHS) $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -pie -lpthread -Xlinker -rpath="/home/developer/sdk_tools/lib" --sysroot="$(SYSROOT)" -Xlinker --version-script="$(PROJ_PATH)/.exportMap" -L"$(SBI_SYSROOT)/usr/lib" $(RS_LIBRARIES) -Xlinker -rpath="/opt/usr/apps/$(APPID)/lib" -Werror-implicit-function-declaration
- @echo ' Finished building target: $@'
-endif
-ifeq ($(strip $(APPTYPE)),staticLib)
-$(APPFILE) : $(OBJS) $(UOBJS)
- @echo ' Building target: $@'
- @echo ' Invoking: Archive utility'
- @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
- $(AR) -r "$(APPFILE)" $(OBJS) $(UOBJS) $(AR_FLAGS)
- @echo ' Finished building target: $@'
-endif
-ifeq ($(strip $(APPTYPE)),sharedLib)
-$(APPFILE) : $(OBJS) $(UOBJS)
- @echo ' Building target: $@'
- @echo ' Invoking: C/C++ Linker'
- @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
- $(CXX) -o "$(APPFILE)" $(OBJS) $(UOBJS) $(LIBPATHS) $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -shared -lpthread --sysroot="$(SYSROOT)" -L"$(SYSROOT)/usr/lib" $(RS_LIBRARIES)
- @echo ' Finished building target: $@'
-endif
-
-
-ifneq ($(strip $(C_SRCS)),)
-CDEFS += $(addprefix -D,$(USER_DEFS))
-CDEFS += $(addprefix -U,$(USER_UNDEFS))
-
-INCS := $(addprefix -I$(PROJ_ROOT)/,$(USER_INC_DIRS)) \
- $(addprefix -I,$(USER_INC_DIRS_ABS)) \
- $(addprefix -include$(PROJ_ROOT)/,$(USER_INC_FILES)) \
- $(addprefix -include,$(USER_INC_FILES_ABS))
-
-$(C_OBJS) : $(OBJ_OUTPUT)/%.o : $(PROJ_ROOT)/%.c $(PLATFORM_INCS_FILE)
- @echo ' Building file: $<'
- @echo ' Invoking: C Compiler'
- @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
-ifeq ($(strip $(APPTYPE)),sharedLib)
- $(CC) -c $< -o $@ $(CDEFS) $(INCS) -I"pch" $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIC --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
-else
- $(CC) -c $< -o $@ $(CDEFS) $(INCS) -I"pch" $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIE --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
-endif
- @echo ' Finished building: $<'
-endif
-
-ifneq ($(strip $(CPP_SRCS)),)
-CPPDEFS += $(addprefix -D,$(USER_CPP_DEFS))
-CPPDEFS += $(addprefix -U,$(USER_CPP_UNDEFS))
-
-CPP_INCS := $(addprefix -I$(PROJ_ROOT)/,$(USER_CPP_INC_DIRS)) \
- $(addprefix -I,$(USER_CPP_INC_DIRS_ABS)) \
- $(addprefix -include$(PROJ_ROOT)/,$(USER_CPP_INC_FILES)) \
- $(addprefix -include,$(USER_CPP_INC_FILES_ABS))
-
-$(CPP_OBJS) : $(OBJ_OUTPUT)/%.o : $(PROJ_ROOT)/%.cpp $(PLATFORM_INCS_FILE)
- @echo ' Building file: $<'
- @echo ' Invoking: C++ Compiler'
- @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
-ifeq ($(strip $(APPTYPE)),sharedLib)
- $(CXX) -c $< -o $@ $(CPPDEFS) $(CPP_INCS) -I"pch" $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIC --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
-else
- $(CXX) -c $< -o $@ $(CPPDEFS) $(CPP_INCS) -I"pch" $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIE --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
-endif
- @echo ' Finished building: $<'
-endif
-
-preproc :
-ifneq ($(strip $(PREBUILD_COMMAND)),)
-ifneq ($(strip $(PREBUILD_DESC)),)
- @echo $(PREBUILD_DESC)
-endif
- @echo $(shell $(PREBUILD_COMMAND))
-endif
- @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(OBJ_OUTPUT))
-
-postproc :
-ifneq ($(strip $(POSTBUILD_COMMAND)),)
-ifneq ($(strip $(POSTBUILD_DESC)),)
- @echo $(POSTBUILD_DESC)
-endif
- @echo $(shell $(POSTBUILD_COMMAND))
-endif
-
-ifneq ($(strip $(PLATFORM_INCS)),)
-$(PLATFORM_INCS_FILE) :
- @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
-ifneq ($(findstring Linux,$(OS_NAME)),)
- @echo $(PLATFORM_INCS) > $@
-else
-ifneq ($(findstring 3.82,$(MAKE_VERSION)),)
- $(file > $@,$(PLATFORM_INCS))
-else
- @echo $(PLATFORM_INCS) > $@
-endif
-endif
-endif
-
-ALL_EDJ_FILES :=
-
-define EDJ_PROC
-ALL_EDCS := $$(subst $(BSLASH),/,$$($(2)))
-NORMAL_EDCS := $$(filter-out %*.edc,$$(ALL_EDCS))
-WIDLCARD_EDCS := $$(filter %*.edc,$$(ALL_EDCS))
-EDCS := $$(NORMAL_EDCS) $$(foreach var_edc,$$(WIDLCARD_EDCS),$$(call FIND_FILES,$$(var_edc)))
-
-ifneq ($$(strip $$(EDCS)),)
-EDJ_FILES := $$(call FUNC_EDC2EDJ,$$(EDCS))
-
-ALL_EDJ_FILES += $$(EDJ_FILES)
-
-EDC_$(1)_COMPILER_FLAGS := -id "$$(SDK_TOOLPATH)/enventor/share/enventor/images"
-EDC_$(1)_COMPILER_FLAGS += -sd "$$(SDK_TOOLPATH)/enventor/share/enventor/sounds"
-EDC_$(1)_COMPILER_FLAGS += -fd "$$(SDK_TOOLPATH)/enventor/share/enventor/fonts"
-
-ifneq ($$(strip $(3)),)
-EDC_$(1)_COMPILER_FLAGS += $$(addprefix -id $$(PROJ_PATH)/,$$($(3)))
-endif
-ifneq ($$(strip $(4)),)
-EDC_$(1)_COMPILER_FLAGS += $$(addprefix -id ,$$($(4)))
-endif
-ifneq ($$(strip $(5)),)
-EDC_$(1)_COMPILER_FLAGS += $$(addprefix -sd $$(PROJ_PATH)/,$$($(5)))
-endif
-ifneq ($$(strip $(6)),)
-EDC_$(1)_COMPILER_FLAGS += $$(addprefix -sd ,$$($(6)))
-endif
-ifneq ($$(strip $(7)),)
-EDC_$(1)_COMPILER_FLAGS += $$(addprefix -fd $$(PROJ_PATH)/,$$($(7)))
-endif
-ifneq ($$(strip $(8)),)
-EDC_$(1)_COMPILER_FLAGS += $$(addprefix -fd ,$$($(8)))
-endif
-
-$$(EDJ_FILES) : $$(OUTPUT_DIR)/%.edj : $$(PROJ_ROOT)/%.edc
- @echo ' Building file: $$<'
- @echo ' Invoking: EDC Resource Compiler'
- @$$(MKDIR) $$(MKDIR_OP) $$(subst $$(BSLASH),/,$$(@D))
- $$(EDJE_CC) $$(EDC_$(1)_COMPILER_FLAGS) $$(CDEFS) "$$<" "$$@"
- @echo ' Finished building: $$<'
-endif
-endef
-
-# Global EDCs
-ifneq ($(strip $(USER_EDCS)),)
-$(eval $(call EDJ_PROC,,USER_EDCS,USER_EDCS_IMAGE_DIRS,USER_EDCS_IMAGE_DIRS_ABS,USER_EDCS_SOUND_DIRS,USER_EDCS_SOUND_DIRS_ABS,USER_EDCS_FONT_DIRS,USER_EDCS_FONT_DIRS_ABS))
-endif
-
-# Individual EDCs
-ifneq ($(strip $(USER_EXT_EDC_KEYS)),)
-$(foreach var,$(USER_EXT_EDC_KEYS),$(eval $(call EDJ_PROC,$(var),USER_EXT_$(var)_EDCS,USER_EXT_$(var)_EDCS_IMAGE_DIRS,USER_EXT_$(var)_EDCS_IMAGE_DIRS_ABS,USER_EXT_$(var)_EDCS_SOUND_DIRS,USER_EXT_$(var)_EDCS_SOUND_DIRS_ABS,USER_EXT_$(var)_EDCS_FONT_DIRS,USER_EXT_$(var)_EDCS_FONT_DIRS_ABS)))
-endif
-
-
-ifneq ($(strip $(POS)),)
-define MO_RULE
-$(call FUNC_PO2MO,$(1)) : $(PROJ_ROOT)/$(1)
- @echo ' Building file: $$<'
- @echo ' Invoking: msgfmt String Formatter'
- @$$(MKDIR) $$(MKDIR_OP) $$(subst $$(BSLASH),/,$$(@D))
- $$(MSGFMT) -o $$@ $$<
- @echo ' Finished building: $$<'
-endef
-
-$(foreach var,$(POS),$(eval $(call MO_RULE,$(var))))
-endif
-
-
-secondary-outputs : $(ALL_EDJ_FILES) $(MO_FILES)
-
--include appendix.mk
-
-
-clean :
- rm -f "$(APPFILE)"
- rm -rf "$(OUTPUT_DIR)"
-
-
-version :
- @echo $(BUILD_SCRIPT_VERSION)
+++ /dev/null
-
-# Add pre/post build process
-PREBUILD_DESC =
-PREBUILD_COMMAND =
-POSTBUILD_DESC =
-POSTBUILD_COMMAND =
+++ /dev/null
-# Add inputs and outputs from these tool invocations to the build variables
-
-ifeq ($(strip $(BUILD_CONFIG)),)
-BUILD_CONFIG = Debug
-endif
-
-ifeq ($(strip $(OUTPUT_DIR)),)
-OUTPUT_DIR := $(PROJPATH)/$(BUILD_CONFIG)
-endif
-
-
-ifneq ($(strip $(MKDIR_BIN)),)
-MKDIR = $(MKDIR_BIN)
-MKDIR_OP = -p
-else
-MKDIR = mkdir
-MKDIR_OP = -p
-endif
-
-ifneq ($(strip $(UNAME_BIN)),)
-UNAME = $(UNAME_BIN)
-else
-UNAME = uname
-endif
-
-ifneq ($(strip $(M4_BIN)),)
-M4 = $(M4_BIN)
-else
-M4 = m4
-endif
-
-ifneq ($(strip $(TR_BIN)),)
-TR = $(TR_BIN)
-else
-TR = tr
-endif
-
-ifneq ($(strip $(FIND_BIN)),)
-FIND = $(FIND_BIN)
-else
-FIND = find
-endif
-
-ifneq ($(strip $(GREP_BIN)),)
-GREP = $(GREP_BIN)
-else
-GREP = grep
-endif
-
-ifneq ($(strip $(EDJE_CC_BIN)),)
-EDJE_CC = $(EDJE_CC_BIN)
-else
-EDJE_CC = edje_cc
-endif
-
-ifneq ($(strip $(MSGFMT_BIN)),)
-MSGFMT = $(MSGFMT_BIN)
-else
-MSGFMT = msgfmt
-endif
-
+++ /dev/null
-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Apache License, Version 2.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-#ifndef _ASSERT_H_
-#define _ASSERT_H_
-#include <stdio.h>
-#include <stdlib.h>
-
-#define assert(exp) \
- if (!(exp)) { \
- fprintf(stderr, \
- "\\n[TCT][%s][Line : %d] Assert Fail; Following expression is not true: %s\\n", __FILE__, __LINE__, #exp); \
- return 1; \
- }
-
-#define assert_eq(var, ref) \
- if (var != ref) { \
- fprintf(stderr, \
- "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) and (%s) are not equal\\n", __FILE__, __LINE__, #var, #ref); \
- return 1; \
- }
-
-#define assert_neq(var, ref) \
- if (var == ref) { \
- fprintf(stderr, \
- "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) and (%s) are equal\\n", __FILE__, __LINE__, #var, #ref); \
- return 1; \
- }
-
-#define assert_gt(var, ref) \
- if (var <= ref) { \
- fprintf(stderr, \
- "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not greater than (%s)\\n", __FILE__, __LINE__, #var, #ref); \
- return 1; \
- }
-
-#define assert_geq(var, ref) \
- if (var < ref) { \
- fprintf(stderr, \
- "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not greater than or equal to (%s)\\n", __FILE__, __LINE__, #var, #ref); \
- return 1; \
- }
-
-#define assert_lt(var, ref) \
- if (var >= ref) { \
- fprintf(stderr, \
- "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not lower than (%s)\\n", __FILE__, __LINE__, #var, #ref); \
- return 1; \
- }
-
-#define assert_leq(var, ref) \
- if (var > ref) { \
- fprintf(stderr, \
- "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not lower than or equal to (%s)\\n", __FILE__, __LINE__, #var, #ref); \
- return 1; \
- }
-
-#endif // _ASSERT_H_
+++ /dev/null
-#ifndef __ASSERT_COMMON_H__
-#define __ASSERT_COMMON_H__
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <app.h>
-
-int utc_result;
-
-#define assert_with_exit(exp) do { \
- if (!(exp)) { \
- fprintf(stderr, \
- "Assert fail in %s:%d\n", __FILE__, __LINE__); \
- fprintf(stderr, \
- "Following expression is not true:\n" \
- "%s\n", #exp); \
- utc_result = 1; \
- ui_app_exit(); \
- return 1; \
- } \
- } while (0)
-
-#define assert_eq_with_exit(var, ref) do { \
- if (var != ref) { \
- fprintf(stderr, \
- "Assert fail in %s:%d\n", __FILE__, __LINE__); \
- fprintf(stderr, \
- "Values \"%s\" and \"%s\" are not equal:\n" \
- "%s == %d, %s == %d\n", \
- #var, #ref, #var, (int)var, #ref, (int)ref); \
- utc_result = 1; \
- ui_app_exit(); \
- return 1; \
- } \
- } while (0)
-
-#define assert_neq_with_exit(var, ref) do { \
- if (var == ref) { \
- fprintf(stderr, \
- "Assert fail in %s:%d\n", __FILE__, __LINE__); \
- fprintf(stderr, \
- "Values \"%s\" and \"%s\" are equal:\n" \
- "%s == %s == %d\n", \
- #var, #ref, #var, #ref, (int)ref); \
- utc_result = 1; \
- ui_app_exit(); \
- return 1; \
- } \
- } while (0)
-
-#define assert_eq_without_exit(var, ref) do { \
- if (var != ref) { \
- fprintf(stderr, \
- "Assert fail in %s:%d\n", __FILE__, __LINE__); \
- fprintf(stderr, \
- "Values \"%s\" and \"%s\" are not equal:\n" \
- "%s == %d, %s == %d\n", \
- #var, #ref, #var, (int)var, #ref, (int)ref); \
- utc_result = 1; \
- return 1; \
- } \
- } while (0)
-
-#define assert_neq_without_exit(var, ref) do { \
- if (var == ref) { \
- fprintf(stderr, \
- "Assert fail in %s:%d\n", __FILE__, __LINE__); \
- fprintf(stderr, \
- "Values \"%s\" and \"%s\" are equal:\n" \
- "%s == %s == %d\n", \
- #var, #ref, #var, #ref, (int)ref); \
- utc_result = 1; \
- return 1; \
- } \
- } while (0)
-
-#define normal_exit(result) do { \
- utc_result = result; \
- ui_app_exit(); \
- } while (0)
-
-
-#endif /* __ASSERT_COMMON_H__ */
+++ /dev/null
-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Apache License, Version 2.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-#ifndef _TCT_COMMON_H_
-#define _TCT_COMMON_H_
-
-#include "assert.h"
-
-#include <malloc.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <system_info.h>
-
-#define DEBUG 1
-#define ERR_LOG "/tmp/tclog"
-#define TC_RESULT "/tmp/tcresult"
-#define UTC_LOG "/tmp/utclog_core"
-#define CONFIGFILE_PATH "/tmp/TC_Config.txt"
-#define CONFIG_LINE_LEN_MAX 2048
-#define CONFIG_VALUE_LEN_MAX 1024
-
-FILE *g_fpLog;
-FILE *g_fpLogDump;
-
-#define FPRINTF(...) {\
- g_fpLog = fopen(ERR_LOG, "a");\
- fprintf(g_fpLog, __VA_ARGS__);\
- fclose(g_fpLog);\
-}
-
-#define DUMP_UTC_ERRLOG() {\
- g_fpLogDump = freopen(ERR_LOG, "w", stderr);\
- fflush(stderr);\
-}
-
-#define CLOSE_UTC_ERRLOG() {\
- if(g_fpLogDump) \
- { fclose(g_fpLogDump); g_fpLogDump = NULL; }\
-}
-
-#define PRINT_UTC_LOG(...) {\
- g_fpLog = fopen(UTC_LOG, "a");\
- fprintf(g_fpLog, __VA_ARGS__);\
- fclose(g_fpLog);\
-}
-
-
-#define PRINT_TC_RESULT(...) {\
- g_fpLog = fopen(TC_RESULT, "w");\
- fprintf(g_fpLog, __VA_ARGS__);\
- fclose(g_fpLog);\
-}
-
-
-#define IS_FEATURE_SUPPORTED(feature_name, featureFlag, ModuleName)\
-{\
- if ( !(TCTCheckSystemInfoFeatureSupported(feature_name, ModuleName)) )\
-{\
- featureFlag = false;\
-}\
- else\
-{\
- featureFlag = true;\
-}\
-}
-
-#define PRINT_RESULT(eCompare, eRetVal, API, Error) {\
- if ( eRetVal == eCompare )\
-{\
- if ( DEBUG )\
-{\
- FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
-}\
-}\
- else \
-{\
- FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
- return 1;\
-}\
-}
-
-#define PRINT_RESULT_NORETURN(eCompare, eRetVal, API, Error) {\
- if ( eRetVal == eCompare )\
-{\
- if ( DEBUG )\
-{\
- FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
-}\
-}\
- else \
-{\
- FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
-}\
-}
-
-#define PRINT_RESULT_CLEANUP(eCompare, eRetVal, API, Error, FreeResource) {\
- if ( eRetVal == eCompare )\
-{\
- if ( DEBUG )\
-{\
- FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
-}\
-}\
-else \
-{\
- FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
- FreeResource;\
- return 1;\
-}\
-}
-
-
-#define PRINT_RESULT(eCompare, eRetVal, API, Error) {\
- if ( eRetVal == eCompare )\
-{\
- if ( DEBUG )\
-{\
- FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
-}\
-}\
- else \
-{\
- FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
- return 1;\
-}\
-}
-
-
-#define CHECK_VALUE_STRING(StringVariable, API) {\
- if ( StringVariable == NULL )\
-{\
- FPRINTF("[Line : %d][%s] %s failed, error returned = value returned is NULL\\n", __LINE__, API_NAMESPACE, API);\
- return 1;\
-}\
- else if ( DEBUG )\
-{\
- FPRINTF("[Line : %d][%s] value returned = %s\\n", __LINE__, API_NAMESPACE, StringVariable);\
-}\
- free(StringVariable);\
- StringVariable = NULL;\
-}
-
-#define CHECK_VALUE_INT(Variable, API) {\
- if ( Variable == 0 )\
-{\
- FPRINTF("[Line : %d][%s] %s failed, error returned = value returned is Zero\\n", __LINE__, API_NAMESPACE, API);\
- return 1;\
-}\
- else if ( DEBUG )\
-{\
- FPRINTF("[Line : %d][%s] value returned = %d\\n", __LINE__, API_NAMESPACE, Variable);\
-}\
-}
-
-#define CHECK_HANDLE(Handle, API) {\
- if ( Handle == NULL )\
-{\
- FPRINTF("[Line : %d][%s] %s failed, error returned = Handle returned is NULL\\n", __LINE__, API_NAMESPACE, API);\
- return 1;\
-}\
-}
-
-#define FREE_MEMORY(buffer) {\
- if ( buffer != NULL )\
-{\
- free(buffer);\
- buffer = NULL;\
-}\
-}
-
-bool TCTCheckSystemInfoFeatureSupported(char* pszKey, char* pszModuleName);
-char* TCTSystemInfoGetError(int nRet);
-bool GetValueFromConfigFile(char* pstrKeyString, char* pstrValue, char* pstrModule);
-#endif // _TCT_COMMON_H_
+++ /dev/null
-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Apache License, Version 2.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-#ifndef _TESTCASE_H_
-#define _TESTCASE_H_
-
-/* pointer to startup/cleanup functions */
-typedef void (*void_fun_ptr)(void);
-
-/* pointer to testcase functions */
-typedef int (*tc_fun_ptr)(void);
-
-/* struct describing specific testcase */
-typedef struct testcase_s {
- const char* name;
- tc_fun_ptr function;
- void_fun_ptr startup;
- void_fun_ptr cleanup;
-} testcase;
-
-#endif // _TESTCASE_H_
+++ /dev/null
-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Apache License, Version 2.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-#ifndef __{TESTSUITE_NAME}_H__
-#define __{TESTSUITE_NAME}_H__
-
-#include "testcase.h"
-#include "tct_common.h"
-
-
-testcase tc_array[] = {
- {NULL, NULL}
-};
-
-#endif
+++ /dev/null
-
-# Project Name
-APPNAME = {TESTSUITE_NAME}
-
-# Project Type
-type = app
-
-# Project Profile
-profile = mobile-2.4
-
-# C Sources
-USER_SRCS = src/tct_common.c src/{TESTSUITE_NAME}.c
-
-# EDC Sources
-USER_EDCS =
-
-# PO Sources
-USER_POS =
-
-# User Defines
-USER_DEFS =
-USER_CPP_DEFS =
-
-# User Undefines
-USER_UNDEFS =
-USER_CPP_UNDEFS =
-
-# User Libraries
-USER_LIBS =
-
-# User Objects
-USER_OBJS =
-USER_OBJS_ABS =
-
-# User Includes
-## C Compiler
-USER_INC_DIRS = inc
-USER_INC_DIRS_ABS =
-USER_INC_FILES =
-USER_INC_FILES_ABS =
-## C++ Compiler
-USER_CPP_INC_DIRS =
-USER_CPP_INC_DIRS_ABS =
-USER_CPP_INC_FILES =
-USER_CPP_INC_FILES_ABS =
-
-# User Library Path
-USER_LIB_DIRS =
-USER_LIB_DIRS_ABS =
-
-# EDC Resource Path
-USER_EDCS_IMAGE_DIRS =
-USER_EDCS_IMAGE_DIRS_ABS =
-USER_EDCS_SOUND_DIRS =
-USER_EDCS_SOUND_DIRS_ABS =
-USER_EDCS_FONT_DIRS =
-USER_EDCS_FONT_DIRS_ABS =
-
-# EDC Flags
-USER_EXT_EDC_KEYS =
-
+++ /dev/null
-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Apache License, Version 2.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-
-#include "tct_common.h"
-
-/**
-* @function TCTCheckSystemInfoFeatureSupported
-* @description Check the supported feature for the given key value
-* @parameter char* pszKey : key value, char* pszModuleName : module name
-* @return true if supported else false
-*/
-bool TCTCheckSystemInfoFeatureSupported(char* pszKey, char* pszModuleName)
-{
- if ( NULL == pszKey )
- {
- FPRINTF("[Line : %d][%s] Null key value passed to function : TCTCheckSystemInfoFeatureSupported\\n", __LINE__, pszModuleName);
- return false;
- }
-
- bool bValue = false;
- int nRet = system_info_get_platform_bool (pszKey, &bValue);
-
- if ( nRet != SYSTEM_INFO_ERROR_NONE )
- {
- FPRINTF("[Line : %d][%s] system_info_get_platform_bool returned (error = %s) for (key = %s)\\n", __LINE__, pszModuleName, TCTSystemInfoGetError(nRet), pszKey);
- return false;
- }
-
- if ( bValue )
- {
- FPRINTF("[Line : %d][%s] Feature %s is supported\\n", __LINE__, pszModuleName, pszKey);
- }
- else
- {
- FPRINTF("[Line : %d][%s] Feature %s is not supported\\n", __LINE__, pszModuleName, pszKey);
- }
-
-
- return bValue;
-}
-
-/**
-* @function TCTSystemInfoGetError
-* @description Maps error enums to string values
-* @parameter nRet : error code returned
-* @return error string
-*/
-char* TCTSystemInfoGetError(int nRet)
-{
- char *szErrorVal = NULL;
-
- switch ( nRet )
- {
- case SYSTEM_INFO_ERROR_NONE: szErrorVal = "SYSTEM_INFO_ERROR_NONE"; break;
- case SYSTEM_INFO_ERROR_INVALID_PARAMETER: szErrorVal = "SYSTEM_INFO_ERROR_INVALID_PARAMETER"; break;
- case SYSTEM_INFO_ERROR_IO_ERROR: szErrorVal = "SYSTEM_INFO_ERROR_IO_ERROR"; break;
- case SYSTEM_INFO_ERROR_OUT_OF_MEMORY : szErrorVal = "SYSTEM_INFO_ERROR_OUT_OF_MEMORY"; break;
- default : szErrorVal = "Unknown error"; break;
- }
-
- return szErrorVal;
-}
-
-/**
-* @function GetValueFromConfigFile
-* @description Get the corresponding value for a key from config file
-* @parameter pstrKeyString : Key, pstrValue : Value
-* @return true for success, false for failure
-*/
-bool GetValueFromConfigFile(char* pstrKeyString, char* pstrValue, char* pstrModule)
-{
- if ( NULL == pstrKeyString )
- {
- FPRINTF("[Line : %d][%s] The key string provided to fetch config file value is null\\n", __LINE__, pstrModule);
- return false;
- }
-
-
- FILE* pfilePtr = fopen(CONFIGFILE_PATH, "r");
- if ( NULL == pfilePtr )
- {
- FPRINTF("[Line : %d][%s] Unable to open configuration file : %s\\n", __LINE__, pstrModule, CONFIGFILE_PATH);
- return false;
- }
-
- char* pszKey = NULL;
- char* pszValue = NULL;
- char* pszDelim = "=\n";
- char szConfigLine[CONFIG_LINE_LEN_MAX] = {0,};
-
- while ( !feof(pfilePtr) )
- {
- if ( fgets(szConfigLine, CONFIG_LINE_LEN_MAX, pfilePtr) != NULL )
- {
- pszKey = strtok(szConfigLine, pszDelim);
- pszValue = strtok(NULL, pszDelim);
-
- if ( 0 == strcmp(pszKey, pstrKeyString) )
- {
-#if DEBUG
- FPRINTF("[Line : %d][%s][Key = %s;Config value = %s]\\n", __LINE__, pstrModule, pszKey, pszValue);
-#endif
- break;
- }
-
- pszKey = NULL;
- pszValue = NULL;
- }
- }
-
- fclose(pfilePtr);
- if ( NULL == pszValue )
- {
- FPRINTF("[Line : %d][%s][Key = %s;Unable to retrieve config value for this key. Check key at config file location : %s]\\n", __LINE__, pstrModule, pstrKeyString, CONFIGFILE_PATH);
- return false;
- }
-
- if (strlen(pszValue) >= CONFIG_VALUE_LEN_MAX )
- {
- FPRINTF("[Line : %d][%s][Key = %s;Config Value should be less than %d characters in length]\\n", __LINE__, pstrModule, pszKey, CONFIG_VALUE_LEN_MAX);
- return false;
- }
-
- memset(pstrValue, 0, CONFIG_VALUE_LEN_MAX);
- strcpy(pstrValue, pszValue);
- return true;
-}
+++ /dev/null
-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Apache License, Version 2.0 (the License);
-// you may not use this g_TCFILE except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
-#include <stdio.h>
-#include <string.h>
-#include "{TESTSUITE_NAME}.h"
-#include <malloc.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/wait.h>
-#include <glib.h>
-#include <stdbool.h>
-#include "tct_common.h"
-#include <app.h>
-#include <dlog.h>
-#include <errno.h>
-
-#include <Elementary.h>
-#include <efl_extension.h>
-
-typedef struct appdata {
- Evas_Object *win;
- Evas_Object *conform;
- Evas_Object *label;
-} appdata_s;
-
-static bool app_create(void *data)
-{
- return true;
-}
-
-static void app_control(app_control_h app_control, void *data)
-{
- char* pszGetTCName = NULL;
- int i=0, result=0, nRet=0;
- nRet = app_control_get_extra_data(app_control, "testcase_name", &pszGetTCName);
- if(nRet != APP_CONTROL_ERROR_NONE)
- {
- dlog_print(DLOG_ERROR, "NativeTCT", "[%s:%d] app_control_get_extra_data returns error = %d", __FUNCTION__, __LINE__, nRet);
- PRINT_UTC_LOG("\\n[%s][Line : %d]Unable to fetch test case name: app_control_get_extra_data API call fails\\n", __FILE__, __LINE__);
- PRINT_TC_RESULT("%d",1);
- FREE_MEMORY(pszGetTCName);
- return;
- }
-
- dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Executing TC Name = %s", __FUNCTION__, __LINE__, pszGetTCName);
- for ( i = 0; tc_array[i].name; i++ )
- {
- if ( 0 == strncmp(pszGetTCName, tc_array[i].name, strlen(pszGetTCName)) )
- {
- DUMP_UTC_ERRLOG();
- if ( tc_array[i].startup )
- {
- dlog_print(DLOG_INFO, "NativeTCT", "%s : Start up", pszGetTCName);
- tc_array[i].startup();
- }
-
- dlog_print(DLOG_INFO, "NativeTCT", "%s : Body", pszGetTCName);
- result = tc_array[i].function();
- dlog_print(DLOG_INFO, "NativeTCT", "%s returns value = %d", pszGetTCName, result);
-
- if ( tc_array[i].cleanup )
- {
- dlog_print(DLOG_INFO, "NativeTCT", "%s : Clean up", pszGetTCName);
- tc_array[i].cleanup();
- }
-
- CLOSE_UTC_ERRLOG();
- PRINT_TC_RESULT("%d",result);
- FREE_MEMORY(pszGetTCName);
- return;
- }
- }
-
- dlog_print(DLOG_ERROR, "NativeTCT", "[%s:%d] Unable to execute %s : Unknown Test Case Name", __FUNCTION__, __LINE__, pszGetTCName);
- PRINT_UTC_LOG("\\n[%s][Line : %d]Unable to execute %s : Unknown Test Case Name\\n", __FILE__, __LINE__, pszGetTCName);
- PRINT_TC_RESULT("%d",1);
- FREE_MEMORY(pszGetTCName);
- return;
-}
-
-static void app_terminate(void *data)
-{
- dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Application Package is now Terminating", __FUNCTION__, __LINE__);
-}
-
-int main(int argc, char *argv[])
-{
- int ret = 0;
- appdata_s ad = {0,};
-
- ui_app_lifecycle_callback_s event_callback = {0,};
- event_callback.create = app_create;
- event_callback.terminate = app_terminate;
- event_callback.app_control = app_control;
-
- dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Application Main Function is Invoked", __FUNCTION__, __LINE__);
- ret = ui_app_main(argc, argv, &event_callback, &ad);
- if (ret != APP_ERROR_NONE)
- {
- dlog_print(DLOG_ERROR, "NativeTCT", "Application ui_app_main call gets failed. err = %d", ret);
- PRINT_UTC_LOG("\\n[%s][Line : %d]Application ui_app_main call gets failed. err = %d\\n", __FILE__, __LINE__, ret);
- PRINT_TC_RESULT("%d",1);
- return ret;
- }
-
- dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Application Package is Terminated", __FUNCTION__, __LINE__);
- return ret;
-}
+++ /dev/null
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns="http://tizen.org/ns/packages" api-version="2.4" package="org.tizen.{TESTSUITE_NAME}" version="1.0.0">
- <profile name="mobile" />
- <ui-application appid="org.tizen.{TESTSUITE_NAME}" exec="{TESTSUITE_NAME}" type="capp" multiple="false" taskmanage="true" nodisplay="false">
- <icon>{TESTSUITE_NAME}.png</icon>
- <label>{TESTSUITE_NAME}</label>
- </ui-application>
- <privileges>
- <privilege></privilege>
- </privileges>
-</manifest>
+++ /dev/null
-Copyright (c) 2015 Samsung Electronics Co.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of works must retain the original copyright notice, this list
- of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the original copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-* Neither the name of Intel Corporation nor the names of its contributors
- may be used to endorse or promote products derived from this work without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
+++ /dev/null
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+++ /dev/null
-commondir = resources webrunner
-SUBDIRS = testcase $(commondir)
-docdir = $(prefix)/opt/{TESTSUITE_NAME}
-dist_doc_DATA = README tests.xml tests.full.xml NOTICE LICENSE.Apache-2.0 COPYING
+++ /dev/null
-Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
-Copyright (c) 2012 Intel Corporation.
-Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
-Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
-or the COPYING file for BSD-3-Clause License.
+++ /dev/null
-----------------------------------------------
-License
-----------------------------------------------
-Copyright (c) 2015 Samsung Electronics Co.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of works must retain the original copyright notice, this list
- of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the original copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-* Neither the name of Intel Corporation nor the names of its contributors
- may be used to endorse or promote products derived from this work without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Authors:
-
-
-----------------------------------------------
-Introduction
-----------------------------------------------
-This test suite is for testing Tizen {API_NAME} API, which covers the following specifications:
-
-
-
-----------------------------------------------
-Test Environment
-----------------------------------------------
-1. Testkit-stub must be installed on target device.
-2. Testkit-lite must be installed on test machine.
-
-
-----------------------------------------------
-Build and Run
-----------------------------------------------
-(Suppose you only get the source code and Testkit-Lite has been set up on your test machine.
- If you have obtained tct-alarm-tizen-tests ZIP packages, you can directly go to step 3 on the test machine;
- if you have not installed Testkit-Lite, you need to install the latest version.)
-
-Steps:
-1. Prepare for building by running the following command:
- cd {TESTSUITE_NAME}
-
-2. Build ZIP package by running the following command:
- ./pack.sh
-
-3. Unzip the package on the test machine by running the following command:
- unzip -o {TESTSUITE_NAME}-<version>.zip -d /opt/usr/media/tct
-
-4. Install the package on the test machine by running the following command:
- /opt/usr/media/tct/opt/{TESTSUITE_NAME}/inst.sh
-
-5. Run test cases by running the following command on host:
- testkit-lite -f device:/opt/usr/media/tct/opt/{TESTSUITE_NAME}/tests.xml -e "WRTLauncher" -o {TESTSUITE_NAME}.results.xml
+++ /dev/null
-#!/bin/sh
-
-autoreconf --install
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<widget id='http://tizen.org/test/{TESTSUITE_NAME}' xmlns='http://www.w3.org/ns/widgets' xmlns:tizen='http://tizen.org/ns/widgets' version='{TIZEN_VERSION}'>
- <name>{TESTSUITE_NAME}</name>
- <icon src="icon.png" height="117" width="117"/>
- <tizen:application id="{APP_ID}" package="{PACK_ID}" required_version="{REQUIRED_VER}"/>
- <tizen:setting screen-orientation="landscape" />
- <tizen:setting background-support="enable"/>
-</widget>
+++ /dev/null
-AC_INIT([{TESTSUITE_NAME}], [2.4], [kimsamsung@samsung.com])
-AM_INIT_AUTOMAKE([-Wall -Werror foreign])
-
-AC_CONFIG_FILES([Makefile \
-testcase/Makefile \
-resources/Makefile \
-webrunner/Makefile])
-AC_OUTPUT
+++ /dev/null
-#!/bin/bash
-wgt_installer="pkgcmd"
-NAME=$(basename $(cd $(dirname $0);pwd))
-
-#parse params
-USAGE="Usage: ./inst.sh [-i] [-u]
- -i install wgt and config environment
- -u uninstall wgt and remove source file
-[-i] option was set as default."
-
-function installpkg(){
-### install wgt ###
-type $wgt_installer > /dev/null 2>&1
-if [ $? -eq 0 ]; then
- [ -e /opt/usr/media/tct/opt/$NAME/$NAME.wgt ] && $wgt_installer -i -t wgt -q -p /opt/usr/media/tct/opt/$NAME/$NAME.wgt
- if [ $? -eq 0 ]; then
- echo "Install /opt/usr/media/tct/opt/$NAME/$NAME.wgt to /opt/usr/apps/`wrt-launcher -l 2> /dev/null | grep $NAME | tail -n 1 | awk '{ print $(NF-1) }'` done"
- echo "$(wrt-launcher -l | grep $NAME | awk '{ print $(NF-1) }') sdbd rw" | smackload
- else
- echo "Install /opt/$NAME/$NAME.wgt fail ..."
- fi
- sync
-fi
-}
-
-function uninstallpkg(){
-### uninstall wgt ###
-type $wgt_installer > /dev/null 2>&1
-if [ $? -eq 0 ]; then
- package_id=`wrt-launcher -l 2> /dev/null | grep $NAME | tail -n 1 | awk '{ print $(NF-1) }'`
- if [ -n "$(ps -ef | grep $package_id | grep -v grep | awk '{print $2}')" ]; then
- for i in $(ps -ef | grep $package_id | grep -v grep | awk '{print $2}')
- do
- kill -9 $i
- if [ "$?" -ne 0 ]; then
- echo "Kill the processes of $NAME fail ..."
- else
- echo "Kill the processes of $NAME done"
- fi
- done
- fi
- if [ -n "$package_id" ]; then
- $wgt_installer -u -q -t wgt -n $package_id
- if [ "$?" -ne 0 ]; then
- echo "Uninstall $NAME fail ..."
- else
- echo "Uninstall $NAME done"
- fi
- sync
- fi
- for i in testalar00
- do
- if [ -n "$(ps -ef | grep $i | grep -v grep | awk '{print $2}')" ]; then
- kill -9 $(ps -ef | grep $i | grep -v grep | awk '{print $2}')
- if [ "$?" -ne 0 ]; then
- echo "Kill the processes of $i fail ..."
- else
- echo "Kill the processes of $i done"
- fi
- fi
- INSTALLED=`wrt-launcher -l | awk /$i/' { print $(NF); }'`
- if [ -n "$INSTALLED" ] ; then
- $wgt_installer -u -q -t wgt -n $i
- if [ "$?" -ne 0 ]; then
- echo "Uninstall $i fail ..."
- else
- echo "Uninstall $i done"
- fi
- fi
- done
-fi
-
-### remove source file ###
-if [ -d /opt/usr/media/tct/opt/$NAME ];then
- rm -rf /opt/usr/media/tct/opt/$NAME
-else
- echo "Remove source file fail,please check if the source file exist: /opt/usr/media/tct/opt/$NAME ..."
-fi
-}
-
-case "$1" in
- -h|--help) echo "$USAGE"
- exit ;;
- ""|-i) installpkg;;
- -u) uninstallpkg;;
- *) echo "Unknown option: $1"
- echo "$USAGE"
- exit ;;
-esac
+++ /dev/null
-{
- "version": "{TIZEN_VERSION}",
- "name": "{TESTSUITE_NAME}",
- "permissions": ["tabs", "unlimited_storage", "notifications", "http://*/*", "https://*/*"],
- "description": "{TESTSUITE_NAME}",
- "webapimanager": true,
- "file_name": "manifest.json",
- "app": {
- "launch": {
- "local_path": "index.html"
- }
- }
-}
+++ /dev/null
-#!/bin/bash
-source $(dirname $0)/$(basename $(pwd)).spec
-
-#parse params
-usage="Usage: ./pack.sh [-t <package type: wgt | apk | crx | xpk>]
-[-t wgt] option was set as default."
-
-if [[ $1 == "-h" || $1 == "--help" ]]; then
- echo $usage
- exit 1
-fi
-
-type="wgt"
-while getopts t: o
-do
- case "$o" in
- t) type=$OPTARG;;
- *) echo $usage
- exit 1;;
- esac
-done
-
-if [[ $type == "wgt" || $type == "apk" || $type == "crx" || $type == "xpk" ]];then
- echo "Create package with $type and raw source"
-else
- echo "Sorry,$type is not support... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
- echo "$usage"
- exit 1
-fi
-
-if [[ -z $name || -z $version || -z $appname ]];then
- echo "Package name or version not specified in setting file"
- exit 1
-fi
-
-SRC_ROOT=$PWD
-BUILD_ROOT=/tmp/${name}_pack
-BUILD_DEST=/tmp/${name}
-
-# check precondition
-function check_precondition(){
- which $1 > /dev/null 2>&1
- if [ $? -ne 0 ]; then
- echo "Error: no tool: $1"
- exit 1
- fi
-}
-check_precondition autoreconf
-check_precondition gcc
-check_precondition make
-
-# clean
-function clean_workspace(){
-echo "cleaning workspace... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
-rm -rf $BUILD_ROOT $BUILD_DEST
-}
-
-clean_workspace
-mkdir -p $BUILD_ROOT $BUILD_DEST
-
-# copy source code
-rm -rf *.rpm *.tar.bz2 *.tar.gz *.zip
-cp -arf $SRC_ROOT/* $BUILD_ROOT/
-
-# build
-echo "build from workspace... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
-cd $BUILD_ROOT
-./autogen && ./configure --prefix=/ && make && make install DESTDIR=$BUILD_DEST
-if [ $? -ne 0 ];then
- echo "build fail,please check Makefile.am and cofigure.ac... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
- clean_workspace
- exit 1
-fi
-find $BUILD_DEST -name "Makefile*" -delete
-
-## function for create wgt apk xpk ##
-
-function create_wgt(){
-# create wgt
-cd $BUILD_DEST
-cp -a $BUILD_ROOT/manifest.json $BUILD_DEST/
-cp -a $BUILD_ROOT/icon.png $BUILD_DEST/
-cat > index.html << EOF
-<!doctype html>
-<head>
- <meta http-equiv="Refresh" content="1; url=opt/$name/webrunner/index.html?testsuite=/opt/usr/media/tct/opt/$name/tests.xml">
-</head>
-EOF
-cp -f $BUILD_ROOT/config.xml $BUILD_DEST/config.xml
-zip -rq $BUILD_DEST/opt/$name/$name.wgt *
-if [ $? -ne 0 ];then
- echo "Create $name.wgt fail.... >>>>>>>>>>>>>>>>>>>>>>>>>"
- clean_workspace
- exit 1
-fi
-
-# sign wgt
-if [ $sign -eq 1 ];then
- # copy signing tool
- echo "copy signing tool... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
- cp -arf $SRC_ROOT/../../tools/signing $BUILD_ROOT/signing
- if [ $? -ne 0 ];then
- echo "No signing tool found in $SRC_ROOT/../tools.... >>>>>>>>>>>>>>>>>>>>>>>>>"
- clean_workspace
- exit 1
- fi
- wgt=$(find $BUILD_DEST/opt/$name/ -name *.wgt)
- for wgt in $(find $BUILD_DEST/opt/$name/ -name *.wgt);do
- $BUILD_ROOT/signing/sign-widget.sh --dist platform $wgt
- if [ $? -ne 0 ];then
- echo "Please check your signature files... >>>>>>>>>>>>>>>>>>>>>>>>>"
- clean_workspace
- exit 1
- fi
- done
-fi
-}
-
-function create_apk(){
-cd $BUILD_DEST
-cat > index.html << EOF
-<!doctype html>
-<head>
- <meta http-equiv="Refresh" content="1; url=opt/$name/webrunner/index.html?testsuite=../tests.xml&testprefix=../../..">
-</head>
-EOF
-cp $BUILD_DEST/opt/$name/tests.xml $BUILD_DEST/
-cp -a $BUILD_ROOT/icon.png $BUILD_DEST/
-cp -r $SRC_ROOT/../tools/xwalk_app_template $BUILD_ROOT/xwalk_app_template
-
-cd $BUILD_ROOT/xwalk_app_template
-python make_apk.py --package=org.xwalk.$appname --name=$appname --app-root=$BUILD_DEST --app-local-path=index.html --icon=$BUILD_DEST/icon.png
-if [ $? -ne 0 ];then
- echo "Create $name.apk fail.... >>>>>>>>>>>>>>>>>>>>>>>>>"
- clean_workspace
- exit 1
-fi
-}
-
-function create_xpk(){
-cp -a $BUILD_ROOT/manifest.json $BUILD_DEST/
-cp -a $BUILD_ROOT/icon.png $BUILD_DEST/
-
-cd $BUILD_DEST
-cat > index.html << EOF
-<!doctype html>
-<head>
- <meta http-equiv="Refresh" content="1; url=opt/$name/webrunner/index.html?testsuite=../tests.xml&testprefix=../../..">
-</head>
-EOF
-
-cp $SRC_ROOT/../tools/xpk_generator $BUILD_ROOT/xpk_generator
-cd $BUILD_ROOT
-./xpk_generator /tmp/$name key
-if [ $? -ne 0 ];then
- echo "Create $name.xpk fail.... >>>>>>>>>>>>>>>>>>>>>>>>>"
- clean_workspace
- exit 1
-fi
-}
-
-function create_crx(){
-echo "crx is not support yet... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
-clean_workspace
-exit 1
-}
-
-## zip function ##
-function zip_for_wgt(){
-cd $BUILD_DEST
-# cp inst.sh script #
-cp -af $BUILD_ROOT/inst.sh $BUILD_DEST/opt/$name/inst.sh
-
-if [ $src_file -eq 0 ];then
- for file in $(ls opt/$name |grep -v wgt);do
- if [[ "${whitelist[@]}" =~ $file ]];then
- echo "$file in whitelist,keep it..."
- else
- echo "Remove unnessary file:$file..."
- rm -rf opt/$name/$file
- fi
- done
-fi
-zip -Drq $BUILD_DEST/$name-$version.zip opt/
-if [ $? -ne 0 ];then
- echo "Create zip package fail... >>>>>>>>>>>>>>>>>>>>>>>>>"
- clean_workspace
- exit 1
-fi
-}
-
-function zip_for_apk(){
-cd $BUILD_DEST
-# cp inst.sh script #
-cp -af $BUILD_ROOT/inst.sh.apk $BUILD_DEST/opt/$name/inst.sh
-mv $BUILD_ROOT/xwalk_app_template/$appname.apk $BUILD_DEST/opt/$name/
-
-if [ $src_file -eq 0 ];then
- for file in $(ls opt/$name |grep -v apk);do
- if [[ "${whitelist[@]}" =~ $file ]];then
- echo "$file in whitelist,keep it..."
- else
- echo "Remove unnessary file:$file..."
- rm -rf opt/$name/$file
- fi
- done
-fi
-zip -Drq $BUILD_DEST/$name-$version.zip opt/
-if [ $? -ne 0 ];then
- echo "Create zip package fail... >>>>>>>>>>>>>>>>>>>>>>>>>"
- clean_workspace
- exit 1
-fi
-}
-
-function zip_for_xpk(){
-cd $BUILD_DEST
-cp -af $BUILD_ROOT/inst.sh.xpk $BUILD_DEST/opt/$name/inst.sh
-mv $BUILD_ROOT/$name.xpk $BUILD_DEST/opt/$name/
-
-if [ $src_file -eq 0 ];then
- for file in $(ls opt/$name |grep -v xpk);do
- if [[ "${whitelist[@]}" =~ $file ]];then
- echo "$file in whitelist,keep it..."
- else
- echo "Remove unnessary file:$file..."
- rm -rf opt/$name/$file
- fi
- done
-fi
-zip -Drq $BUILD_DEST/$name-$version.zip opt/
-if [ $? -ne 0 ];then
- echo "Create zip package fail... >>>>>>>>>>>>>>>>>>>>>>>>>"
- clean_workspace
- exit 1
-fi
-}
-
-function zip_for_crx(){
-echo "zip_for_crx not ready yet... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
-clean_workspace
-exit 1
-}
-
-## create wgt crx apk xpk and zip package ##
-case $type in
- wgt) create_wgt
- zip_for_wgt;;
- apk) create_apk
- zip_for_apk;;
- xpk) create_xpk
- zip_for_xpk;;
- crx) create_crx
- zip_for_crx;;
-esac
-
-
-# copy zip file
-echo "copy package from workspace... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
-cp -f $BUILD_DEST/$name-$version.zip $SRC_ROOT/$name-$version.zip
-
-# clean workspace
-clean_workspace
-
-# validate
-echo "checking result... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
-if [ -z "`ls $SRC_ROOT | grep "\.zip"`" ];then
- echo "------------------------------ FAILED to build $name packages --------------------------"
- exit 1
-fi
-
-echo "------------------------------ Done to build $name packages --------------------------"
-cd $SRC_ROOT
-ls *.zip 2>/dev/null
+++ /dev/null
-All test files under this folder except COPYING and Makefile.am come from
-https://github.com/w3c/testharness.js (commit 81649066b179216eed02dfb58f631eb8bb6c7629)
-without any modification besides the necessary adjustment on reference path to test harness
-
-These tests are copyright by W3C and/or the author listed in the test
-file. The tests are dual-licensed under the W3C Test Suite License:
-http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
-and the BSD 3-clause License:
-http://www.w3.org/Consortium/Legal/2008/03-bsd-license
-under W3C's test suite licensing policy:
-http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright
-
+++ /dev/null
-resources_SCRIPTS = *
-resourcesdir = $(prefix)/opt/{TESTSUITE_NAME}/resources
-EXTRA_DIST = $(resources_SCRIPTS)
-docdir = $(prefix)/opt/{TESTSUITE_NAME}/resources
-dist_doc_DATA = COPYING
+++ /dev/null
-html {
- font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;
-}
-
-#log .warning,
-#log .warning a {
- color: black;
- background: yellow;
-}
-
-#log .error,
-#log .error a {
- color: white;
- background: red;
-}
-
-#log pre {
- border: 1px solid black;
- padding: 1em;
-}
-
-section#summary {
- margin-bottom:1em;
-}
-
-table#results {
- border-collapse:collapse;
- table-layout:fixed;
- width:100%;
-}
-
-table#results th:first-child,
-table#results td:first-child {
- width:4em;
-}
-
-table#results th:last-child,
-table#results td:last-child {
- width:50%;
-}
-
-table#results.assertions th:last-child,
-table#results.assertions td:last-child {
- width:35%;
-}
-
-table#results th {
- padding:0;
- padding-bottom:0.5em;
- border-bottom:medium solid black;
-}
-
-table#results td {
- padding:1em;
- padding-bottom:0.5em;
- border-bottom:thin solid black;
-}
-
-tr.pass > td:first-child {
- color:green;
-}
-
-tr.fail > td:first-child {
- color:red;
-}
-
-tr.timeout > td:first-child {
- color:red;
-}
-
-tr.notrun > td:first-child {
- color:blue;
-}
-
-.pass > td:first-child, .fail > td:first-child, .timeout > td:first-child, .notrun > td:first-child {
- font-variant:small-caps;
-}
-
-table#results span {
- display:block;
-}
-
-table#results span.expected {
- font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace;
- white-space:pre;
-}
-
-table#results span.actual {
- font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace;
- white-space:pre;
-}
-
+++ /dev/null
-/*
-Distributed under both the W3C Test Suite License [1] and the W3C
-3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
-policies and contribution forms [3].
-
-[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
-[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
-[3] http://www.w3.org/2004/10/27-testcases
-*/
-
-/*
- * == Introduction ==
- *
- * This file provides a framework for writing testcases. It is intended to
- * provide a convenient API for making common assertions, and to work both
- * for testing synchronous and asynchronous DOM features in a way that
- * promotes clear, robust, tests.
- *
- * == Basic Usage ==
- *
- * To use this file, import the script and the testharnessreport script into
- * the test document:
- * <script src="/resources/testharness.js"></script>
- * <script src="/resources/testharnessreport.js"></script>
- *
- * Within each file one may define one or more tests. Each test is atomic
- * in the sense that a single test has a single result (pass/fail/timeout).
- * Within each test one may have a number of asserts. The test fails at the
- * first failing assert, and the remainder of the test is (typically) not run.
- *
- * If the file containing the tests is a HTML file with an element of id "log"
- * this will be populated with a table containing the test results after all
- * the tests have run.
- *
- * NOTE: By default tests must be created before the load event fires. For ways
- * to create tests after the load event, see "Determining when all tests
- * are complete", below
- *
- * == Synchronous Tests ==
- *
- * To create a synchronous test use the test() function:
- *
- * test(test_function, name, properties)
- *
- * test_function is a function that contains the code to test. For example a
- * trivial passing test would be:
- *
- * test(function() {assert_true(true)}, "assert_true with true")
- *
- * The function passed in is run in the test() call.
- *
- * properties is an object that overrides default test properties. The
- * recognised properties are:
- * timeout - the test timeout in ms
- *
- * e.g.
- * test(test_function, "Sample test", {timeout:1000})
- *
- * would run test_function with a timeout of 1s.
- *
- * Additionally, test-specific metadata can be passed in the properties. These
- * are used when the individual test has different metadata from that stored
- * in the <head>.
- * The recognized metadata properties are:
- *
- * help - The url of the part of the specification being tested
- *
- * assert - A human readable description of what the test is attempting
- * to prove
- *
- * author - Name and contact information for the author of the test in the
- * format: "Name <email_addr>" or "Name http://contact/url"
- *
- * == Asynchronous Tests ==
- *
- * Testing asynchronous features is somewhat more complex since the result of
- * a test may depend on one or more events or other callbacks. The API provided
- * for testing these features is indended to be rather low-level but hopefully
- * applicable to many situations.
- *
- * To create a test, one starts by getting a Test object using async_test:
- *
- * async_test(name, properties)
- *
- * e.g.
- * var t = async_test("Simple async test")
- *
- * Assertions can be added to the test by calling the step method of the test
- * object with a function containing the test assertions:
- *
- * t.step(function() {assert_true(true)});
- *
- * When all the steps are complete, the done() method must be called:
- *
- * t.done();
- *
- * As a convenience, async_test can also takes a function as first argument.
- * This function is called with the test object as both its `this` object and
- * first argument. The above example can be rewritten as:
- *
- * async_test(function(t) {
- * object.some_event = function() {
- * t.step(function (){assert_true(true); t.done();});
- * };
- * }, "Simple async test");
- *
- * which avoids cluttering the global scope with references to async
- * tests instances.
- *
- * The properties argument is identical to that for test().
- *
- * In many cases it is convenient to run a step in response to an event or a
- * callback. A convenient method of doing this is through the step_func method
- * which returns a function that, when called runs a test step. For example
- *
- * object.some_event = t.step_func(function(e) {assert_true(e.a)});
- *
- * == Making assertions ==
- *
- * Functions for making assertions start assert_
- * The best way to get a list is to look in this file for functions names
- * matching that pattern. The general signature is
- *
- * assert_something(actual, expected, description)
- *
- * although not all assertions precisely match this pattern e.g. assert_true
- * only takes actual and description as arguments.
- *
- * The description parameter is used to present more useful error messages when
- * a test fails
- *
- * NOTE: All asserts must be located in a test() or a step of an async_test().
- * asserts outside these places won't be detected correctly by the harness
- * and may cause a file to stop testing.
- *
- * == Setup ==
- *
- * Sometimes tests require non-trivial setup that may fail. For this purpose
- * there is a setup() function, that may be called with one or two arguments.
- * The two argument version is:
- *
- * setup(func, properties)
- *
- * The one argument versions may omit either argument.
- * func is a function to be run synchronously. setup() becomes a no-op once
- * any tests have returned results. Properties are global properties of the test
- * harness. Currently recognised properties are:
- *
- * timeout - The time in ms after which the harness should stop waiting for
- * tests to complete (this is different to the per-test timeout
- * because async tests do not start their timer until .step is called)
- *
- * explicit_done - Wait for an explicit call to done() before declaring all
- * tests complete (see below)
- *
- * output_document - The document to which results should be logged. By default
- * this is the current document but could be an ancestor
- * document in some cases e.g. a SVG test loaded in an HTML
- * wrapper
- *
- * explicit_timeout - disable file timeout; only stop waiting for results
- * when the timeout() function is called (typically for
- * use when integrating with some existing test framework
- * that has its own timeout mechanism).
- *
- * == Determining when all tests are complete ==
- *
- * By default the test harness will assume there are no more results to come
- * when:
- * 1) There are no Test objects that have been created but not completed
- * 2) The load event on the document has fired
- *
- * This behaviour can be overridden by setting the explicit_done property to
- * true in a call to setup(). If explicit_done is true, the test harness will
- * not assume it is done until the global done() function is called. Once done()
- * is called, the two conditions above apply like normal.
- *
- * == Generating tests ==
- *
- * NOTE: this functionality may be removed
- *
- * There are scenarios in which is is desirable to create a large number of
- * (synchronous) tests that are internally similar but vary in the parameters
- * used. To make this easier, the generate_tests function allows a single
- * function to be called with each set of parameters in a list:
- *
- * generate_tests(test_function, parameter_lists, properties)
- *
- * For example:
- *
- * generate_tests(assert_equals, [
- * ["Sum one and one", 1+1, 2],
- * ["Sum one and zero", 1+0, 1]
- * ])
- *
- * Is equivalent to:
- *
- * test(function() {assert_equals(1+1, 2)}, "Sum one and one")
- * test(function() {assert_equals(1+0, 1)}, "Sum one and zero")
- *
- * Note that the first item in each parameter list corresponds to the name of
- * the test.
- *
- * The properties argument is identical to that for test(). This may be a
- * single object (used for all generated tests) or an array.
- *
- * == Callback API ==
- *
- * The framework provides callbacks corresponding to 3 events:
- *
- * start - happens when the first Test is created
- * result - happens when a test result is recieved
- * complete - happens when all results are recieved
- *
- * The page defining the tests may add callbacks for these events by calling
- * the following methods:
- *
- * add_start_callback(callback) - callback called with no arguments
- * add_result_callback(callback) - callback called with a test argument
- * add_completion_callback(callback) - callback called with an array of tests
- * and an status object
- *
- * tests have the following properties:
- * status: A status code. This can be compared to the PASS, FAIL, TIMEOUT and
- * NOTRUN properties on the test object
- * message: A message indicating the reason for failure. In the future this
- * will always be a string
- *
- * The status object gives the overall status of the harness. It has the
- * following properties:
- * status: Can be compared to the OK, ERROR and TIMEOUT properties
- * message: An error message set when the status is ERROR
- *
- * == External API ==
- *
- * In order to collect the results of multiple pages containing tests, the test
- * harness will, when loaded in a nested browsing context, attempt to call
- * certain functions in each ancestor and opener browsing context:
- *
- * start - start_callback
- * result - result_callback
- * complete - completion_callback
- *
- * These are given the same arguments as the corresponding internal callbacks
- * described above.
- *
- * == External API through cross-document messaging ==
- *
- * Where supported, the test harness will also send messages using
- * cross-document messaging to each ancestor and opener browsing context. Since
- * it uses the wildcard keyword (*), cross-origin communication is enabled and
- * script on different origins can collect the results.
- *
- * This API follows similar conventions as those described above only slightly
- * modified to accommodate message event API. Each message is sent by the harness
- * is passed a single vanilla object, available as the `data` property of the
- * event object. These objects are structures as follows:
- *
- * start - { type: "start" }
- * result - { type: "result", test: Test }
- * complete - { type: "complete", tests: [Test, ...], status: TestsStatus }
- *
- * == List of assertions ==
- *
- * assert_true(actual, description)
- * asserts that /actual/ is strictly true
- *
- * assert_false(actual, description)
- * asserts that /actual/ is strictly false
- *
- * assert_equals(actual, expected, description)
- * asserts that /actual/ is the same value as /expected/
- *
- * assert_not_equals(actual, expected, description)
- * asserts that /actual/ is a different value to /expected/. Yes, this means
- * that "expected" is a misnomer
- *
- * assert_in_array(actual, expected, description)
- * asserts that /expected/ is an Array, and /actual/ is equal to one of the
- * members -- expected.indexOf(actual) != -1
- *
- * assert_array_equals(actual, expected, description)
- * asserts that /actual/ and /expected/ have the same length and the value of
- * each indexed property in /actual/ is the strictly equal to the corresponding
- * property value in /expected/
- *
- * assert_approx_equals(actual, expected, epsilon, description)
- * asserts that /actual/ is a number within +/- /epsilon/ of /expected/
- *
- * assert_less_than(actual, expected, description)
- * asserts that /actual/ is a number less than /expected/
- *
- * assert_greater_than(actual, expected, description)
- * asserts that /actual/ is a number greater than /expected/
- *
- * assert_less_than_equal(actual, expected, description)
- * asserts that /actual/ is a number less than or equal to /expected/
- *
- * assert_greater_than_equal(actual, expected, description)
- * asserts that /actual/ is a number greater than or equal to /expected/
- *
- * assert_regexp_match(actual, expected, description)
- * asserts that /actual/ matches the regexp /expected/
- *
- * assert_class_string(object, class_name, description)
- * asserts that the class string of /object/ as returned in
- * Object.prototype.toString is equal to /class_name/.
- *
- * assert_own_property(object, property_name, description)
- * assert that object has own property property_name
- *
- * assert_inherits(object, property_name, description)
- * assert that object does not have an own property named property_name
- * but that property_name is present in the prototype chain for object
- *
- * assert_idl_attribute(object, attribute_name, description)
- * assert that an object that is an instance of some interface has the
- * attribute attribute_name following the conditions specified by WebIDL
- *
- * assert_readonly(object, property_name, description)
- * assert that property property_name on object is readonly
- *
- * assert_throws(code, func, description)
- * code - the expected exception:
- * o string: the thrown exception must be a DOMException with the given
- * name, e.g., "TimeoutError" (for compatibility with existing
- * tests, a constant is also supported, e.g., "TIMEOUT_ERR")
- * o object: the thrown exception must have a property called "name" that
- * matches code.name
- * o null: allow any exception (in general, one of the options above
- * should be used)
- * func - a function that should throw
- *
- * assert_unreached(description)
- * asserts if called. Used to ensure that some codepath is *not* taken e.g.
- * an event does not fire.
- *
- * assert_any(assert_func, actual, expected_array, extra_arg_1, ... extra_arg_N)
- * asserts that one assert_func(actual, expected_array_N, extra_arg1, ..., extra_arg_N)
- * is true for some expected_array_N in expected_array. This only works for assert_func
- * with signature assert_func(actual, expected, args_1, ..., args_N). Note that tests
- * with multiple allowed pass conditions are bad practice unless the spec specifically
- * allows multiple behaviours. Test authors should not use this method simply to hide
- * UA bugs.
- *
- * assert_exists(object, property_name, description)
- * *** deprecated ***
- * asserts that object has an own property property_name
- *
- * assert_not_exists(object, property_name, description)
- * *** deprecated ***
- * assert that object does not have own property property_name
- */
-
-(function ()
-{
- var debug = false;
- // default timeout is 5 seconds, test can override if needed
- var settings = {
- output:true,
- timeout:5000,
- test_timeout:2000
- };
-
- var xhtml_ns = "http://www.w3.org/1999/xhtml";
-
- // script_prefix is used by Output.prototype.show_results() to figure out
- // where to get testharness.css from. It's enclosed in an extra closure to
- // not pollute the library's namespace with variables like "src".
- var script_prefix = null;
- (function ()
- {
- var scripts = document.getElementsByTagName("script");
- for (var i = 0; i < scripts.length; i++)
- {
- if (scripts[i].src)
- {
- var src = scripts[i].src;
- }
- else if (scripts[i].href)
- {
- //SVG case
- var src = scripts[i].href.baseVal;
- }
- if (src && src.slice(src.length - "testharness.js".length) === "testharness.js")
- {
- script_prefix = src.slice(0, src.length - "testharness.js".length);
- break;
- }
- }
- })();
-
- /*
- * API functions
- */
-
- var name_counter = 0;
- function next_default_name()
- {
- //Don't use document.title to work around an Opera bug in XHTML documents
- var prefix = document.getElementsByTagName("title").length > 0 ?
- document.getElementsByTagName("title")[0].firstChild.data :
- "Untitled";
- var suffix = name_counter > 0 ? " " + name_counter : "";
- name_counter++;
- return prefix + suffix;
- }
-
- function test(func, name, properties)
- {
- var test_name = name ? name : next_default_name();
- properties = properties ? properties : {};
- var test_obj = new Test(test_name, properties);
- test_obj.step(func);
- if (test_obj.status === test_obj.NOTRUN) {
- test_obj.done();
- }
- }
-
- function async_test(func, name, properties)
- {
- if (typeof func !== "function") {
- properties = name;
- name = func;
- func = null;
- }
- var test_name = name ? name : next_default_name();
- properties = properties ? properties : {};
- var test_obj = new Test(test_name, properties);
- if (func) {
- test_obj.step(func, test_obj, test_obj);
- }
- return test_obj;
- }
-
- function setup(func_or_properties, maybe_properties)
- {
- var func = null;
- var properties = {};
- if (arguments.length === 2) {
- func = func_or_properties;
- properties = maybe_properties;
- } else if (func_or_properties instanceof Function){
- func = func_or_properties;
- } else {
- properties = func_or_properties;
- }
- tests.setup(func, properties);
- output.setup(properties);
- }
-
- function done() {
- tests.end_wait();
- }
-
- function generate_tests(func, args, properties) {
- forEach(args, function(x, i)
- {
- var name = x[0];
- test(function()
- {
- func.apply(this, x.slice(1));
- },
- name,
- Array.isArray(properties) ? properties[i] : properties);
- });
- }
-
- function on_event(object, event, callback)
- {
- object.addEventListener(event, callback, false);
- }
-
- expose(test, 'test');
- expose(async_test, 'async_test');
- expose(generate_tests, 'generate_tests');
- expose(setup, 'setup');
- expose(done, 'done');
- expose(on_event, 'on_event');
-
- /*
- * Return a string truncated to the given length, with ... added at the end
- * if it was longer.
- */
- function truncate(s, len)
- {
- if (s.length > len) {
- return s.substring(0, len - 3) + "...";
- }
- return s;
- }
-
- /*
- * Convert a value to a nice, human-readable string
- */
- function format_value(val)
- {
- if (Array.isArray(val))
- {
- return "[" + val.map(format_value).join(", ") + "]";
- }
-
- switch (typeof val)
- {
- case "string":
- val = val.replace("\\", "\\\\");
- for (var i = 0; i < 32; i++)
- {
- var replace = "\\";
- switch (i) {
- case 0: replace += "0"; break;
- case 1: replace += "x01"; break;
- case 2: replace += "x02"; break;
- case 3: replace += "x03"; break;
- case 4: replace += "x04"; break;
- case 5: replace += "x05"; break;
- case 6: replace += "x06"; break;
- case 7: replace += "x07"; break;
- case 8: replace += "b"; break;
- case 9: replace += "t"; break;
- case 10: replace += "n"; break;
- case 11: replace += "v"; break;
- case 12: replace += "f"; break;
- case 13: replace += "r"; break;
- case 14: replace += "x0e"; break;
- case 15: replace += "x0f"; break;
- case 16: replace += "x10"; break;
- case 17: replace += "x11"; break;
- case 18: replace += "x12"; break;
- case 19: replace += "x13"; break;
- case 20: replace += "x14"; break;
- case 21: replace += "x15"; break;
- case 22: replace += "x16"; break;
- case 23: replace += "x17"; break;
- case 24: replace += "x18"; break;
- case 25: replace += "x19"; break;
- case 26: replace += "x1a"; break;
- case 27: replace += "x1b"; break;
- case 28: replace += "x1c"; break;
- case 29: replace += "x1d"; break;
- case 30: replace += "x1e"; break;
- case 31: replace += "x1f"; break;
- }
- val = val.replace(RegExp(String.fromCharCode(i), "g"), replace);
- }
- return '"' + val.replace(/"/g, '\\"') + '"';
- case "boolean":
- case "undefined":
- return String(val);
- case "number":
- // In JavaScript, -0 === 0 and String(-0) == "0", so we have to
- // special-case.
- if (val === -0 && 1/val === -Infinity)
- {
- return "-0";
- }
- return String(val);
- case "object":
- if (val === null)
- {
- return "null";
- }
-
- // Special-case Node objects, since those come up a lot in my tests. I
- // ignore namespaces. I use duck-typing instead of instanceof, because
- // instanceof doesn't work if the node is from another window (like an
- // iframe's contentWindow):
- // http://www.w3.org/Bugs/Public/show_bug.cgi?id=12295
- if ("nodeType" in val
- && "nodeName" in val
- && "nodeValue" in val
- && "childNodes" in val)
- {
- switch (val.nodeType)
- {
- case Node.ELEMENT_NODE:
- var ret = "<" + val.tagName.toLowerCase();
- for (var i = 0; i < val.attributes.length; i++)
- {
- ret += " " + val.attributes[i].name + '="' + val.attributes[i].value + '"';
- }
- ret += ">" + val.innerHTML + "</" + val.tagName.toLowerCase() + ">";
- return "Element node " + truncate(ret, 60);
- case Node.TEXT_NODE:
- return 'Text node "' + truncate(val.data, 60) + '"';
- case Node.PROCESSING_INSTRUCTION_NODE:
- return "ProcessingInstruction node with target " + format_value(truncate(val.target, 60)) + " and data " + format_value(truncate(val.data, 60));
- case Node.COMMENT_NODE:
- return "Comment node <!--" + truncate(val.data, 60) + "-->";
- case Node.DOCUMENT_NODE:
- return "Document node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children");
- case Node.DOCUMENT_TYPE_NODE:
- return "DocumentType node";
- case Node.DOCUMENT_FRAGMENT_NODE:
- return "DocumentFragment node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children");
- default:
- return "Node object of unknown type";
- }
- }
-
- // Fall through to default
- default:
- return typeof val + ' "' + truncate(String(val), 60) + '"';
- }
- }
- expose(format_value, "format_value");
-
- /*
- * Assertions
- */
-
- function assert_true(actual, description)
- {
- assert(actual === true, "assert_true", description,
- "expected true got ${actual}", {actual:actual});
- };
- expose(assert_true, "assert_true");
-
- function assert_false(actual, description)
- {
- assert(actual === false, "assert_false", description,
- "expected false got ${actual}", {actual:actual});
- };
- expose(assert_false, "assert_false");
-
- function same_value(x, y) {
- if (y !== y)
- {
- //NaN case
- return x !== x;
- }
- else if (x === 0 && y === 0) {
- //Distinguish +0 and -0
- return 1/x === 1/y;
- }
- else
- {
- //typical case
- return x === y;
- }
- }
-
- function assert_equals(actual, expected, description)
- {
- /*
- * Test if two primitives are equal or two objects
- * are the same object
- */
- if (typeof actual != typeof expected)
- {
- assert(false, "assert_equals", description,
- "expected (" + typeof expected + ") ${expected} but got (" + typeof actual + ") ${actual}",
- {expected:expected, actual:actual});
- return;
- }
- assert(same_value(actual, expected), "assert_equals", description,
- "expected ${expected} but got ${actual}",
- {expected:expected, actual:actual});
- };
- expose(assert_equals, "assert_equals");
-
- function assert_not_equals(actual, expected, description)
- {
- /*
- * Test if two primitives are unequal or two objects
- * are different objects
- */
- assert(!same_value(actual, expected), "assert_not_equals", description,
- "got disallowed value ${actual}",
- {actual:actual});
- };
- expose(assert_not_equals, "assert_not_equals");
-
- function assert_in_array(actual, expected, description)
- {
- assert(expected.indexOf(actual) != -1, "assert_in_array", description,
- "value ${actual} not in array ${expected}",
- {actual:actual, expected:expected});
- }
- expose(assert_in_array, "assert_in_array");
-
- function assert_object_equals(actual, expected, description)
- {
- //This needs to be improved a great deal
- function check_equal(actual, expected, stack)
- {
- stack.push(actual);
-
- var p;
- for (p in actual)
- {
- assert(expected.hasOwnProperty(p), "assert_object_equals", description,
- "unexpected property ${p}", {p:p});
-
- if (typeof actual[p] === "object" && actual[p] !== null)
- {
- if (stack.indexOf(actual[p]) === -1)
- {
- check_equal(actual[p], expected[p], stack);
- }
- }
- else
- {
- assert(same_value(actual[p], expected[p]), "assert_object_equals", description,
- "property ${p} expected ${expected} got ${actual}",
- {p:p, expected:expected, actual:actual});
- }
- }
- for (p in expected)
- {
- assert(actual.hasOwnProperty(p),
- "assert_object_equals", description,
- "expected property ${p} missing", {p:p});
- }
- stack.pop();
- }
- check_equal(actual, expected, []);
- };
- expose(assert_object_equals, "assert_object_equals");
-
- function assert_array_equals(actual, expected, description)
- {
- assert(actual.length === expected.length,
- "assert_array_equals", description,
- "lengths differ, expected ${expected} got ${actual}",
- {expected:expected.length, actual:actual.length});
-
- for (var i=0; i < actual.length; i++)
- {
- assert(actual.hasOwnProperty(i) === expected.hasOwnProperty(i),
- "assert_array_equals", description,
- "property ${i}, property expected to be $expected but was $actual",
- {i:i, expected:expected.hasOwnProperty(i) ? "present" : "missing",
- actual:actual.hasOwnProperty(i) ? "present" : "missing"});
- assert(same_value(expected[i], actual[i]),
- "assert_array_equals", description,
- "property ${i}, expected ${expected} but got ${actual}",
- {i:i, expected:expected[i], actual:actual[i]});
- }
- }
- expose(assert_array_equals, "assert_array_equals");
-
- function assert_approx_equals(actual, expected, epsilon, description)
- {
- /*
- * Test if two primitive numbers are equal withing +/- epsilon
- */
- assert(typeof actual === "number",
- "assert_approx_equals", description,
- "expected a number but got a ${type_actual}",
- {type_actual:typeof actual});
-
- assert(Math.abs(actual - expected) <= epsilon,
- "assert_approx_equals", description,
- "expected ${expected} +/- ${epsilon} but got ${actual}",
- {expected:expected, actual:actual, epsilon:epsilon});
- };
- expose(assert_approx_equals, "assert_approx_equals");
-
- function assert_less_than(actual, expected, description)
- {
- /*
- * Test if a primitive number is less than another
- */
- assert(typeof actual === "number",
- "assert_less_than", description,
- "expected a number but got a ${type_actual}",
- {type_actual:typeof actual});
-
- assert(actual < expected,
- "assert_less_than", description,
- "expected a number less than ${expected} but got ${actual}",
- {expected:expected, actual:actual});
- };
- expose(assert_less_than, "assert_less_than");
-
- function assert_greater_than(actual, expected, description)
- {
- /*
- * Test if a primitive number is greater than another
- */
- assert(typeof actual === "number",
- "assert_greater_than", description,
- "expected a number but got a ${type_actual}",
- {type_actual:typeof actual});
-
- assert(actual > expected,
- "assert_greater_than", description,
- "expected a number greater than ${expected} but got ${actual}",
- {expected:expected, actual:actual});
- };
- expose(assert_greater_than, "assert_greater_than");
-
- function assert_less_than_equal(actual, expected, description)
- {
- /*
- * Test if a primitive number is less than or equal to another
- */
- assert(typeof actual === "number",
- "assert_less_than_equal", description,
- "expected a number but got a ${type_actual}",
- {type_actual:typeof actual});
-
- assert(actual <= expected,
- "assert_less_than", description,
- "expected a number less than or equal to ${expected} but got ${actual}",
- {expected:expected, actual:actual});
- };
- expose(assert_less_than_equal, "assert_less_than_equal");
-
- function assert_greater_than_equal(actual, expected, description)
- {
- /*
- * Test if a primitive number is greater than or equal to another
- */
- assert(typeof actual === "number",
- "assert_greater_than_equal", description,
- "expected a number but got a ${type_actual}",
- {type_actual:typeof actual});
-
- assert(actual >= expected,
- "assert_greater_than_equal", description,
- "expected a number greater than or equal to ${expected} but got ${actual}",
- {expected:expected, actual:actual});
- };
- expose(assert_greater_than_equal, "assert_greater_than_equal");
-
- function assert_regexp_match(actual, expected, description) {
- /*
- * Test if a string (actual) matches a regexp (expected)
- */
- assert(expected.test(actual),
- "assert_regexp_match", description,
- "expected ${expected} but got ${actual}",
- {expected:expected, actual:actual});
- }
- expose(assert_regexp_match, "assert_regexp_match");
-
- function assert_class_string(object, class_string, description) {
- assert_equals({}.toString.call(object), "[object " + class_string + "]",
- description);
- }
- expose(assert_class_string, "assert_class_string");
-
-
- function _assert_own_property(name) {
- return function(object, property_name, description)
- {
- assert(object.hasOwnProperty(property_name),
- name, description,
- "expected property ${p} missing", {p:property_name});
- };
- }
- expose(_assert_own_property("assert_exists"), "assert_exists");
- expose(_assert_own_property("assert_own_property"), "assert_own_property");
-
- function assert_not_exists(object, property_name, description)
- {
- assert(!object.hasOwnProperty(property_name),
- "assert_not_exists", description,
- "unexpected property ${p} found", {p:property_name});
- };
- expose(assert_not_exists, "assert_not_exists");
-
- function _assert_inherits(name) {
- return function (object, property_name, description)
- {
- assert(typeof object === "object",
- name, description,
- "provided value is not an object");
-
- assert("hasOwnProperty" in object,
- name, description,
- "provided value is an object but has no hasOwnProperty method");
-
- assert(!object.hasOwnProperty(property_name),
- name, description,
- "property ${p} found on object expected in prototype chain",
- {p:property_name});
-
- assert(property_name in object,
- name, description,
- "property ${p} not found in prototype chain",
- {p:property_name});
- };
- }
- expose(_assert_inherits("assert_inherits"), "assert_inherits");
- expose(_assert_inherits("assert_idl_attribute"), "assert_idl_attribute");
-
- function assert_readonly(object, property_name, description)
- {
- var initial_value = object[property_name];
- try {
- //Note that this can have side effects in the case where
- //the property has PutForwards
- object[property_name] = initial_value + "a"; //XXX use some other value here?
- assert(same_value(object[property_name], initial_value),
- "assert_readonly", description,
- "changing property ${p} succeeded",
- {p:property_name});
- }
- finally
- {
- object[property_name] = initial_value;
- }
- };
- expose(assert_readonly, "assert_readonly");
-
- function assert_throws(code, func, description)
- {
- try
- {
- func.call(this);
- assert(false, "assert_throws", description,
- "${func} did not throw", {func:func});
- }
- catch(e)
- {
- if (e instanceof AssertionError) {
- throw(e);
- }
- if (code === null)
- {
- return;
- }
- if (typeof code === "object")
- {
- assert(typeof e == "object" && "name" in e && e.name == code.name,
- "assert_throws", description,
- "${func} threw ${actual} (${actual_name}) expected ${expected} (${expected_name})",
- {func:func, actual:e, actual_name:e.name,
- expected:code,
- expected_name:code.name});
- return;
- }
-
- var code_name_map = {
- INDEX_SIZE_ERR: 'IndexSizeError',
- HIERARCHY_REQUEST_ERR: 'HierarchyRequestError',
- WRONG_DOCUMENT_ERR: 'WrongDocumentError',
- INVALID_CHARACTER_ERR: 'InvalidCharacterError',
- NO_MODIFICATION_ALLOWED_ERR: 'NoModificationAllowedError',
- NOT_FOUND_ERR: 'NotFoundError',
- NOT_SUPPORTED_ERR: 'NotSupportedError',
- INVALID_STATE_ERR: 'InvalidStateError',
- SYNTAX_ERR: 'SyntaxError',
- INVALID_MODIFICATION_ERR: 'InvalidModificationError',
- NAMESPACE_ERR: 'NamespaceError',
- INVALID_ACCESS_ERR: 'InvalidAccessError',
- TYPE_MISMATCH_ERR: 'TypeMismatchError',
- SECURITY_ERR: 'SecurityError',
- NETWORK_ERR: 'NetworkError',
- ABORT_ERR: 'AbortError',
- URL_MISMATCH_ERR: 'URLMismatchError',
- QUOTA_EXCEEDED_ERR: 'QuotaExceededError',
- TIMEOUT_ERR: 'TimeoutError',
- INVALID_NODE_TYPE_ERR: 'InvalidNodeTypeError',
- DATA_CLONE_ERR: 'DataCloneError'
- };
-
- var name = code in code_name_map ? code_name_map[code] : code;
-
- var name_code_map = {
- IndexSizeError: 1,
- HierarchyRequestError: 3,
- WrongDocumentError: 4,
- InvalidCharacterError: 5,
- NoModificationAllowedError: 7,
- NotFoundError: 8,
- NotSupportedError: 9,
- InvalidStateError: 11,
- SyntaxError: 12,
- InvalidModificationError: 13,
- NamespaceError: 14,
- InvalidAccessError: 15,
- TypeMismatchError: 17,
- SecurityError: 18,
- NetworkError: 19,
- AbortError: 20,
- URLMismatchError: 21,
- QuotaExceededError: 22,
- TimeoutError: 23,
- InvalidNodeTypeError: 24,
- DataCloneError: 25,
-
- UnknownError: 0,
- ConstraintError: 0,
- DataError: 0,
- TransactionInactiveError: 0,
- ReadOnlyError: 0,
- VersionError: 0
- };
-
- if (!(name in name_code_map))
- {
- throw new AssertionError('Test bug: unrecognized DOMException code "' + code + '" passed to assert_throws()');
- }
-
- var required_props = { code: name_code_map[name] };
-
- if (required_props.code === 0
- || ("name" in e && e.name !== e.name.toUpperCase() && e.name !== "DOMException"))
- {
- // New style exception: also test the name property.
- required_props.name = name;
- }
-
- //We'd like to test that e instanceof the appropriate interface,
- //but we can't, because we don't know what window it was created
- //in. It might be an instanceof the appropriate interface on some
- //unknown other window. TODO: Work around this somehow?
-
- assert(typeof e == "object",
- "assert_throws", description,
- "${func} threw ${e} with type ${type}, not an object",
- {func:func, e:e, type:typeof e});
-
- for (var prop in required_props)
- {
- assert(typeof e == "object" && prop in e && e[prop] == required_props[prop],
- "assert_throws", description,
- "${func} threw ${e} that is not a DOMException " + code + ": property ${prop} is equal to ${actual}, expected ${expected}",
- {func:func, e:e, prop:prop, actual:e[prop], expected:required_props[prop]});
- }
- }
- }
- expose(assert_throws, "assert_throws");
-
- function assert_unreached(description) {
- assert(false, "assert_unreached", description,
- "Reached unreachable code");
- }
- expose(assert_unreached, "assert_unreached");
-
- function assert_any(assert_func, actual, expected_array)
- {
- var args = [].slice.call(arguments, 3)
- var errors = []
- var passed = false;
- forEach(expected_array,
- function(expected)
- {
- try {
- assert_func.apply(this, [actual, expected].concat(args))
- passed = true;
- } catch(e) {
- errors.push(e.message);
- }
- });
- if (!passed) {
- throw new AssertionError(errors.join("\n\n"));
- }
- }
- expose(assert_any, "assert_any");
-
- function Test(name, properties)
- {
- this.name = name;
- this.status = this.NOTRUN;
- this.timeout_id = null;
- this.is_done = false;
-
- this.properties = properties;
- this.timeout_length = properties.timeout ? properties.timeout : settings.test_timeout;
-
- this.message = null;
-
- var this_obj = this;
- this.steps = [];
-
- tests.push(this);
- }
-
- Test.statuses = {
- PASS:0,
- FAIL:1,
- TIMEOUT:2,
- NOTRUN:3
- };
-
- Test.prototype = merge({}, Test.statuses);
-
- Test.prototype.structured_clone = function()
- {
- if(!this._structured_clone)
- {
- var msg = this.message;
- msg = msg ? String(msg) : msg;
- this._structured_clone = merge({
- name:String(this.name),
- status:this.status,
- message:msg
- }, Test.statuses);
- }
- return this._structured_clone;
- };
-
- Test.prototype.step = function(func, this_obj)
- {
- //In case the test has already failed
- if (this.status !== this.NOTRUN)
- {
- return;
- }
-
- tests.started = true;
-
- if (this.timeout_id === null) {
- this.set_timeout();
- }
-
- this.steps.push(func);
-
- if (arguments.length === 1)
- {
- this_obj = this;
- }
-
- try
- {
- return func.apply(this_obj, Array.prototype.slice.call(arguments, 2));
- }
- catch(e)
- {
- //This can happen if something called synchronously invoked another
- //step
- if (this.status !== this.NOTRUN)
- {
- return;
- }
- this.status = this.FAIL;
- this.message = (typeof e === "object" && e !== null) ? e.message : e;
- if (typeof e.stack != "undefined" && typeof e.message == "string") {
- //Try to make it more informative for some exceptions, at least
- //in Gecko and WebKit. This results in a stack dump instead of
- //just errors like "Cannot read property 'parentNode' of null"
- //or "root is null". Makes it a lot longer, of course.
- this.message += "(stack: " + e.stack + ")";
- }
- this.done();
- if (debug && e.constructor !== AssertionError) {
- throw e;
- }
- }
- };
-
- Test.prototype.step_func = function(func, this_obj)
- {
- var test_this = this;
-
- if (arguments.length === 1)
- {
- this_obj = test_this;
- }
-
- return function()
- {
- test_this.step.apply(test_this, [func, this_obj].concat(
- Array.prototype.slice.call(arguments)));
- };
- };
-
- Test.prototype.step_func_done = function(func, this_obj)
- {
- var test_this = this;
-
- if (arguments.length === 1)
- {
- this_obj = test_this;
- }
-
- return function()
- {
- test_this.step.apply(test_this, [func, this_obj].concat(
- Array.prototype.slice.call(arguments)));
- test_this.done();
- };
- };
-
- Test.prototype.set_timeout = function()
- {
- var this_obj = this;
- this.timeout_id = setTimeout(function()
- {
- this_obj.timeout();
- }, this.timeout_length);
- };
-
- Test.prototype.timeout = function()
- {
- this.status = this.TIMEOUT;
- this.timeout_id = null;
- this.message = "Test timed out";
- this.done();
- };
-
- Test.prototype.done = function()
- {
- if (this.is_done) {
- return;
- }
- clearTimeout(this.timeout_id);
- if (this.status === this.NOTRUN)
- {
- this.status = this.PASS;
- }
- this.is_done = true;
- tests.result(this);
- };
-
-
- /*
- * Harness
- */
-
- function TestsStatus()
- {
- this.status = null;
- this.message = null;
- }
-
- TestsStatus.statuses = {
- OK:0,
- ERROR:1,
- TIMEOUT:2
- };
-
- TestsStatus.prototype = merge({}, TestsStatus.statuses);
-
- TestsStatus.prototype.structured_clone = function()
- {
- if(!this._structured_clone)
- {
- var msg = this.message;
- msg = msg ? String(msg) : msg;
- this._structured_clone = merge({
- status:this.status,
- message:msg
- }, TestsStatus.statuses);
- }
- return this._structured_clone;
- };
-
- function Tests()
- {
- this.tests = [];
- this.num_pending = 0;
-
- this.phases = {
- INITIAL:0,
- SETUP:1,
- HAVE_TESTS:2,
- HAVE_RESULTS:3,
- COMPLETE:4
- };
- this.phase = this.phases.INITIAL;
-
- this.properties = {};
-
- //All tests can't be done until the load event fires
- this.all_loaded = false;
- this.wait_for_finish = false;
- this.processing_callbacks = false;
-
- this.timeout_length = settings.timeout;
- this.timeout_id = null;
-
- this.start_callbacks = [];
- this.test_done_callbacks = [];
- this.all_done_callbacks = [];
-
- this.status = new TestsStatus();
-
- var this_obj = this;
-
- on_event(window, "load",
- function()
- {
- this_obj.all_loaded = true;
- if (this_obj.all_done())
- {
- this_obj.complete();
- }
- });
-
- this.set_timeout();
- }
-
- Tests.prototype.setup = function(func, properties)
- {
- if (this.phase >= this.phases.HAVE_RESULTS)
- {
- return;
- }
- if (this.phase < this.phases.SETUP)
- {
- this.phase = this.phases.SETUP;
- }
-
- for (var p in properties)
- {
- if (properties.hasOwnProperty(p))
- {
- this.properties[p] = properties[p];
- }
- }
-
- if (properties.timeout)
- {
- this.timeout_length = properties.timeout;
- }
- if (properties.explicit_done)
- {
- this.wait_for_finish = true;
- }
- if (properties.explicit_timeout) {
- this.timeout_length = null;
- }
-
- if (func)
- {
- try
- {
- func();
- } catch(e)
- {
- this.status.status = this.status.ERROR;
- this.status.message = e;
- };
- }
- this.set_timeout();
- };
-
- Tests.prototype.set_timeout = function()
- {
- var this_obj = this;
- clearTimeout(this.timeout_id);
- if (this.timeout_length !== null)
- {
- this.timeout_id = setTimeout(function() {
- this_obj.timeout();
- }, this.timeout_length);
- }
- };
-
- Tests.prototype.timeout = function() {
- this.status.status = this.status.TIMEOUT;
- this.complete();
- };
-
- Tests.prototype.end_wait = function()
- {
- this.wait_for_finish = false;
- if (this.all_done()) {
- this.complete();
- }
- };
-
- Tests.prototype.push = function(test)
- {
- if (this.phase < this.phases.HAVE_TESTS) {
- this.start();
- }
- this.num_pending++;
- this.tests.push(test);
- };
-
- Tests.prototype.all_done = function() {
- return (this.all_loaded && this.num_pending === 0 &&
- !this.wait_for_finish && !this.processing_callbacks);
- };
-
- Tests.prototype.start = function() {
- this.phase = this.phases.HAVE_TESTS;
- this.notify_start();
- };
-
- Tests.prototype.notify_start = function() {
- var this_obj = this;
- forEach (this.start_callbacks,
- function(callback)
- {
- callback(this_obj.properties);
- });
- forEach_windows(
- function(w, is_same_origin)
- {
- if(is_same_origin && w.start_callback)
- {
- try
- {
- w.start_callback(this_obj.properties);
- }
- catch(e)
- {
- if (debug)
- {
- throw(e);
- }
- }
- }
- if (supports_post_message(w) && w !== self)
- {
- w.postMessage({
- type: "start",
- properties: this_obj.properties
- }, "*");
- }
- });
- };
-
- Tests.prototype.result = function(test)
- {
- if (this.phase > this.phases.HAVE_RESULTS)
- {
- return;
- }
- this.phase = this.phases.HAVE_RESULTS;
- this.num_pending--;
- this.notify_result(test);
- };
-
- Tests.prototype.notify_result = function(test) {
- var this_obj = this;
- this.processing_callbacks = true;
- forEach(this.test_done_callbacks,
- function(callback)
- {
- callback(test, this_obj);
- });
-
- forEach_windows(
- function(w, is_same_origin)
- {
- if(is_same_origin && w.result_callback)
- {
- try
- {
- w.result_callback(test);
- }
- catch(e)
- {
- if(debug) {
- throw e;
- }
- }
- }
- if (supports_post_message(w) && w !== self)
- {
- w.postMessage({
- type: "result",
- test: test.structured_clone()
- }, "*");
- }
- });
- this.processing_callbacks = false;
- if (this_obj.all_done())
- {
- this_obj.complete();
- }
- };
-
- Tests.prototype.complete = function() {
- if (this.phase === this.phases.COMPLETE) {
- return;
- }
- this.phase = this.phases.COMPLETE;
- var this_obj = this;
- this.tests.forEach(
- function(x)
- {
- if(x.status === x.NOTRUN)
- {
- this_obj.notify_result(x);
- }
- }
- );
- this.notify_complete();
- };
-
- Tests.prototype.notify_complete = function()
- {
- clearTimeout(this.timeout_id);
- var this_obj = this;
- var tests = map(this_obj.tests,
- function(test)
- {
- return test.structured_clone();
- });
- if (this.status.status === null)
- {
- this.status.status = this.status.OK;
- }
-
- forEach (this.all_done_callbacks,
- function(callback)
- {
- callback(this_obj.tests, this_obj.status);
- });
-
- forEach_windows(
- function(w, is_same_origin)
- {
- if(is_same_origin && w.completion_callback)
- {
- try
- {
- w.completion_callback(this_obj.tests, this_obj.status);
- }
- catch(e)
- {
- if (debug)
- {
- throw e;
- }
- }
- }
- if (supports_post_message(w) && w !== self)
- {
- w.postMessage({
- type: "complete",
- tests: tests,
- status: this_obj.status.structured_clone()
- }, "*");
- }
- });
- };
-
- var tests = new Tests();
-
- function timeout() {
- if (tests.timeout_length === null)
- {
- tests.timeout();
- }
- }
- expose(timeout, 'timeout');
-
- function add_start_callback(callback) {
- tests.start_callbacks.push(callback);
- }
-
- function add_result_callback(callback)
- {
- tests.test_done_callbacks.push(callback);
- }
-
- function add_completion_callback(callback)
- {
- tests.all_done_callbacks.push(callback);
- }
-
- expose(add_start_callback, 'add_start_callback');
- expose(add_result_callback, 'add_result_callback');
- expose(add_completion_callback, 'add_completion_callback');
-
- /*
- * Output listener
- */
-
- function Output() {
- this.output_document = document;
- this.output_node = null;
- this.done_count = 0;
- this.enabled = settings.output;
- this.phase = this.INITIAL;
- }
-
- Output.prototype.INITIAL = 0;
- Output.prototype.STARTED = 1;
- Output.prototype.HAVE_RESULTS = 2;
- Output.prototype.COMPLETE = 3;
-
- Output.prototype.setup = function(properties) {
- if (this.phase > this.INITIAL) {
- return;
- }
-
- //If output is disabled in testharnessreport.js the test shouldn't be
- //able to override that
- this.enabled = this.enabled && (properties.hasOwnProperty("output") ?
- properties.output : settings.output);
- };
-
- Output.prototype.init = function(properties)
- {
- if (this.phase >= this.STARTED) {
- return;
- }
- if (properties.output_document) {
- this.output_document = properties.output_document;
- } else {
- this.output_document = document;
- }
- this.phase = this.STARTED;
- };
-
- Output.prototype.resolve_log = function()
- {
- var output_document;
- if (typeof this.output_document === "function")
- {
- output_document = this.output_document.apply(undefined);
- } else
- {
- output_document = this.output_document;
- }
- if (!output_document)
- {
- return;
- }
- var node = output_document.getElementById("log");
- if (node)
- {
- this.output_document = output_document;
- this.output_node = node;
- }
- };
-
- Output.prototype.show_status = function(test)
- {
- if (this.phase < this.STARTED)
- {
- this.init();
- }
- if (!this.enabled)
- {
- return;
- }
- if (this.phase < this.HAVE_RESULTS)
- {
- this.resolve_log();
- this.phase = this.HAVE_RESULTS;
- }
- this.done_count++;
- if (this.output_node)
- {
- if (this.done_count < 100
- || (this.done_count < 1000 && this.done_count % 100 == 0)
- || this.done_count % 1000 == 0) {
- this.output_node.textContent = "Running, "
- + this.done_count + " complete, "
- + tests.num_pending + " remain";
- }
- }
- };
-
- Output.prototype.show_results = function (tests, harness_status)
- {
- if (this.phase >= this.COMPLETE) {
- return;
- }
- if (!this.enabled)
- {
- return;
- }
- if (!this.output_node) {
- this.resolve_log();
- }
- this.phase = this.COMPLETE;
-
- var log = this.output_node;
- if (!log)
- {
- return;
- }
- var output_document = this.output_document;
-
- while (log.lastChild)
- {
- log.removeChild(log.lastChild);
- }
-
- if (script_prefix != null) {
- var stylesheet = output_document.createElementNS(xhtml_ns, "link");
- stylesheet.setAttribute("rel", "stylesheet");
- stylesheet.setAttribute("href", script_prefix + "testharness.css");
- var heads = output_document.getElementsByTagName("head");
- if (heads.length) {
- heads[0].appendChild(stylesheet);
- }
- }
-
- var status_text = {};
- status_text[Test.prototype.PASS] = "Pass";
- status_text[Test.prototype.FAIL] = "Fail";
- status_text[Test.prototype.TIMEOUT] = "Timeout";
- status_text[Test.prototype.NOTRUN] = "Not Run";
-
- var status_number = {};
- forEach(tests, function(test) {
- var status = status_text[test.status];
- if (status_number.hasOwnProperty(status))
- {
- status_number[status] += 1;
- } else {
- status_number[status] = 1;
- }
- });
-
- function status_class(status)
- {
- return status.replace(/\s/g, '').toLowerCase();
- }
-
- var summary_template = ["section", {"id":"summary"},
- ["h2", {}, "Summary"],
- ["p", {}, "Found ${num_tests} tests"],
- function(vars) {
- var rv = [["div", {}]];
- var i=0;
- while (status_text.hasOwnProperty(i)) {
- if (status_number.hasOwnProperty(status_text[i])) {
- var status = status_text[i];
- rv[0].push(["div", {"class":status_class(status)},
- ["label", {},
- ["input", {type:"checkbox", checked:"checked"}],
- status_number[status] + " " + status]]);
- }
- i++;
- }
- return rv;
- }];
-
- log.appendChild(render(summary_template, {num_tests:tests.length}, output_document));
-
- forEach(output_document.querySelectorAll("section#summary label"),
- function(element)
- {
- on_event(element, "click",
- function(e)
- {
- if (output_document.getElementById("results") === null)
- {
- e.preventDefault();
- return;
- }
- var result_class = element.parentNode.getAttribute("class");
- var style_element = output_document.querySelector("style#hide-" + result_class);
- var input_element = element.querySelector("input");
- if (!style_element && !input_element.checked) {
- style_element = output_document.createElementNS(xhtml_ns, "style");
- style_element.id = "hide-" + result_class;
- style_element.textContent = "table#results > tbody > tr."+result_class+"{display:none}";
- output_document.body.appendChild(style_element);
- } else if (style_element && input_element.checked) {
- style_element.parentNode.removeChild(style_element);
- }
- });
- });
-
- // This use of innerHTML plus manual escaping is not recommended in
- // general, but is necessary here for performance. Using textContent
- // on each individual <td> adds tens of seconds of execution time for
- // large test suites (tens of thousands of tests).
- function escape_html(s)
- {
- return s.replace(/\&/g, "&")
- .replace(/</g, "<")
- .replace(/"/g, """)
- .replace(/'/g, "'");
- }
-
- function has_assertions()
- {
- for (var i = 0; i < tests.length; i++) {
- if (tests[i].properties.hasOwnProperty("assert")) {
- return true;
- }
- }
- return false;
- }
-
- function get_assertion(test)
- {
- if (test.properties.hasOwnProperty("assert")) {
- if (Array.isArray(test.properties.assert)) {
- return test.properties.assert.join(' ');
- }
- return test.properties.assert;
- }
- return '';
- }
-
- log.appendChild(document.createElementNS(xhtml_ns, "section"));
- var assertions = has_assertions();
- var html = "<h2>Details</h2><table id='results' " + (assertions ? "class='assertions'" : "" ) + ">"
- + "<thead><tr><th>Result</th><th>Test Name</th>"
- + (assertions ? "<th>Assertion</th>" : "")
- + "<th>Message</th></tr></thead>"
- + "<tbody>";
- for (var i = 0; i < tests.length; i++) {
- html += '<tr class="'
- + escape_html(status_class(status_text[tests[i].status]))
- + '"><td>'
- + escape_html(status_text[tests[i].status])
- + "</td><td>"
- + escape_html(tests[i].name)
- + "</td><td>"
- + (assertions ? escape_html(get_assertion(tests[i])) + "</td><td>" : "")
- + escape_html(tests[i].message ? tests[i].message : " ")
- + "</td></tr>";
- }
- html += "</tbody></table>";
- try {
- log.lastChild.innerHTML = html;
- } catch (e) {
- log.appendChild(document.createElementNS(xhtml_ns, "p"))
- .textContent = "Setting innerHTML for the log threw an exception.";
- log.appendChild(document.createElementNS(xhtml_ns, "pre"))
- .textContent = html;
- }
- };
-
- var output = new Output();
- add_start_callback(function (properties) {output.init(properties);});
- add_result_callback(function (test) {output.show_status(tests);});
- add_completion_callback(function (tests, harness_status) {output.show_results(tests, harness_status);});
-
- /*
- * Template code
- *
- * A template is just a javascript structure. An element is represented as:
- *
- * [tag_name, {attr_name:attr_value}, child1, child2]
- *
- * the children can either be strings (which act like text nodes), other templates or
- * functions (see below)
- *
- * A text node is represented as
- *
- * ["{text}", value]
- *
- * String values have a simple substitution syntax; ${foo} represents a variable foo.
- *
- * It is possible to embed logic in templates by using a function in a place where a
- * node would usually go. The function must either return part of a template or null.
- *
- * In cases where a set of nodes are required as output rather than a single node
- * with children it is possible to just use a list
- * [node1, node2, node3]
- *
- * Usage:
- *
- * render(template, substitutions) - take a template and an object mapping
- * variable names to parameters and return either a DOM node or a list of DOM nodes
- *
- * substitute(template, substitutions) - take a template and variable mapping object,
- * make the variable substitutions and return the substituted template
- *
- */
-
- function is_single_node(template)
- {
- return typeof template[0] === "string";
- }
-
- function substitute(template, substitutions)
- {
- if (typeof template === "function") {
- var replacement = template(substitutions);
- if (replacement)
- {
- var rv = substitute(replacement, substitutions);
- return rv;
- }
- else
- {
- return null;
- }
- }
- else if (is_single_node(template))
- {
- return substitute_single(template, substitutions);
- }
- else
- {
- return filter(map(template, function(x) {
- return substitute(x, substitutions);
- }), function(x) {return x !== null;});
- }
- }
-
- function substitute_single(template, substitutions)
- {
- var substitution_re = /\${([^ }]*)}/g;
-
- function do_substitution(input) {
- var components = input.split(substitution_re);
- var rv = [];
- for (var i=0; i<components.length; i+=2)
- {
- rv.push(components[i]);
- if (components[i+1])
- {
- rv.push(String(substitutions[components[i+1]]));
- }
- }
- return rv;
- }
-
- var rv = [];
- rv.push(do_substitution(String(template[0])).join(""));
-
- if (template[0] === "{text}") {
- substitute_children(template.slice(1), rv);
- } else {
- substitute_attrs(template[1], rv);
- substitute_children(template.slice(2), rv);
- }
-
- function substitute_attrs(attrs, rv)
- {
- rv[1] = {};
- for (var name in template[1])
- {
- if (attrs.hasOwnProperty(name))
- {
- var new_name = do_substitution(name).join("");
- var new_value = do_substitution(attrs[name]).join("");
- rv[1][new_name] = new_value;
- };
- }
- }
-
- function substitute_children(children, rv)
- {
- for (var i=0; i<children.length; i++)
- {
- if (children[i] instanceof Object) {
- var replacement = substitute(children[i], substitutions);
- if (replacement !== null)
- {
- if (is_single_node(replacement))
- {
- rv.push(replacement);
- }
- else
- {
- extend(rv, replacement);
- }
- }
- }
- else
- {
- extend(rv, do_substitution(String(children[i])));
- }
- }
- return rv;
- }
-
- return rv;
- }
-
- function make_dom_single(template, doc)
- {
- var output_document = doc || document;
- if (template[0] === "{text}")
- {
- var element = output_document.createTextNode("");
- for (var i=1; i<template.length; i++)
- {
- element.data += template[i];
- }
- }
- else
- {
- var element = output_document.createElementNS(xhtml_ns, template[0]);
- for (var name in template[1]) {
- if (template[1].hasOwnProperty(name))
- {
- element.setAttribute(name, template[1][name]);
- }
- }
- for (var i=2; i<template.length; i++)
- {
- if (template[i] instanceof Object)
- {
- var sub_element = make_dom(template[i]);
- element.appendChild(sub_element);
- }
- else
- {
- var text_node = output_document.createTextNode(template[i]);
- element.appendChild(text_node);
- }
- }
- }
-
- return element;
- }
-
-
-
- function make_dom(template, substitutions, output_document)
- {
- if (is_single_node(template))
- {
- return make_dom_single(template, output_document);
- }
- else
- {
- return map(template, function(x) {
- return make_dom_single(x, output_document);
- });
- }
- }
-
- function render(template, substitutions, output_document)
- {
- return make_dom(substitute(template, substitutions), output_document);
- }
-
- /*
- * Utility funcions
- */
- function assert(expected_true, function_name, description, error, substitutions)
- {
- if (expected_true !== true)
- {
- throw new AssertionError(make_message(function_name, description,
- error, substitutions));
- }
- }
-
- function AssertionError(message)
- {
- this.message = message;
- }
-
- function make_message(function_name, description, error, substitutions)
- {
- for (var p in substitutions) {
- if (substitutions.hasOwnProperty(p)) {
- substitutions[p] = format_value(substitutions[p]);
- }
- }
- var node_form = substitute(["{text}", "${function_name}: ${description}" + error],
- merge({function_name:function_name,
- description:(description?description + " ":"")},
- substitutions));
- return node_form.slice(1).join("");
- }
-
- function filter(array, callable, thisObj) {
- var rv = [];
- for (var i=0; i<array.length; i++)
- {
- if (array.hasOwnProperty(i))
- {
- var pass = callable.call(thisObj, array[i], i, array);
- if (pass) {
- rv.push(array[i]);
- }
- }
- }
- return rv;
- }
-
- function map(array, callable, thisObj)
- {
- var rv = [];
- rv.length = array.length;
- for (var i=0; i<array.length; i++)
- {
- if (array.hasOwnProperty(i))
- {
- rv[i] = callable.call(thisObj, array[i], i, array);
- }
- }
- return rv;
- }
-
- function extend(array, items)
- {
- Array.prototype.push.apply(array, items);
- }
-
- function forEach (array, callback, thisObj)
- {
- for (var i=0; i<array.length; i++)
- {
- if (array.hasOwnProperty(i))
- {
- callback.call(thisObj, array[i], i, array);
- }
- }
- }
-
- function merge(a,b)
- {
- var rv = {};
- var p;
- for (p in a)
- {
- rv[p] = a[p];
- }
- for (p in b) {
- rv[p] = b[p];
- }
- return rv;
- }
-
- function expose(object, name)
- {
- var components = name.split(".");
- var target = window;
- for (var i=0; i<components.length - 1; i++)
- {
- if (!(components[i] in target))
- {
- target[components[i]] = {};
- }
- target = target[components[i]];
- }
- target[components[components.length - 1]] = object;
- }
-
- function forEach_windows(callback) {
- // Iterate of the the windows [self ... top, opener]. The callback is passed
- // two objects, the first one is the windows object itself, the second one
- // is a boolean indicating whether or not its on the same origin as the
- // current window.
- var cache = forEach_windows.result_cache;
- if (!cache) {
- cache = [[self, true]];
- var w = self;
- var i = 0;
- var so;
- var origins = location.ancestorOrigins;
- while (w != w.parent)
- {
- w = w.parent;
- // In WebKit, calls to parent windows' properties that aren't on the same
- // origin cause an error message to be displayed in the error console but
- // don't throw an exception. This is a deviation from the current HTML5
- // spec. See: https://bugs.webkit.org/show_bug.cgi?id=43504
- // The problem with WebKit's behavior is that it pollutes the error console
- // with error messages that can't be caught.
- //
- // This issue can be mitigated by relying on the (for now) proprietary
- // `location.ancestorOrigins` property which returns an ordered list of
- // the origins of enclosing windows. See:
- // http://trac.webkit.org/changeset/113945.
- if(origins) {
- so = (location.origin == origins[i]);
- }
- else
- {
- so = is_same_origin(w);
- }
- cache.push([w, so]);
- i++;
- }
- w = window.opener;
- if(w)
- {
- // window.opener isn't included in the `location.ancestorOrigins` prop.
- // We'll just have to deal with a simple check and an error msg on WebKit
- // browsers in this case.
- cache.push([w, is_same_origin(w)]);
- }
- forEach_windows.result_cache = cache;
- }
-
- forEach(cache,
- function(a)
- {
- callback.apply(null, a);
- });
- }
-
- function is_same_origin(w) {
- try {
- 'random_prop' in w;
- return true;
- } catch(e) {
- return false;
- }
- }
-
- function supports_post_message(w)
- {
- var supports;
- var type;
- // Given IE implements postMessage across nested iframes but not across
- // windows or tabs, you can't infer cross-origin communication from the presence
- // of postMessage on the current window object only.
- //
- // Touching the postMessage prop on a window can throw if the window is
- // not from the same origin AND post message is not supported in that
- // browser. So just doing an existence test here won't do, you also need
- // to wrap it in a try..cacth block.
- try
- {
- type = typeof w.postMessage;
- if (type === "function")
- {
- supports = true;
- }
- // IE8 supports postMessage, but implements it as a host object which
- // returns "object" as its `typeof`.
- else if (type === "object")
- {
- supports = true;
- }
- // This is the case where postMessage isn't supported AND accessing a
- // window property across origins does NOT throw (e.g. old Safari browser).
- else
- {
- supports = false;
- }
- }
- catch(e) {
- // This is the case where postMessage isn't supported AND accessing a
- // window property across origins throws (e.g. old Firefox browser).
- supports = false;
- }
- return supports;
- }
-})();
-
-// vim: set expandtab shiftwidth=4 tabstop=4:
+++ /dev/null
-/*
- * This file is intended for vendors to implement
- * code needed to integrate testharness.js tests with their own test systems.
- *
- * The default implementation extracts metadata from the tests and validates
- * it against the cached version that should be present in the test source
- * file. If the cache is not found or is out of sync, source code suitable for
- * caching the metadata is optionally generated.
- *
- * The cached metadata is present for extraction by test processing tools that
- * are unable to execute javascript.
- *
- * Metadata is attached to tests via the properties parameter in the test
- * constructor. See testharness.js for details.
- *
- * Typically test system integration will attach callbacks when each test has
- * run, using add_result_callback(callback(test)), or when the whole test file
- * has completed, using
- * add_completion_callback(callback(tests, harness_status)).
- *
- * For more documentation about the callback functions and the
- * parameters they are called with see testharness.js
- */
-
-
-
-var metadata_generator = {
-
- currentMetadata: {},
- cachedMetadata: false,
- metadataProperties: ['help', 'assert', 'author'],
-
- error: function(message) {
- var messageElement = document.createElement('p');
- messageElement.setAttribute('class', 'error');
- this.appendText(messageElement, message);
-
- var summary = document.getElementById('summary');
- if (summary) {
- summary.parentNode.insertBefore(messageElement, summary);
- }
- else {
- document.body.appendChild(messageElement);
- }
- },
-
- /**
- * Ensure property value has contact information
- */
- validateContact: function(test, propertyName) {
- var result = true;
- var value = test.properties[propertyName];
- var values = Array.isArray(value) ? value : [value];
- for (var index = 0; index < values.length; index++) {
- value = values[index];
- var re = /(\S+)(\s*)<(.*)>(.*)/;
- if (! re.test(value)) {
- re = /(\S+)(\s+)(http[s]?:\/\/)(.*)/
- if (! re.test(value)) {
- this.error('Metadata property "' + propertyName +
- '" for test: "' + test.name +
- '" must have name and contact information ' +
- '("name <email>" or "name http(s)://")');
- result = false;
- }
- }
- }
- return result;
- },
-
- /**
- * Extract metadata from test object
- */
- extractFromTest: function(test) {
- var testMetadata = {};
- // filter out metadata from other properties in test
- for (var metaIndex = 0; metaIndex < this.metadataProperties.length;
- metaIndex++) {
- var meta = this.metadataProperties[metaIndex];
- if (test.properties.hasOwnProperty(meta)) {
- if ('author' == meta) {
- this.validateContact(test, meta);
- }
- testMetadata[meta] = test.properties[meta];
- }
- }
- return testMetadata;
- },
-
- /**
- * Compare cached metadata to extracted metadata
- */
- validateCache: function() {
- for (var testName in this.currentMetadata) {
- if (! this.cachedMetadata.hasOwnProperty(testName)) {
- return false;
- }
- var testMetadata = this.currentMetadata[testName];
- var cachedTestMetadata = this.cachedMetadata[testName];
- delete this.cachedMetadata[testName];
-
- for (var metaIndex = 0; metaIndex < this.metadataProperties.length;
- metaIndex++) {
- var meta = this.metadataProperties[metaIndex];
- if (cachedTestMetadata.hasOwnProperty(meta) &&
- testMetadata.hasOwnProperty(meta)) {
- if (Array.isArray(cachedTestMetadata[meta])) {
- if (! Array.isArray(testMetadata[meta])) {
- return false;
- }
- if (cachedTestMetadata[meta].length ==
- testMetadata[meta].length) {
- for (var index = 0;
- index < cachedTestMetadata[meta].length;
- index++) {
- if (cachedTestMetadata[meta][index] !=
- testMetadata[meta][index]) {
- return false;
- }
- }
- }
- else {
- return false;
- }
- }
- else {
- if (Array.isArray(testMetadata[meta])) {
- return false;
- }
- if (cachedTestMetadata[meta] != testMetadata[meta]) {
- return false;
- }
- }
- }
- else if (cachedTestMetadata.hasOwnProperty(meta) ||
- testMetadata.hasOwnProperty(meta)) {
- return false;
- }
- }
- }
- for (var testName in this.cachedMetadata) {
- return false;
- }
- return true;
- },
-
- appendText: function(elemement, text) {
- elemement.appendChild(document.createTextNode(text));
- },
-
- jsonifyArray: function(arrayValue, indent) {
- var output = '[';
-
- if (1 == arrayValue.length) {
- output += JSON.stringify(arrayValue[0]);
- }
- else {
- for (var index = 0; index < arrayValue.length; index++) {
- if (0 < index) {
- output += ',\n ' + indent;
- }
- output += JSON.stringify(arrayValue[index]);
- }
- }
- output += ']';
- return output;
- },
-
- jsonifyObject: function(objectValue, indent) {
- var output = '{';
-
- var count = 0;
- for (var property in objectValue) {
- ++count;
- if (Array.isArray(objectValue[property]) ||
- ('object' == typeof(value))) {
- ++count;
- }
- }
- if (1 == count) {
- for (var property in objectValue) {
- output += ' "' + property + '": '
- + JSON.stringify(objectValue[property])
- + ' ';
- }
- }
- else {
- var first = true;
- for (var property in objectValue) {
- if (! first) {
- output += ',';
- }
- first = false;
- output += '\n ' + indent + '"' + property + '": ';
- var value = objectValue[property];
- if (Array.isArray(value)) {
- output += this.jsonifyArray(value, indent +
- ' '.substr(0, 5 + property.length));
- }
- else if ('object' == typeof(value)) {
- output += this.jsonifyObject(value, indent + ' ');
- }
- else {
- output += JSON.stringify(value);
- }
- }
- if (1 < output.length) {
- output += '\n' + indent;
- }
- }
- output += '}';
- return output;
- },
-
- /**
- * Generate javascript source code for captured metadata
- * Metadata is in pretty-printed JSON format
- */
- generateSource: function() {
- var source =
- '<script id="metadata_cache">/*\n' +
- this.jsonifyObject(this.currentMetadata, '') + '\n' +
- '*/</script>\n';
- return source;
- },
-
- /**
- * Add element containing metadata source code
- */
- addSourceElement: function(event) {
- var sourceWrapper = document.createElement('div');
- sourceWrapper.setAttribute('id', 'metadata_source');
-
- var instructions = document.createElement('p');
- if (this.cachedMetadata) {
- this.appendText(instructions,
- 'Replace the existing <script id="metadata_cache"> element ' +
- 'in the test\'s <head> with the following:');
- }
- else {
- this.appendText(instructions,
- 'Copy the following into the <head> element of the test ' +
- 'or the test\'s metadata sidecar file:');
- }
- sourceWrapper.appendChild(instructions);
-
- var sourceElement = document.createElement('pre');
- this.appendText(sourceElement, this.generateSource());
-
- sourceWrapper.appendChild(sourceElement);
-
- var messageElement = document.getElementById('metadata_issue');
- messageElement.parentNode.insertBefore(sourceWrapper,
- messageElement.nextSibling);
- messageElement.parentNode.removeChild(messageElement);
-
- (event.preventDefault) ? event.preventDefault() :
- event.returnValue = false;
- },
-
- /**
- * Extract the metadata cache from the cache element if present
- */
- getCachedMetadata: function() {
- var cacheElement = document.getElementById('metadata_cache');
-
- if (cacheElement) {
- var cacheText = cacheElement.firstChild.nodeValue;
- var openBrace = cacheText.indexOf('{');
- var closeBrace = cacheText.lastIndexOf('}');
- if ((-1 < openBrace) && (-1 < closeBrace)) {
- cacheText = cacheText.slice(openBrace, closeBrace + 1);
- try {
- this.cachedMetadata = JSON.parse(cacheText);
- }
- catch (exc) {
- this.cachedMetadata = 'Invalid JSON in Cached metadata. ';
- }
- }
- else {
- this.cachedMetadata = 'Metadata not found in cache element. ';
- }
- }
- },
-
- /**
- * Main entry point, extract metadata from tests, compare to cached version
- * if present.
- * If cache not present or differs from extrated metadata, generate an error
- */
- process: function(tests, harness_status) {
- for (var index = 0; index < tests.length; index++) {
- var test = tests[index];
- if (this.currentMetadata.hasOwnProperty(test.name)) {
- this.error('Duplicate test name: ' + test.name);
- }
- else {
- this.currentMetadata[test.name] = this.extractFromTest(test);
- }
- }
-
- this.getCachedMetadata();
-
- var message = null;
- var messageClass = 'warning';
- var showSource = false;
-
- if (0 == tests.length) {
- if (this.cachedMetadata) {
- message = 'Cached metadata present but no tests. ';
- }
- }
- else if (1 == tests.length) {
- if (this.cachedMetadata) {
- message = 'Single test files should not have cached metadata. ';
- }
- else {
- var testMetadata = this.currentMetadata[tests[0].name];
- var hasMetadata = false;
- for (var meta in testMetadata) {
- hasMetadata |= testMetadata.hasOwnProperty(meta);
- }
- if (hasMetadata) {
- message = 'Single tests should not have metadata. ' +
- 'Move metadata to <head>. ';
- }
- }
- }
- else {
- if (this.cachedMetadata) {
- messageClass = 'error';
- if ('string' == typeof(this.cachedMetadata)) {
- message = this.cachedMetadata;
- showSource = true;
- }
- else if (! this.validateCache()) {
- message = 'Cached metadata out of sync. ';
- showSource = true;
- }
- }
- }
-
- if (message) {
- var messageElement = document.createElement('p');
- messageElement.setAttribute('id', 'metadata_issue');
- messageElement.setAttribute('class', messageClass);
- this.appendText(messageElement, message);
-
- if (showSource) {
- var link = document.createElement('a');
- this.appendText(link, 'Click for source code.');
- link.setAttribute('href', '#');
- link.setAttribute('onclick',
- 'metadata_generator.addSourceElement(event)');
- messageElement.appendChild(link);
- }
-
- var summary = document.getElementById('summary');
- if (summary) {
- summary.parentNode.insertBefore(messageElement, summary);
- }
- else {
- var log = document.getElementById('log');
- if (log) {
- log.appendChild(messageElement);
- }
- }
- }
- },
-
- setup: function() {
- add_completion_callback(
- function (tests, harness_status) {
- metadata_generator.process(tests, harness_status)
- });
- }
-}
-
-metadata_generator.setup();
-// vim: set expandtab shiftwidth=4 tabstop=4:
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="html" version="1.0" encoding="UTF-8"
- indent="yes" />
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "tests.css";
- </STYLE>
-
- <body>
- <div id="testcasepage">
- <div id="title">
- <table>
- <tr>
- <td>
- <h1>Test Cases</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="suites">
- <table>
- <tr>
- <th>Test Suite</th>
- <th>Total</th>
- <th>Auto</th>
- <th>Manual</th>
- </tr>
- <tr>
- <td>
- Total
- </td>
- <td>
- <xsl:value-of select="count(test_definition/suite/set//testcase)" />
- </td>
- <td>
- <xsl:value-of
- select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])" />
- </td>
- <td>
- <xsl:value-of
- select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])" />
- </td>
- </tr>
- <xsl:for-each select="test_definition/suite">
- <tr>
- <td>
- <xsl:value-of select="@name" />
- </td>
- <td>
- <xsl:value-of select="count(set//testcase)" />
- </td>
- <td>
- <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])" />
- </td>
- <td>
- <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])" />
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </div>
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1>Detailed Test Cases</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="cases">
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name" />
- <p>
- Test Suite:
- <xsl:value-of select="@name" />
- </p>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Type</th>
- <th>Component</th>
- <th>Execution Type</th>
- <th>Description</th>
- <th>Specification</th>
- </tr>
- <xsl:for-each select=".//set">
- <xsl:sort select="@name" />
- <tr>
- <td colspan="7">
- Test Set:
- <xsl:value-of select="@name" />
- </td>
- </tr>
- <xsl:for-each select=".//testcase">
- <xsl:sort select="@id" />
- <tr>
- <td>
- <xsl:value-of select="@id" />
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
- <td>
- <xsl:value-of select="@type" />
- </td>
- <td>
- <xsl:value-of select="@component" />
- </td>
- <td>
- <xsl:value-of select="@execution_type" />
- </td>
- <td>
- <p>
- Pre_condition:
- <xsl:value-of select=".//description/pre_condition" />
- </p>
- <p>
- Post_condition:
- <xsl:value-of select=".//description/post_condition" />
- </p>
- <p>
- Test Script Entry:
- <xsl:value-of select=".//description/test_script_entry" />
- </p>
- <p>
- Steps:
- <p />
- <xsl:for-each select=".//description/steps/step">
- <xsl:sort select="@order" />
- Step
- <xsl:value-of select="@order" />
- :
- <xsl:value-of select="./step_desc" />
- ;
- <p />
- Expected Result:
- <xsl:value-of select="./expected" />
- <p />
- </xsl:for-each>
- </p>
- </td>
- <td>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word" select=".//spec" />
- </xsl:call-template>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- </div>
- </body>
- </html>
- </xsl:template>
- <xsl:template name="br-replace">
- <xsl:param name="word" />
- <xsl:variable name="cr">
- <xsl:text>
-</xsl:text>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="contains($word,$cr)">
- <xsl:value-of select="substring-before($word,$cr)" />
- <br />
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word" select="substring-after($word,$cr)" />
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$word" />
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
+++ /dev/null
-testcase_SCRIPTS = *
-testcasedir = $(prefix)/opt/{TESTSUITE_NAME}/testcase
-EXTRA_DIST = $(testcase_SCRIPTS)
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="html" version="1.0" encoding="UTF-8"
- indent="yes" />
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "tests.css";
- </STYLE>
-
- <body>
- <div id="testcasepage">
- <div id="title">
- <table>
- <tr>
- <td>
- <h1>Test Report</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="device">
- <table>
- <tr>
- <th colspan="2">Device Information</th>
- </tr>
- <tr>
- <td>Device Name</td>
- <td>
- <xsl:value-of select="test_definition/environment/@device_name" />
- </td>
- </tr>
- <tr>
- <td>Device Model</td>
- <td>
- <xsl:value-of select="test_definition/environment/@device_model" />
- </td>
- </tr>
- <tr>
- <td>OS Version</td>
- <td>
- <xsl:value-of select="test_definition/environment/@os_version" />
- </td>
- </tr>
- <tr>
- <td>Device ID</td>
- <td>
- <xsl:value-of select="test_definition/environment/@device_id" />
- </td>
- </tr>
- <tr>
- <td>Firmware Version</td>
- <td>
- <xsl:value-of select="test_definition/environment/@firmware_version" />
- </td>
- </tr>
- <tr>
- <td>Screen Size</td>
- <td>
- <xsl:value-of select="test_definition/environment/@screen_size" />
- </td>
- </tr>
- <tr>
- <td>Resolution</td>
- <td>
- <xsl:value-of select="test_definition/environment/@resolution" />
- </td>
- </tr>
- <tr>
- <td>Host Info</td>
- <td>
- <xsl:value-of select="test_definition/environment/@host" />
- </td>
- </tr>
- <tr>
- <td>Others</td>
- <td>
- <xsl:value-of select="test_definition/environment/other" />
- </td>
- </tr>
- </table>
- </div>
-
- <div id="summary">
- <table>
- <tr>
- <th colspan="2">Test Summary</th>
- </tr>
- <tr>
- <td>Test Plan Name</td>
- <td>
- <xsl:value-of select="test_definition/summary/@test_plan_name" />
- </td>
- </tr>
- <tr>
- <td>Tests Total</td>
- <td>
- <xsl:value-of select="count(test_definition//suite/set/testcase)" />
- </td>
- </tr>
- <tr>
- <td>Test Passed</td>
- <td>
- <xsl:value-of
- select="count(test_definition//suite/set/testcase[@result = 'PASS'])" />
- </td>
- </tr>
- <tr>
- <td>Test Failed</td>
- <td>
- <xsl:value-of
- select="count(test_definition//suite/set/testcase[@result = 'FAIL'])" />
- </td>
- </tr>
- <tr>
- <td>Test N/A</td>
- <td>
- <xsl:value-of
- select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
- </td>
- </tr>
- <tr>
- <td>Test Not Run</td>
- <td>
- <xsl:value-of
- select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
- </td>
- </tr>
- <tr>
- <td>Start time</td>
- <td>
- <xsl:value-of select="test_definition/summary/start_at" />
- </td>
- </tr>
- <tr>
- <td>End time</td>
- <td>
- <xsl:value-of select="test_definition/summary/end_at" />
- </td>
- </tr>
- </table>
- </div>
-
-
- <div id="suite_summary">
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1>Test Summary by Suite</h1>
- </td>
- </tr>
- </table>
- </div>
- <table>
- <tr>
- <th>Suite</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>N/A</th>
- <th>Not Run</th>
- <th>Total</th>
- </tr>
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name" />
- <tr>
- <td>
- <xsl:value-of select="@name" />
- </td>
- <td>
- <xsl:value-of select="count(set//testcase[@result = 'PASS'])" />
- </td>
- <td>
- <xsl:value-of select="count(set//testcase[@result = 'FAIL'])" />
- </td>
- <td>
- <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])" />
- </td>
- <td>
- <xsl:value-of
- select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])" />
- </td>
- <td>
- <xsl:value-of select="count(set//testcase)" />
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </div>
-
- <div id="cases">
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1 align="center">Detailed Test Results</h1>
- </td>
- </tr>
- </table>
- </div>
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name" />
- <p>
- Test Suite:
- <xsl:value-of select="@name" />
- </p>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <xsl:sort select="@name" />
- <tr>
- <td colspan="4">
- Test Set:
- <xsl:value-of select="@name" />
- </td>
- </tr>
- <xsl:for-each select=".//testcase">
- <xsl:sort select="@id" />
- <tr>
- <td>
- <xsl:value-of select="@id" />
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <xsl:choose>
- <xsl:when test="@result">
- <xsl:if test="@result = 'FAIL'">
- <td class="red_rate">
- <xsl:value-of select="@result" />
- </td>
- </xsl:if>
- <xsl:if test="@result = 'PASS'">
- <td class="green_rate">
- <xsl:value-of select="@result" />
- </td>
- </xsl:if>
- <xsl:if test="@result = 'BLOCK' ">
- <td>
- BLOCK
- </td>
- </xsl:if>
- </xsl:when>
- <xsl:otherwise>
- <td>
-
- </td>
- </xsl:otherwise>
- </xsl:choose>
- <td>
- <xsl:value-of select=".//result_info/stdout" />
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- </div>
- </body>
- </html>
- </xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
+++ /dev/null
-@charset "UTF-8";
-/* CSS Document */
-#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td
- {
- margin: 0;
- padding: 0;
- border: 0;
- font-weight: inherit;
- font-style: inherit;
- font-size: 0.96em;
- font-family: arial;
- vertical-align: baseline;
-}
-
-#testcasepage p {
- text-align: left;
-}
-
-#testcasepage table {
- border-collapse: separate;
- border-spacing: 0;
- margin-bottom: 1.4em;
- vertical-align: middle;
-}
-
-#testcasepage th,#testcasepage td {
- text-align: left;
- font-weight: normal;
- padding: 4px 10px 4px 5px;
- vertical-align: middle;
-}
-
-#cases table {
- width: 101%;
-}
-
-#title table {
- width: 101%;
-}
-
-#device table {
- width: 50%;
-}
-
-#summary table {
- width: 50%;
-}
-
-#testcasepage th {
- border-bottom: 1px solid #000;
- background-color: #AAAAAA;
- border-left: 1px solid #000;
- border-top: 1px solid #000;
- color: #000;
- font-weight: bold;
- vertical-align: bottom;
-}
-
-#testcasepage th:last-child, #testcasepage td:last-child {
- border-right: 1px solid #000;
-}
-
-#testcasepage td {
- border-left: 1px solid;
- font-weight: normal;
- border-bottom: 1px solid;
-}
-
-#testcasepage td.yellow_rate {
- background-color: #ffcc00;
-}
-
-#testcasepage td.green_rate {
- background-color: #33cc33;
-}
-
-#testcasepage td.dgreen_rate {
- background-color: #339933;
-}
-
-#testcasepage td.red_rate {
- background-color: #FF3333;
-}
-
-#title table, #title tr, #title td {
- border-left: none;
- border-bottom: none;
- text-align: center;
-}
-
-#title td:last-child {
- border-right: none;
-}
-
-#testcasepage h1 {
- font-size: 2em;
- font-family: Arial, sans-serif; font-weight : bold;
- line-height: 1;
- color: #000;
- margin-bottom: 0.75em;
- padding-top: 0.25em;
- font-weight: bold;
-}
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
-<test_definition>
- <suite name="{TESTSUITE_NAME}" launcher="WRTLauncher" category="undefined">
- <set name="Default">
- <testcase component="TizenAPI/Application/Default" execution_type="auto" id="testcase" priority="P1" purpose="" type="" status="approved">
- <description>
- <test_script_entry>/opt/{TESTSUITE_NAME}/testcase/{TESTCASE}.html</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion element_type="" element_name="" interface="" specification="" section="" category=""/>
- <spec_url></spec_url>
- <spec_statement/>
- </spec>
- </specs>
- </testcase>
- </set>
- </suite>
-</test_definition>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
-<test_definition>
- <suite name="{TESTSUITE_NAME}" launcher="WRTLauncher" category="undefined">
- <set name="Default">
- <testcase component="TizenAPI/Application/Default" execution_type="auto" id="testcase" priority="P1" purpose="">
- <description>
- <test_script_entry>/opt/{TESTSUITE_NAME}/testcase/{TESTCASE}.html</test_script_entry>
- </description>
- </testcase>
- </set>
- </suite>
-</test_definition>
+++ /dev/null
-webrunner_SCRIPTS = *
-webrunnerdir = $(prefix)/opt/{TESTSUITE_NAME}/webrunner
-EXTRA_DIST = $(webrunner_SCRIPTS)
+++ /dev/null
-<!doctype html>
-<!--
-Copyright (c) 2015 Samsung Electronics Co.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of works must retain the original copyright notice, this list
- of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the original copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-* Neither the name of Intel Corporation nor the names of its contributors
- may be used to endorse or promote products derived from this work without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Authors:
-
-
--->
-
-<head>
-<meta name="viewport" content="width=device-width">
-<script src="jquery-1.10.2.min.js"></script>
-<style type="text/css">
-html {
- font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;
-}
-
-body {
- background-color: white;
-}
-
-table#browse {
- border-collapse:collapse;
- table-layout:fixed;width:80%;
-}
-
-table#browse th:first-child,table#browse td:first-child {width:40%;}
-
-table#browse th:last-child,table#browse td:last-child {width:30%;}
-
-table#browse th {
- padding:0;
- padding-bottom:0.5em;
- text-align:left;
- border-bottom:medium solid black;
-}
-table#browse td {
- padding:1em;
- padding-bottom:0.5em;
- border-bottom:thin solid black;
-}
-div#navbar{
- box-sizing: border-box;
- width: 99%;
- border: 0px;
- text-align: left;
- background: slateblue;
- color: white;
-}
-div#footbar{
- width: 99%;
- border: 0px;
- text-align: left;
-}
-textarea#testinfo{
- width: 99%;
- font-size: 0.8em;
-}
-input{
- font-size: 1.2em;
- padding-top: 0.1em;
- padding-bottom: 0.1em;
-}
-
-#btnPrev,#btnNext{
- width: 8%;
-}
-#btnDone,#btnRun,#btnList,#btnPass,#btnFail,#btnBlock{
- width: 12%;
- font-weight: bold;
-}
-
-#btnPass { color: green;}
-#btnFail { color: red;}
-#btnBlock { color: orange;}
-#labBatch{
- font-size: 0.5em;
-}
-#textTest {
- width: 60%;
-}
-
-#frmTest {
- border: none;
-}
-.singlemode { display: none;}
-.short{
- padding-left: 1em;
-}
-</style>
-</head>
-
-<body>
-<div id="navbar" class="batchmode">
- <span class="short singlemode"><input type="button" id="btnList" value="List"/></span>
- <span class="singlemode short">
- <input type="button" id="btnPrev" value="<"/>
- <input type="text" id="textTest" readonly />
- <input type="button" id="btnNext" value=">"/>
- </span>
- <span class="short listmode"> <input type="button" id="btnDone" value="Done"/></span>
-</div>
-<div id="divSum"> </div>
-<div width="99%" class="singlemode">
- <textarea class="batchmode" id="testinfo" rows=4 disabled>
- </textarea>
-</div>
-<div id="footbar" class="batchmode">
- <span class="short"><input type="button" id="btnRun" value="Run"/></span>
- <span class="short singlemode"><input type="button" id="btnPass" value="PASS"/></span>
- <span class="short singlemode"><input type="button" id="btnFail" value="FAIL"/></span>
- <span class="short singlemode"><input type="button" id="btnBlock" value="BLOCK"/></span>
-</div>
-<iframe width="100%" id="frmTest" allowFullScreen="true" mozAllowFullScreen="true" webkitAllowFullscreen="true" src="">
-</iframe>
-<script src="testrunner.js"> </script>
-</body>
-</html>
+++ /dev/null
-/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-//@ sourceMappingURL=jquery-1.10.2.min.map
-*/
-(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
-}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
-u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
+++ /dev/null
-/*
-Copyright (c) 2015 Samsung Electronics Co.
-
-Redistribution and use in source and binary forms, with or without modification,
-are permitted provided that the following conditions are met:
-
-* Redistributions of works must retain the original copyright notice, this list
- of conditions and the following disclaimer.
-* Redistributions in binary form must reproduce the original copyright notice,
- this list of conditions and the following disclaimer in the documentation
- and/or other materials provided with the distribution.
-* Neither the name of Intel Corporation nor the names of its contributors
- may be used to endorse or promote products derived from this work without
- specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
-INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
-BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
-EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-Authors:
-
-*/
-var STUB_PORT = "";
-var RESOURCE_DIR = "/opt/usr/media";
-$.ajax({
- url:RESOURCE_DIR + "/tct/portconfigure.json",
- dataType:"json",
- data:{},
- async:false,
- success:function(data){
- STUB_PORT = data[0]["STUB_PORT"];
- }
-});
-
-$(function(){
- try {
- // Checks if a device supports bluetooth API or not
- var shape = tizen.systeminfo.getCapability("http://tizen.org/feature/screen.shape");
- console.log("Shape = " + shape);
- //alert(" Shape = " + shape);
- } catch (error) {
- // alert("Error name: " + error.name + ", message: " + error.message);
- console.log("Error name: " + error.name + ", message: " + error.message);
- }
-
- if(shape=="circle"){
- $('body').css('max-width', '100%');
- $('body').css('max-height', '100%');
- $('body').css('background-color', 'white');
- $('body').css('margin-top', '20%');
- $('body').css('margin-bottom', '20%');
- $('body').css('margin-left', '20%');
- $('body').css('margin-right', '20%');
- }
-});
-(function (window){
- function TestRunner() {
- this.start = null;
- this.ui = null;
- this.submitResult = null;
- this.report = function (result, message) {};
- this.doTest = function () {};
- }
-
- TestRunner.prototype = (function () {
- var index = -1;
- var Tests = [];
- var Sets = {};
- function newSummary() {
- return {"TOTAL": 0,
- "PASS" : 0,
- "FAIL" : 0,
- "BLOCK" : 0,
- "NOTRUN" : 0};
- }
- function newTestContext() {
- return {start_time: null,
- prev_uri: "",
- uri: "",
- sub_index: 0,
- onload_delay: 0
- };
- }
- function getParms () {
- var parms = {};
- var items = location.search.substring(1).split('&');
- for ( var i = 0, max = items.length; i < max; i++) {
- var pos = items[i].indexOf('=');
- if (pos > 0) {
- var key = items[i].substring(0, pos);
- var val = items[i].substring(pos + 1);
- if (!parms[key]) {
- var rawVal = decodeURI(val);
- if (rawVal.indexOf(',') < 0)
- parms[key] = rawVal;
- else
- parms[key] = rawVal.split(',');
- }
- } else
- parms[items[i]] = 1;
- }
- if (!parms.testsuite)
- parms.testsuite = 'tests.xml';
- return parms;
- }
- var parms = getParms();
- var sum = newSummary();
- var testContext = newTestContext();
- return {
- constructor: TestRunner,
- options: parms,
- getTestContext: function (field) {
- return testContext[field];
- },
-
- goNext: function () {
- if (Tests.length === 0) return false;
- if (index >= Tests.length) {
- index = -1;
- return false;
- }
- index++;
- return true;
- },
-
- goPrev: function () {
- if (Tests.length === 0) return false;
- if (index < 0) {
- index = Tests.length;
- return false;
- }
- index--;
- return true;
- },
-
- runAll: function () {
- testContext = newTestContext();
- this.ui.updateView(VIEWFLAGS.add("batch"));
- this.ui.updateView(VIEWFLAGS.del("list"));
- this.testIndex(-1);
- this.doTest();
- },
-
- cleanTests: function () {
- Tests = [];
- },
-
- testIndex: function (ind) {
- if (typeof ind === "undefined")
- return index;
- index = ind;
- },
-
- getTest: function (ind) {
- if (typeof ind === "undefined")
- ind = index;
- return Tests[ind];
- },
-
- addTest: function (test) {
- if (test instanceof Array)
- Tests = Tests.concat(test);
- else
- Tests.push(test);
- },
-
- sumInit: function (num) {
- if (typeof num === "undefined")
- num = Tests.length;
- sum.TOTAL = sum.NOTRUN = num;
- sum.PASS = sum.FAIL = sum.BLOCK = 0;
- },
-
- sumUpdate: function (oldRes, newRes, set) {
- if (oldRes !== null) {
- sum[oldRes]--;
- if (set !== null) Sets[set][oldRes]--;
- }
- if (newRes !== null) {
- sum[newRes]++;
- if (set != null) Sets[set][newRes]++;
- }
- },
-
- checkResult: function (oTestDoc) {
- var message = "";
- // Handle sub-index test
- if (testContext.sub_index > 0) {
- var oRes = $(oTestDoc).find("table#results");
- if (oRes.length == 0)
- return false;
- var ind = testContext.sub_index - 1;
- var $n = $(oRes).find('tbody > tr').eq(ind);
- if ($n.length == 0)
- return false
- var result = $n.children("td:eq(0)").text();
- message = $n.children("td:eq(2)").text();
- this.report(result.toUpperCase(), message);
- return true;
- }
-
- var oPass = $(oTestDoc).find(".pass");
- var oFail = $(oTestDoc).find(".fail");
- // All tests pass
- if (oPass.length > 0 && oFail.length == 0) {
- this.report('PASS', message);
- return true;
- }
- // Handle failed tests
- if (oFail.length > 0) {
- var oRes = $(oTestDoc).find("table#results");
- $(oRes).find('tr.fail').each(function() {
- message += " *" + $(this).children("td:eq(1)").text() + ": ";
- message += $(this).children("td:eq(2)").text();
- });
- this.report('FAIL', message);
- return true;
- }
- return false;
- },
-
- testInfo: function (ind) {
- var info = "";
- var tc = this.getTest();
- if (!tc) return info;
- info += "Test : (" + (index + 1) + "/" + sum.TOTAL + ") ";
- info += tc.test_script_entry;
- info += "\nPurpose: " + tc.purpose;
- if (tc.pre_condition)
- info += "\nPrecondition: " + tc.pre_condition;
- if (tc.steps)
- info += "\n" + tc.steps;
- return info;
- },
-
- getTestCaseUrl: function () {
- function getUriField(uri, param) {
- var querys = uri.split("?")
- if (querys.length <= 1)
- return "";
- uri = querys[1];
- var start = uri.indexOf(param);
- if (start == -1)
- return "";
- start += param.length + 1;
- var end = uri.indexOf("&", start);
- if (end == -1)
- return uri.substring(start);
- return uri.substring(start, end);
- }
- var tc = this.getTest();
- if (!tc) return null;
- var delay = tc.onload_delay;
- if (delay)
- testContext.onload_delay = parseInt(delay) * 1000;
- else
- testContext.onload_delay = 5000;
-
- var uri = tc.test_script_entry;
- if (typeof this.options.testprefix !== "undefined") {
- var pos = uri.indexOf('http://');
- if (pos !== 0)
- uri = this.options.testprefix + uri
- }
- var val = getUriField(uri, "value");
- if (val && tc.execution_type == "auto" && VIEWFLAGS.has("batch")) { // Need sub index in TC
- testContext.sub_index = parseInt(val);
- testContext.uri = uri.split("?")[0];
- if (testContext.uri == testContext.prev_uri)
- return "";
- } else {
- testContext.uri = uri;
- testContext.sub_index = 0;
- }
- testContext.prev_uri = testContext.uri;
- testContext.start_time = new Date();
- return testContext.uri;
- },
-
- loadReady: function () {
- if (!VIEWFLAGS.has("batch"))
- return;
- if (!this.ui.testComplete()){
- if (testContext.onload_delay > 0){
- var tval = 500;
- var self = this;
- setTimeout(function() {self.loadReady();}, tval);
- testContext.onload_delay -= tval;
- return
- }
- this.report("BLOCK", "Timeout");
- }
- this.doTest();
- },
-
- getTestSum: function (include_set) {
- var sumdata = "<section><h3>Total:" + sum.TOTAL
- + " Pass:<span style='color:green;'>" + sum.PASS
- + "</span> Fail:<span style='color:red;'>" + sum.FAIL
- + "</span> Block:<span style='color:orange;'>" + sum.BLOCK
- + "</span> NotRun:<span style='color:black;'>" + sum.NOTRUN
- + "</span></h3></section>";
- if (VIEWFLAGS.has("batch")) {
- var tc = this.getTest();
- if (tc) sumdata += "<h4><span style='background-color: wheat'>(#" + index + ") " + tc.id + "</span></h4>";
- }
-
- if (include_set) {
- sumdata += "<p><table id='browse'><tr><th>TestSet</th>";
- sumdata += "<th>Total</th><th>Pass</th><th>Fail</th><th>Block</th></tr>";
- $.each(Sets, function (key, val){
- sumdata += "<tr><td>" + key+ "</td>";
- sumdata += "<td style='color:black;'>" + val.TOTAL + "</td>";
- sumdata += "<td style='color:green;'>" + val.PASS + "</td>";
- sumdata += "<td style='color:red;'>" + val.FAIL + "</td>";
- sumdata += "<td style='color:orange;'>" + val.BLOCK + "</td></tr>";
- });
- sumdata += "</table>";
- }
- return sumdata;
- },
-
- getBrowseInfo: function () {
- var failList = passList = blockList = notrunList = "";
- function createTestList(tc, color, ind) {
- var mtag = (tc.execution_type === "manual") ? "(M)" : "";
- return "<li>" + mtag + "<a rel='" + ind + "' href='' style ='color:" + color + ";'>" + tc.id + "</a>" + "</li>";
- }
- Sets = {};
- $.each(Tests, function (ind ,val) {
- if (this.set === null)
- this.set = "default";
- if (typeof Sets[this.set] === "undefined")
- Sets[this.set] = newSummary();
- Sets[this.set][this.result]++;
- Sets[this.set]["TOTAL"]++;
- if (this.result == "FAIL")
- failList += createTestList(this, "red", ind);
- if (this.result == "PASS")
- passList += createTestList(this, "green", ind);
- if (this.result == "BLOCK")
- blockList += createTestList(this, "orange", ind);
- if (this.result == "NOTRUN")
- notrunList += createTestList(this, "black", ind);
- });
- var data = "<html><head><style>ul li {padding-bottom:0.8em;font-size: 1.3em;}";
- data += "html{font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;}</style></head><body>";
- if (notrunList)
- data += "<section><h3>Notruns</h3><ul>" + notrunList + "</ul></section>";
- if (failList)
- data += "<section><h3 style='color: red;'>Fails</h3><ul>" + failList + "</ul></section>";
- if (blockList)
- data += "<section><h3 style='color: orange;'>Blocks</h3><ul>" + blockList + "</ul></section>";
- if (passList)
- data += "<section><h3 style='color: green'>Passes</h3><ul>" + passList + "</ul></section>";
- data += "</body></html>";
- return data;
- },
-
- TestCase: function () {
- return {
- id: null,
- test_script_entry: null,
- execution_type: "manual",
- result: "NOTRUN",
- purpose: "",
- set: null,
- pre_condition: "",
- onload_delay: 0,
- steps: "",
- data: null};
- }
- };
- }());
- // Standalone test runner
- var master_runner = new TestRunner();
- master_runner.start = function (ui) {
- function filter(xml, self) {
- var set_ind = 0;
- var manuals = [];
- $(xml).find("set").each(function () {
- var setname = $(this).attr("name");
- if (!setname)
- setname = "set" + set_ind;
- $(this).find("testcase").each(function () {
- var v = $(this).attr('execution_type');
- if (self.options.execution_type && v != self.options.execution_type
- && $.inArray(v, self.options.execution_type) < 0) {
- $(this).remove();
- return;
- }
- v = $(this).attr('priority');
- if (self.options.priority && v != self.options.priority
- && $.inArray(v, self.options.priority) < 0){
- $(this).remove();
- return;
- }
- var test = self.TestCase();
- test.id = $(this).attr("id");
- test.execution_type = $(this).attr("execution_type");
- test.test_script_entry = $(this).find("test_script_entry").text();
- test.purpose = $(this).attr("purpose");
- test.pre_condition = $(this).find("pre_condition").text();
- test.onload_delay = $(this).attr("onload_delay");
- test.result = "NOTRUN";
- test.set = setname;
- test.data = this;
- if (test.execution_type === "auto")
- self.addTest(test);
- else
- manuals.push(test);
- });
- set_ind++;
- });
- self.addTest(manuals);
- }
-
- var self = this;
- ui.bind(self);
- $.get(self.options.testsuite, null, function (xml) {
- self.internal.xmldoc = xml;
- filter(xml, self);
- self.sumInit();
- setTimeout(function () {
- self.ui.browse();
- setTimeout(function () {
- if (self.options.autorun)
- self.runAll();
- }, 2000);
- }, 100);
- }, "xml");
- };
-
- master_runner.doTest = function () {
- var self = this, tc = null;
- while (self.goNext()) {
- tc = self.getTest();
- if (!tc || tc.execution_type === "manual")
- break;
- self.ui.updateTestInfo(self.testInfo(), null, null);
- self.ui.runTest(self.getTestCaseUrl());
- return;
- }
- if (self.options.autorun) {
- self.submitResult();
- close_window();
- return;
- }
- this.ui.updateView(VIEWFLAGS.del("batch"));
- if (!tc) {
- setTimeout(function () {self.ui.browse();}, 500);
- return;
- }
- this.ui.updateTest();
- };
-
- master_runner.report = function (result, log) {
- var tc = this.getTest();
- if (!tc) return;
- var oldresult = tc.result;
- this.sumUpdate(oldresult, result, tc.set);
- tc.result = result;
- $(tc.data).find('result_info').remove();
- $(tc.data).attr('result', result);
- var doc = $.parseXML("<result_info><actual_result>" + result +
- "</actual_result><start>" + this.getTestContext("start_time") +
- "</start><end>" + new Date() + "</end><stdout>" +
- escape_html(log) + "</stdout></result_info>");
- $(tc.data).append(doc.documentElement);
- if (VIEWFLAGS.has("batch")) result = null;
- this.ui.updateTestInfo(null, this.getTestSum(false), result);
- };
-
- master_runner.submitResult = function () {
- var xmldoc = this.internal.xmldoc;
- var contents = (new XMLSerializer()).serializeToString(xmldoc);
- if (window.opener) window.opener.postMessage(contents, "*");
- };
-
- master_runner.internal = {xmldoc: null};
-
- // Controlled test runner
- var slave_runner = new TestRunner();
- slave_runner.start = function (ui) {
- function sync_session_id() {
- $.get(SERVER + "/init_session_id?session_id="
- + self.internal.session_id);
- }
- var self = this;
- self.internal.session_id = Math.round(Math.random() * 10000);
- sync_session_id();
- var next_step = self.internal.get_json("ask_next_step");
- if (!next_step || next_step.step != "continue")
- return false;
- ui.bind(self);
- var f = function () {
- var p = self.internal.get_json("check_execution_progress");
- if (p) self.sumInit(parseInt(p.total));
- self.doTest();
- };
- self.ui.updateView(VIEWFLAGS.add("batch"));
- self.ui.updateView(VIEWFLAGS.del("list"));
- setTimeout(f, 1000);
- return true;
- };
-
- slave_runner.doTest = function () {
- var self = this;
- if (self.internal.stage > 0) {
- self.ui.updateView(VIEWFLAGS.del("batch"));
- self.goNext();
- self.ui.updateTest();
- return;
- }
- var next_step = self.internal.get_json("ask_next_step");
- if (next_step && next_step.step == "continue") {
- var task = self.internal.get_json("auto_test_task");
- if (task === null) {
- print_error("ask_test_task", "Fail get task");
- } else if (task.invalid === 0) {
- print_error("ask_test_task", "Invalid session");
- } else if (task.stop === 0) {
- print_error("ask_test_task", "close window");
- } else if (task.none !== 0) { //handle auto test
- var test = self.TestCase();
- test.id = task.case_id;
- test.onload_delay = task.onload_delay;
- test.test_script_entry = task.entry;
- test.execution_type = "auto";
- test.purpose = task.purpose;
- test.pre_condition = task.pre_condition;
- self.addTest(test);
- self.goNext();
- self.ui.updateTestInfo(self.testInfo(), null, null);
- self.ui.runTest(self.getTestCaseUrl());
- return;
- } else { //handle manual test
- self.ui.updateView(VIEWFLAGS.del("batch"));
- self.internal.stage = 1;
- var mtask = self.internal.get_json("manual_cases");
- if (mtask && mtask.none != 0) {
- self.cleanTests();
- for (var i = 0, max = mtask.length; i < max; i++) {
- var test = self.TestCase();
- test.id = mtask[i].case_id;
- test.test_script_entry = mtask[i].entry;
- test.purpose = mtask[i].purpose;
- test.pre_condition = mtask[i].pre_condition;
- test.result = "NOTRUN";
- test.execution_type = "manual";
- test.index = i;
- var steps = "";
- $(mtask[i].steps).each(function () {
- steps += "Step-" + this.order + "\t: " + this.step_desc + "\n";
- steps += "Expect\t: " + this.expected + "\n";
- });
- test.steps = steps;
- self.addTest(test);
- }
- self.ui.updateTest(-1);
- self.sumInit();
- self.ui.browse();
- } else
- close_window();
- return;
- }
- }
- close_window();
- };
-
- slave_runner.report = function(result, log) {
- var tc = this.getTest();
- var oldresult;
- if (this.internal.stage > 0) {
- this.internal.post_json("commit_manual_result",
- {"case_id": tc.id, "result": result});
- oldresult = tc.result
- tc.result = result;
- } else {
- this.internal.post_json("commit_result",
- { "case_id" : tc.id,
- "result" : result,
- "msg" : "[Message]" + log,
- "session_id" : this.internal.session_id});
- oldresult = "NOTRUN";
- }
- this.sumUpdate(oldresult, result, null);
- if (VIEWFLAGS.has("batch")) result = null;
- this.ui.updateTestInfo(null, this.getTestSum(false), result);
- };
-
- slave_runner.submitResult = function () {
- $.get(SERVER + "/generate_xml");
- };
-
- slave_runner.internal = {
- session_id: null,
- stage: 0,
- get_json: function (name) {
- var jsondata = null;
- $.getJSON(SERVER + "/" + name + "?session_id="
- + this.session_id, function(data) {
- jsondata = data;});
- return jsondata; },
- post_json: function (name, d) {
- $.post(SERVER + "/" + name, d, null, "json");
- }
- };
-
- var i_ui = (function () {
- var testinfo = $("#testinfo").get(0);
- var frmTest = $("#frmTest").get(0);
- var textTest = $("#textTest").get(0);
- var btnPass = $("#btnPass").get(0);
- var btnFail = $("#btnFail").get(0);
- var btnBlock = $("#btnBlock").get(0);
- var btnDone = $("#btnDone").get(0);
- var btnNext = $("#btnNext").get(0);
- var btnPrev = $("#btnPrev").get(0);
- var btnRun = $("#btnRun").get(0);
- var divSum = $("#divSum").get(0);
- var btnList = $("#btnList").get(0);
- var runner = null;
- var listmode = null;
- var nextTest = function () {
- runner.goNext();
- selectTest();
- };
-
- var prevTest = function() {
- runner.goPrev();
- selectTest();
- };
-
- var selectResult = function() {
- runner.report(this.value, "");
- };
-
- var selectTest = function () {
- frmTest.src = "";
- var tc = runner.getTest();
- if (!tc) {
- if (runner.testIndex() === -1)
- textTest.value = "---Begin---";
- else
- textTest.value = "---End---";
- changeColor("NOTRUN");
- return;
- }
- testinfo.value = runner.testInfo();
- $(divSum).html(runner.getTestSum(false));
- textTest.value = ((tc.execution_type === "manual") ? "(M)" : "") + tc.id;
- changeColor(tc.result);
- };
-
- function changeColor(result) {
- if (result === "PASS")
- $(textTest).css("backgroundColor", "lightgreen");
- else if (result === "FAIL")
- $(textTest).css("backgroundColor", "tomato");
- else if (result === "BLOCK")
- $(textTest).css("backgroundColor", "yellow");
- else
- $(textTest).css("backgroundColor", "white");
- }
-
- return {
- bind: function (r) {
- var self = this;
- r.ui = self;
- runner = r;
- $(btnPass).on("click", selectResult);
- $(btnFail).on("click", selectResult);
- $(btnBlock).on("click", selectResult);
- $(btnNext).on("click", nextTest);
- $(btnPrev).on("click", prevTest);
- $(btnRun).on("click", function () {
- if (VIEWFLAGS.has("list")) {
- runner.runAll();
- } else
- self.runTest(runner.getTestCaseUrl());
- });
- $(frmTest).on("load", function () {runner.loadReady();});
- $(btnDone).on("click", function () {
- runner.submitResult();
- close_window();
- });
- $(btnList).on("click", function () {
- frmTest.src = "";
- //self.updateTest(-1);
- setTimeout(function () {self.browse();}, 300);
- });
- frmTest.height = $(window).height();
- },
-
- browse: function () {
- var tdoc = frmTest.contentWindow.document;
- tdoc.open("text/html", "replace");
- tdoc.writeln(runner.getBrowseInfo());
- var self = this;
- $(tdoc).find("section ul li>a").on("click", function (e) {
- var ind = parseInt($(this).attr("rel"));
- self.updateView(VIEWFLAGS.del("list"));
- self.updateTest(ind);
- window.scrollTo(0, 0);
- e.preventDefault();
- });
- $(divSum).html(runner.getTestSum(true));
- self.updateView(VIEWFLAGS.add("list"));
- },
-
- updateTest: function (ind) {
- if (typeof ind !== "undefined") runner.testIndex(ind);
- selectTest();
- },
-
- updateView: function (flags) {
- if (flags & VIEWFLAGS.flags.list) {
- $(".listmode").show();
- $(".singlemode").hide();
- } else {
- $(".listmode").hide();
- $(".singlemode").show();
- }
- if (flags & VIEWFLAGS.flags.batch)
- $(".batchmode").hide();
- else
- $(".batchmode").show();
- },
-
- testComplete: function () {
- return runner.checkResult(frmTest.contentWindow.document);
- },
-
- runTest: function (uri) {
- if (uri === null) return;
- if (uri)
- frmTest.src = uri;
- else
- runner.loadReady();
-
- },
-
- updateTestInfo: function (info, sum, result) {
- if (info !== null)
- testinfo.value = info;
- if (sum !== null)
- $(divSum).html(sum);
- if (result !== null)
- changeColor(result);
- },
- };
- } ());
-
- function escape_html(s) {
- return s.replace(/\&/g, "&").replace(/</g, "<").replace(/"/g,
- """).replace(/'/g, "'");
- }
-
- function print_error(command, message) {
- console.warn("Command -" + command + ": " + message);
- }
-
- function close_window() {
- setTimeout("window.open('','_self','');window.close()", 1000);
- }
-
- function pre_init() {
- var runner_ok = false;
- $.get(SERVER + "/check_server", function () {
- runner_ok = slave_runner.start(i_ui);
- });
- if (!runner_ok)
- master_runner.start(i_ui);
- }
- var SERVER = "http://127.0.0.1:"+STUB_PORT;
- var VIEWFLAGS = { val: 0,
- flags: {list: 1, batch: 2},
- add: function (f) { this.val |= this.flags[f]; return this.val},
- del: function (f) { this.val &= ~this.flags[f]; return this.val},
- has: function (f) { return this.val & this.flags[f];},
- };
- $.ajaxSetup({ async: false});
- $(window).on("ready", pre_init);
-})(window);
+++ /dev/null
-name=$(basename $(pwd))
-main_version="2.4"
-release=""
-version="$main_version"
-appname=$(echo $name|sed 's/-/_/g')
-
-# set value "1" if this suite need to sign,otherwise set "0" #
-sign="1"
-
-# set value "1" if this suite need to keep src_file,otherwise set "0" #
-src_file="0"
-
-# specified files to be kept in whitelist #
-whitelist="
-inst.sh
-tests.xml
-tests.full.xml
-COPYING
-LICENSE.Apache-2.0
-LICENSE.CC-BY-3.0
-NOTICE
-mediasrc"
+++ /dev/null
-[TCTSHELL]
-WRT_LAUNCHR_CMD = WRTLauncher
-TCT_SHELL_HOME = /opt/tools/shell/
-TCT_PLAN_FOLDER = /opt/tools/shell/plan/
-
-[DISTRIBUTE_MODE]
-DEVICE_EXCEPTIONS =
-#Devices to ignore for distribute mode.
-#example:
-# example_device1
-# example_device2
- DEVICE1
- DEVICE2
-# 0000d81400006200
-
-[Device]
-DEVICE_TMP_FOLDER = /tmp/
-DEVICE_TESTS_FILE = /opt/usr/media/tct/opt/%s/tests.xml
-DEVICE_CAPABILITY_PATH = /opt/usr/media/Documents/tct/capability.xml
-DEVICE_BUILD_INFO_PATH = /opt/usr/media/Documents/tct/buildinfo.xml
-DEVICE_DEFAULT_CONF_PATH = /opt/usr/media/tct/opt/tct-testconfig/tct-testconfig.ini
-DEVICE_DEFAULT_ISON_CONF_PATH = /opt/usr/media/tct/preconfigure.json
-DEVICE_PORT_JSON_CONF_PATH = /opt/usr/media/tct/portconfigure.json
-DEVICE_PRECONFIGURE_FILE_PATH = /opt/usr/media/Documents/tct/pre_configure.conf
-
-
+++ /dev/null
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+++ /dev/null
-[public_version]
-version=TCT_2.4
-[internal_version]
-version=TCT_2.4
-[public_shell_version]
-version=TCTSHELL_3.1.0-20160418
+++ /dev/null
-tct-shell (1.0.16) unstable; urgency=low
-
- * Packaged for Ubuntu
-
- -- Ed Bartosh <eduard.bartosh@intel.com> Mon, 06 May 2013 14:37:15 +0300
+++ /dev/null
-Source: tct-shell
-Section: utils
-Priority: standard
-Maintainer: Lei Yang <lei.a.yang@intel.com>
-Build-Depends: debhelper (>= 8.0.0), python-setuptools
-Standards-Version: 3.9.4
-
-Package: tct-shell
-Architecture: all
-Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}
-Description: Console tool for Tizen Compliance Test
- This tool provides an alternative way to execute TCT with testkit-lite
- when testkit-manager is not available
+++ /dev/null
-Format: http://dep.debian.net/deps/dep5
-Source: https://github.com/testkit/testkit-manager
-
-Files: *
-Copyright: 2012-2013 Intel Corp.
-License: GPL-2.0
-
-Files: debian/*
-Copyright: 2012-2013 Intel Corp.
-License: GPL-2.0
-
-License: GPL-2.0
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License
- .
- This package is distributed in the hope that 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, see <http://www.gnu.org/licenses/>.
- .
- On Debian systems, the complete text of the GNU General
- Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+++ /dev/null
-README
-CONFIG
+++ /dev/null
-tct-shell_1.0.16_all.deb utils standard
+++ /dev/null
-#!/bin/sh
-
-# Set permissions
-chmod -R ugo+rwx /opt/tools/shell
-
-#DEBHELPER#
+++ /dev/null
-#!/usr/bin/make -f
-
-%:
- dh $@
+++ /dev/null
-PKG_NAME := tct-shell
-SPECFILE = $(addsuffix .spec, $(PKG_NAME))
-PKG_VERSION := $(shell grep '^Version: ' $(SPECFILE)|awk '{print $$2}')
-
-TARBALL := $(PKG_NAME)_$(PKG_VERSION).tar.gz
-
-dsc: tarball
- $(eval MD5=$(shell md5sum $(TARBALL) | sed "s/ / $(shell stat -c '%s' $(TARBALL)) /"))
- @sed -i 's/^Version:.*/Version: $(PKG_VERSION)/' $(PKG_NAME).dsc
- @sed -i 's/ [a-f0-9]\+ [0-9]\+ $(PKG_NAME).*tar.*/ $(MD5)/' $(PKG_NAME).dsc
-
-tarball:
- @cd "$$(git rev-parse --show-toplevel)" \
- && git archive --prefix $(PKG_NAME)-$(PKG_VERSION)/ HEAD \
- | gzip > "$(CURDIR)/$(TARBALL)"
-
-clean:
- @rm -f $(PKG_NAME)*.tar.gz
-
-all: clean tarball dsc
+++ /dev/null
-Source: tct-shell
-Section: utils
-Priority: standard
-Maintainer: Shaofeng <shaofeng.tang@intel.com>
-Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support, tree
-Standards-Version: 3.9.2
-Homepage: https://github.com/testkit/
-Version: 1.0.1
-Files:
- f64f26693160cf59cdae21e8961cf986 15593 tct-shell_1.0.1.tar.gz
-
+++ /dev/null
-Summary: TCT-Shell
-Name: tct-shell
-Version: 1.0.15
-Release: 1
-License: GPLv2
-Group: Applications/System
-Source: %name-%version.tar.gz
-BuildRoot: %_tmppath/%name-%version-buildroot
-Requires: python
-
-
-%description
-TCT-Shell is a wrapper pf testkit-lite. provide an alternative way to execute TCT with testkit-lite when testkit-manager is not available
-Provide the following functions:
-1. List available test packages.
-2. Install/remove test packages on target device according to user's option
-3. Trigger testing in 3 ways: through test plan, through package, rerun failed test cases.
-4. Show test result summary in visual way.
-
-%prep
-%setup -q
-
-%build
-./autogen
-./configure
-make
-
-%install
-[ "\$RPM_BUILD_ROOT" != "/" ] && rm -rf "\$RPM_BUILD_ROOT"
-make install DESTDIR=$RPM_BUILD_ROOT
-
-%clean
-
-%post
-# Set permissions
-chmod ugo+rwx /opt/tools/shell
-
-%files
-/usr/lib/python2.7/dist-packages/tctshell/*
-/opt/tools/shell
-/opt/tools/shell/plan
-/opt/tools/shell/style
-/opt/tools/tct-shell
-/opt/tools/tct-plan-generator
-
-%post
-chmod -R 777 /opt/tools/shell
-
-%changelog
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="CSharp_Full_mobile_3.0" profile="mobile">\r
- <execute_type>Auto</execute_type>\r
- <suite name="Tizen.Applications.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>24</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/Tizen.Applications.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Applications.Tests" category="C# Device APIs">\r
- <auto_tcn>129</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>129</total_tcn>\r
- <pkg_name>mobile/Tizen.Applications.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Badge.Tests" category="C# Device APIs">\r
- <auto_tcn>21</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>21</total_tcn>\r
- <pkg_name>mobile/Tizen.Badge.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Bluetooth.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>120</manual_tcn>\r
- <total_tcn>120</total_tcn>\r
- <pkg_name>mobile/Tizen.Bluetooth.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Bluetooth.Tests" category="C# Device APIs">\r
- <auto_tcn>120</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>120</total_tcn>\r
- <pkg_name>mobile/Tizen.Bluetooth.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Device.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>16</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>mobile/Tizen.Device.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Device.Tests" category="C# Device APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>mobile/Tizen.Device.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Download.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/Tizen.Download.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Download.Tests" category="C# Device APIs">\r
- <auto_tcn>53</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>mobile/Tizen.Download.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Feedback.Tests" category="C# Device APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/Tizen.Feedback.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Location.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/Tizen.Location.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Location.Tests" category="C# Device APIs">\r
- <auto_tcn>102</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>102</total_tcn>\r
- <pkg_name>mobile/Tizen.Location.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Mediacontent.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/Tizen.Mediacontent.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Mediacontent.Tests" category="C# Device APIs">\r
- <auto_tcn>228</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>228</total_tcn>\r
- <pkg_name>mobile/Tizen.Mediacontent.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Mime.Tests" category="C# Device APIs">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/Tizen.Mime.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Multimedia.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>50</manual_tcn>\r
- <total_tcn>50</total_tcn>\r
- <pkg_name>mobile/Tizen.Multimedia.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Multimedia.Tests" category="C# Device APIs">\r
- <auto_tcn>257</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>257</total_tcn>\r
- <pkg_name>mobile/Tizen.Multimedia.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Network.Tests" category="C# Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>mobile/Tizen.Network.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Nfc.Tests" category="C# Device APIs">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>50</total_tcn>\r
- <pkg_name>mobile/Tizen.Nfc.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Notifications.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>32</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>mobile/Tizen.Notifications.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Notifications.Tests" category="C# Device APIs">\r
- <auto_tcn>74</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>74</total_tcn>\r
- <pkg_name>mobile/Tizen.Notifications.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Packagemanager.Tests" category="C# Device APIs">\r
- <auto_tcn>59</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>59</total_tcn>\r
- <pkg_name>mobile/Tizen.Packagemanager.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Privilege.Tests" category="C# Device APIs">\r
- <auto_tcn>19</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>mobile/Tizen.Privilege.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Push.Tests" category="C# Device APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>mobile/Tizen.Push.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Runtimeinformation.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>33</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/Tizen.Runtimeinformation.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Runtimeinformation.Tests" category="C# Device APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/Tizen.Runtimeinformation.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Sample.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/Tizen.Sample.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Sensor.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>90</manual_tcn>\r
- <total_tcn>90</total_tcn>\r
- <pkg_name>mobile/Tizen.Sensor.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Sensor.Tests" category="C# Device APIs">\r
- <auto_tcn>276</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>276</total_tcn>\r
- <pkg_name>mobile/Tizen.Sensor.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Smartcard.Tests" category="C# Device APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>mobile/Tizen.Smartcard.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.System.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/Tizen.System.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.System.Tests" category="C# Device APIs">\r
- <auto_tcn>29</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>29</total_tcn>\r
- <pkg_name>mobile/Tizen.System.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Systemsettings.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>26</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>mobile/Tizen.Systemsettings.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Systemsettings.Tests" category="C# Device APIs">\r
- <auto_tcn>114</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>114</total_tcn>\r
- <pkg_name>mobile/Tizen.Systemsettings.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Tizen.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/Tizen.Tizen.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Tizen.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>0</total_tcn>\r
- <pkg_name>mobile/Tizen.Tizen.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.Tracer.Tests" category="C# Device APIs">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/Tizen.Tracer.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.UI.Manual.Tests" category="C# Device APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>324</manual_tcn>\r
- <total_tcn>324</total_tcn>\r
- <pkg_name>mobile/Tizen.UI.Manual.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.UI.Tests" category="C# Device APIs">\r
- <auto_tcn>1019</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1019</total_tcn>\r
- <pkg_name>mobile/Tizen.UI.Tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="Tizen.WidgetControl.Tests" category="C# Device APIs">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/Tizen.WidgetControl.Tests-3.0.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_mobile_2.4" profile="mobile">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>172</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>172</total_tcn>\r
- <pkg_name>mobile/tct-connection-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>255</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>255</total_tcn>\r
- <pkg_name>mobile/tct-webkit2-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-privilege-info-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-adaptor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>98</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>98</total_tcn>\r
- <pkg_name>mobile/tct-dali-adaptor-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-wav-player-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-native-common-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_viewer_evas-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>mobile/tct-widget_viewer_evas-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>mobile/tct-capi-ui-inputmethod-manager-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-permission-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>mobile/tct-filesystem-permission-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messages-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-messages-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>mobile/tct-badge-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <!--\r
- <suite name="tct-wifi-direct-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>140</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>140</total_tcn>\r
- <pkg_name>mobile/tct-wifi-direct-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- -->\r
- <suite name="tct-widget_viewer_evas-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-widget_viewer_evas-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-capi-message-port-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-settings-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-system-settings-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messages-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>mobile/tct-messages-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-tool-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>109</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>109</total_tcn>\r
- <pkg_name>mobile/tct-capi-media-tool-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>mobile/tct-push-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-sensor-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-appcore-agent-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-radio-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>mobile/tct-radio-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>129</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>129</total_tcn>\r
- <pkg_name>mobile/tct-location-manager-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>348</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>348</total_tcn>\r
- <pkg_name>mobile/tct-camera-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-thumbnail-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-thumbnail-util-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cairo-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/tct-cairo-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-tbm-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-libstorage-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-accounts-svc-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>mobile/tct-accounts-svc-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>159</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>159</total_tcn>\r
- <pkg_name>mobile/tct-telephony-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-phonenumber-utils-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-phonenumber-utils-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-native-common-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-vision-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>mobile/tct-capi-media-vision-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-base-utils-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>288</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>288</total_tcn>\r
- <pkg_name>mobile/tct-base-utils-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-widget-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-appcore-widget-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-editor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-metadata-editor-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>mobile/tct-mediacodec-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-service2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>58</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>58</total_tcn>\r
- <pkg_name>mobile/tct-calendar-service2-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-maps-service-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>296</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>296</total_tcn>\r
- <pkg_name>mobile/tct-capi-maps-service-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-mediacodec-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>103</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>103</total_tcn>\r
- <pkg_name>mobile/tct-key-manager-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>475</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>475</total_tcn>\r
- <pkg_name>mobile/tct-media-content-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-opengl-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>21</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>21</total_tcn>\r
- <pkg_name>mobile/tct-sound-manager-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tone-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-tone-player-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-controller-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>mobile/tct-media-controller-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-service-adaptor-client-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>127</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>127</total_tcn>\r
- <pkg_name>mobile/tct-service-adaptor-client-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-widget-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-appcore-widget-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-elm-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>mobile/tct-voice-control-elm-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-efl-ext-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-metadata-extractor-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>mobile/tct-camera-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-motion-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/tct-motion-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screen-mirroring-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-screen-mirroring-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-video-util-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>mobile/tct-push-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-dlog-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geofence-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>mobile/tct-geofence-manager-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>mobile/tct-app-manager-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>72</total_tcn>\r
- <pkg_name>mobile/tct-audio-io-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>96</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>96</total_tcn>\r
- <pkg_name>mobile/tct-package-manager-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-maps-service-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>57</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>57</total_tcn>\r
- <pkg_name>mobile/tct-capi-maps-service-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-player-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-core-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>864</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>864</total_tcn>\r
- <pkg_name>mobile/tct-dali-core-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sync-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>mobile/tct-sync-manager-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-efl-util-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/tct-efl-ext-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>202</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>202</total_tcn>\r
- <pkg_name>mobile/tct-wifi-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>60</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>mobile/tct-sensor-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-util-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-video-util-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>53</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>mobile/tct-bundle-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-bundle-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>31</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>mobile/tct-libstorage-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_service-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>46</total_tcn>\r
- <pkg_name>mobile/tct-widget_service-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>mobile/tct-mime-type-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-url-download-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>27</total_tcn>\r
- <pkg_name>mobile/tct-url-download-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>99</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>99</total_tcn>\r
- <pkg_name>mobile/tct-capi-ui-inputmethod-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-eom-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>mobile/tct-eom-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contacts-service2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>198</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>198</total_tcn>\r
- <pkg_name>mobile/tct-contacts-service2-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>mobile/tct-application-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-camera-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>191</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>191</total_tcn>\r
- <pkg_name>mobile/tct-player-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-minicontrol-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>mobile/tct-minicontrol-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-elm-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>mobile/tct-voice-control-elm-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>mobile/tct-appcore-agent-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>mobile/tct-system-info-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-device-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-context-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>mobile/tct-context-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>269</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>269</total_tcn>\r
- <pkg_name>mobile/tct-application-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-radio-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>mobile/tct-radio-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>mobile/tct-data-control-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-email-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/tct-email-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <!--\r
- <suite name="tct-wifi-direct-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>mobile/tct-wifi-direct-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- -->\r
- <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>104</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>104</total_tcn>\r
- <pkg_name>mobile/tct-tts-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-settings-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>mobile/tct-system-settings-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/tct-metadata-extractor-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>59</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>59</total_tcn>\r
- <pkg_name>mobile/tct-device-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>52</total_tcn>\r
- <pkg_name>mobile/tct-capi-message-port-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>43</total_tcn>\r
- <pkg_name>mobile/tct-video-util-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-service-adaptor-client-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/tct-service-adaptor-client-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-sound-manager-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cairo-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-cairo-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>95</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>95</total_tcn>\r
- <pkg_name>mobile/tct-image-util-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-service2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>149</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>149</total_tcn>\r
- <pkg_name>mobile/tct-calendar-service2-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-capi-ui-inputmethod-manager-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-shortcut-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-shortcut-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geofence-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>134</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>134</total_tcn>\r
- <pkg_name>mobile/tct-geofence-manager-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-media-key-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-trace-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-trace-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>157</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>157</total_tcn>\r
- <pkg_name>mobile/tct-nfc-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-dlog-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-platform-permission-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>mobile/tct-platform-permission-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-editor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>mobile/tct-metadata-editor-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>mobile/tct-runtime-info-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage64-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>31</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>mobile/tct-libstorage64-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/tct-efl-util-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-toolkit-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>231</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>231</total_tcn>\r
- <pkg_name>mobile/tct-dali-toolkit-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-minicontrol-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-minicontrol-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-audio-io-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>mobile/tct-device-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-base-utils-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>885</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>885</total_tcn>\r
- <pkg_name>mobile/tct-base-utils-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-oauth2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-oauth2-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-toolkit-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>414</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>414</total_tcn>\r
- <pkg_name>mobile/tct-dali-toolkit-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-recorder-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-mediacodec-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>54</total_tcn>\r
- <pkg_name>mobile/tct-player-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-controller-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>mobile/tct-media-controller-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-mime-type-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-system-info-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-thumbnail-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-thumbnail-util-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>mobile/tct-key-manager-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-connection-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>mobile/tct-runtime-info-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-smartcard-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-smartcard-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-tts-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-badge-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-smartcard-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/tct-smartcard-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>60</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>mobile/tct-wifi-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-oauth2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>mobile/tct-oauth2-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sync-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-sync-manager-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-accounts-svc-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>147</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>147</total_tcn>\r
- <pkg_name>mobile/tct-accounts-svc-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <!--\r
- <suite name="tct-wifi-direct-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-wifi-direct-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- -->\r
- <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>mobile/tct-libstorage-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-url-download-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>121</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>121</total_tcn>\r
- <pkg_name>mobile/tct-url-download-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>88</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>88</total_tcn>\r
- <pkg_name>mobile/tct-stt-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-stt-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>151</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>151</total_tcn>\r
- <pkg_name>mobile/tct-recorder-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-attach-panel-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/tct-attach-panel-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>mobile/tct-voice-control-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-context-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>29</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>29</total_tcn>\r
- <pkg_name>mobile/tct-context-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>126</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>126</total_tcn>\r
- <pkg_name>mobile/tct-runtime-info-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>338</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>338</total_tcn>\r
- <pkg_name>mobile/tct-bluetooth-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-core-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>1600</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1600</total_tcn>\r
- <pkg_name>mobile/tct-dali-core-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-email-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-email-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>44</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>44</total_tcn>\r
- <pkg_name>mobile/tct-capi-media-tool-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-location-manager-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>mobile/tct-package-manager-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-telephony-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-adaptor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>mobile/tct-dali-adaptor-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>181</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>181</total_tcn>\r
- <pkg_name>mobile/tct-media-content-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>mobile/tct-tbm-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libfeedback-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>mobile/tct-libfeedback-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>103</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>103</total_tcn>\r
- <pkg_name>mobile/tct-webkit2-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>229</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>229</total_tcn>\r
- <pkg_name>mobile/tct-notification-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>mobile/tct-sound-manager-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-notification-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>97</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>97</total_tcn>\r
- <pkg_name>mobile/tct-voice-control-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-eom-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>42</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>mobile/tct-eom-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_service-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-widget_service-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contacts-service2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>77</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>77</total_tcn>\r
- <pkg_name>mobile/tct-contacts-service2-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>mobile/tct-telephony-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-shortcut-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/tct-shortcut-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>mobile/tct-audio-io-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>41</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>mobile/tct-location-manager-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tone-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-tone-player-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>121</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>121</total_tcn>\r
- <pkg_name>mobile/tct-app-manager-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screen-mirroring-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>mobile/tct-screen-mirroring-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-image-util-native-ctc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-vision-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-media-vision-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-privilege-info-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-image-util-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>mobile/tct-connection-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>mobile/tct-nfc-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ttrace-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-ttrace-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-media-key-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-wav-player-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libfeedback-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-libfeedback-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-phonenumber-utils-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-phonenumber-utils-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-motion-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-motion-native-utc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/tct-bluetooth-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-system-info-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>mobile/tct-sensor-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-data-control-native-itc-2.4.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_mobile_3.0" profile="mobile">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-dali-adaptor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>96</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>96</total_tcn>\r
- <pkg_name>mobile/tct-dali-adaptor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mtp-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-mtp-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-wav-player-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messages-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-messages-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>mobile/tct-badge-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediademuxer-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>mobile/tct-mediademuxer-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-settings-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-system-settings-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-thumbnail-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-thumbnail-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-tbm-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-accounts-svc-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>mobile/tct-accounts-svc-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>159</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>159</total_tcn>\r
- <pkg_name>mobile/tct-telephony-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-vision-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>mobile/tct-capi-media-vision-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-phonenumber-utils-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>mobile/tct-phonenumber-utils-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fido-client-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/tct-fido-client-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-widget-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-appcore-widget-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-base-utils-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>288</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>288</total_tcn>\r
- <pkg_name>mobile/tct-base-utils-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>mobile/tct-mediacodec-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-service2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>58</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>58</total_tcn>\r
- <pkg_name>mobile/tct-calendar-service2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-streamer-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>mobile/tct-capi-media-streamer-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>526</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>526</total_tcn>\r
- <pkg_name>mobile/tct-media-content-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>mobile/tct-sound-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-opengl-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-controller-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>mobile/tct-media-controller-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tone-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-tone-player-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-elm-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>mobile/tct-voice-control-elm-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-widget-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-appcore-widget-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screen-mirroring-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-screen-mirroring-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-motion-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/tct-motion-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>mobile/tct-camera-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-video-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>mobile/tct-push-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geofence-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>mobile/tct-geofence-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>42</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>mobile/tct-app-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>94</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>94</total_tcn>\r
- <pkg_name>mobile/tct-audio-io-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-player-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-core-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>864</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>864</total_tcn>\r
- <pkg_name>mobile/tct-dali-core-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediatool-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>133</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>133</total_tcn>\r
- <pkg_name>mobile/tct-mediatool-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sync-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>mobile/tct-sync-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-efl-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>mobile/tct-efl-ext-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>208</total_tcn>\r
- <pkg_name>mobile/tct-wifi-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-bundle-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>53</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>mobile/tct-bundle-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>31</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>mobile/tct-libstorage-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-url-download-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>27</total_tcn>\r
- <pkg_name>mobile/tct-url-download-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>99</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>99</total_tcn>\r
- <pkg_name>mobile/tct-capi-ui-inputmethod-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>mobile/tct-application-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contacts-service2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>200</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>200</total_tcn>\r
- <pkg_name>mobile/tct-contacts-service2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-minicontrol-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>mobile/tct-minicontrol-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>191</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>191</total_tcn>\r
- <pkg_name>mobile/tct-player-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-elm-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>mobile/tct-voice-control-elm-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>mobile/tct-appcore-agent-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-device-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>mobile/tct-system-info-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>268</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>268</total_tcn>\r
- <pkg_name>mobile/tct-application-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>mobile/tct-data-control-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-direct-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>mobile/tct-wifi-direct-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-email-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/tct-email-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>104</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>104</total_tcn>\r
- <pkg_name>mobile/tct-tts-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>59</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>59</total_tcn>\r
- <pkg_name>mobile/tct-device-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-sound-manager-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>215</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>215</total_tcn>\r
- <pkg_name>mobile/tct-image-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>157</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>157</total_tcn>\r
- <pkg_name>mobile/tct-nfc-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/tct-runtime-info-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-editor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>mobile/tct-metadata-editor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-toolkit-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>238</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>238</total_tcn>\r
- <pkg_name>mobile/tct-dali-toolkit-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/tct-efl-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage64-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>31</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>mobile/tct-libstorage64-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>mobile/tct-device-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-recorder-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-toolkit-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>435</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>435</total_tcn>\r
- <pkg_name>mobile/tct-dali-toolkit-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-mediacodec-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>mobile/tct-player-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-mime-type-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-tts-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-badge-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>60</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>mobile/tct-wifi-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-iotcon-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>346</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>346</total_tcn>\r
- <pkg_name>mobile/tct-iotcon-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sync-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-sync-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>mobile/tct-libstorage-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-url-download-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>121</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>121</total_tcn>\r
- <pkg_name>mobile/tct-url-download-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-stt-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>88</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>88</total_tcn>\r
- <pkg_name>mobile/tct-stt-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>151</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>151</total_tcn>\r
- <pkg_name>mobile/tct-recorder-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-context-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>29</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>29</total_tcn>\r
- <pkg_name>mobile/tct-context-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediastreamrecorder-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>29</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>29</total_tcn>\r
- <pkg_name>mobile/tct-mediastreamrecorder-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>126</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>126</total_tcn>\r
- <pkg_name>mobile/tct-runtime-info-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>346</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>346</total_tcn>\r
- <pkg_name>mobile/tct-bluetooth-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-location-manager-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-telephony-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-adaptor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>mobile/tct-dali-adaptor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>mobile/tct-tbm-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>200</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>200</total_tcn>\r
- <pkg_name>mobile/tct-media-content-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libfeedback-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>mobile/tct-libfeedback-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-streamer-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-capi-media-streamer-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-notification-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contacts-service2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>mobile/tct-contacts-service2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_service-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-widget_service-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>43</total_tcn>\r
- <pkg_name>mobile/tct-location-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-image-util-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-service-adaptor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/tct-service-adaptor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-privilege-info-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-vision-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>mobile/tct-media-vision-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vpn-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-vpn-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-image-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>mobile/tct-connection-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>mobile/tct-nfc-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ttrace-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-ttrace-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-phonenumber-utils-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-phonenumber-utils-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/tct-bluetooth-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-motion-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-motion-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-system-info-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>172</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>172</total_tcn>\r
- <pkg_name>mobile/tct-connection-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>249</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>249</total_tcn>\r
- <pkg_name>mobile/tct-webkit2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-privilege-info-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-native-common-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_viewer_evas-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>mobile/tct-widget_viewer_evas-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-permission-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>mobile/tct-filesystem-permission-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>mobile/tct-capi-ui-inputmethod-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-direct-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>140</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>140</total_tcn>\r
- <pkg_name>mobile/tct-wifi-direct-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_viewer_evas-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-widget_viewer_evas-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-capi-message-port-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messages-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>mobile/tct-messages-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>mobile/tct-push-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-sensor-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-appcore-agent-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>143</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>143</total_tcn>\r
- <pkg_name>mobile/tct-location-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>351</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>351</total_tcn>\r
- <pkg_name>mobile/tct-camera-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cairo-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-cairo-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-streamrecorder-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>125</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>125</total_tcn>\r
- <pkg_name>mobile/tct-streamrecorder-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-libstorage-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-native-common-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-editor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-metadata-editor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-maps-service-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>339</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>339</total_tcn>\r
- <pkg_name>mobile/tct-capi-maps-service-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-mediacodec-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>127</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>127</total_tcn>\r
- <pkg_name>mobile/tct-key-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-efl-ext-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-service-adaptor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>125</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>125</total_tcn>\r
- <pkg_name>mobile/tct-service-adaptor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-metadata-extractor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-dlog-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-maps-service-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>70</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>70</total_tcn>\r
- <pkg_name>mobile/tct-capi-maps-service-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>92</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>92</total_tcn>\r
- <pkg_name>mobile/tct-package-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>mobile/tct-sensor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-mediamuxer-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-capi-mediamuxer-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-util-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-video-util-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_service-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>46</total_tcn>\r
- <pkg_name>mobile/tct-widget_service-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>mobile/tct-mime-type-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-eom-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>mobile/tct-eom-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-camera-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-context-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>mobile/tct-context-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-radio-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>mobile/tct-radio-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-settings-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>mobile/tct-system-settings-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/tct-metadata-extractor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>53</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>mobile/tct-capi-message-port-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>43</total_tcn>\r
- <pkg_name>mobile/tct-video-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cairo-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-cairo-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-service2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>149</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>149</total_tcn>\r
- <pkg_name>mobile/tct-calendar-service2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-capi-ui-inputmethod-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-shortcut-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-shortcut-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-media-key-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geofence-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>139</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>139</total_tcn>\r
- <pkg_name>mobile/tct-geofence-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-trace-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-trace-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-platform-permission-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>54</total_tcn>\r
- <pkg_name>mobile/tct-platform-permission-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-dlog-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-minicontrol-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-minicontrol-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-audio-io-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-oauth2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-oauth2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-base-utils-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>884</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>884</total_tcn>\r
- <pkg_name>mobile/tct-base-utils-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-controller-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>mobile/tct-media-controller-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-system-info-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>mobile/tct-key-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-thumbnail-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>mobile/tct-thumbnail-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-connection-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>mobile/tct-runtime-info-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-smartcard-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-smartcard-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-smartcard-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/tct-smartcard-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mtp-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>mobile/tct-mtp-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fido-client-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-fido-client-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-oauth2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>mobile/tct-oauth2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-direct-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>mobile/tct-wifi-direct-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-accounts-svc-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>147</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>147</total_tcn>\r
- <pkg_name>mobile/tct-accounts-svc-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-attach-panel-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>mobile/tct-attach-panel-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>mobile/tct-voice-control-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-mediademuxer-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>mobile/tct-capi-mediademuxer-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-core-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>1645</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1645</total_tcn>\r
- <pkg_name>mobile/tct-dali-core-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>mobile/tct-package-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-email-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>mobile/tct-email-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>51</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>51</total_tcn>\r
- <pkg_name>mobile/tct-capi-media-tool-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>103</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>103</total_tcn>\r
- <pkg_name>mobile/tct-webkit2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>229</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>229</total_tcn>\r
- <pkg_name>mobile/tct-notification-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>101</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>101</total_tcn>\r
- <pkg_name>mobile/tct-sound-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>97</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>97</total_tcn>\r
- <pkg_name>mobile/tct-voice-control-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>mobile/tct-telephony-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-eom-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>42</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>mobile/tct-eom-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>mobile/tct-audio-io-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-shortcut-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>mobile/tct-shortcut-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tone-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-tone-player-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>130</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>130</total_tcn>\r
- <pkg_name>mobile/tct-app-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screen-mirroring-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>mobile/tct-screen-mirroring-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediamuxer-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-mediamuxer-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-media-key-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>mobile/tct-wav-player-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libfeedback-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>mobile/tct-libfeedback-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>mobile/tct-sensor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-data-control-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<ns3:testplan name="Native_Full_tv_2.4" profile="tv" xmlns="" xmlns:ns3="http://www.example.org/plan/">
- <execute_type>All</execute_type>
- <suite launcher="WRTLauncher" name="tct-capi-media-tool-native-utc">
- <auto_tcn>110</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>110</total_tcn>
- <pkg_name>tv/tct-capi-media-tool-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-appcore-agent-native-itc">
- <auto_tcn>2</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>2</total_tcn>
- <pkg_name>tv/tct-appcore-agent-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-libstorage-native-ctc">
- <auto_tcn>2</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>2</total_tcn>
- <pkg_name>tv/tct-libstorage-native-ctc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-metadata-extractor-native-itc">
- <auto_tcn>8</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>8</total_tcn>
- <pkg_name>tv/tct-metadata-extractor-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-thumbnail-util-native-itc">
- <auto_tcn>6</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>6</total_tcn>
- <pkg_name>tv/tct-thumbnail-util-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-media-content-native-itc">
- <auto_tcn>181</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>181</total_tcn>
- <pkg_name>tv/tct-media-content-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-package-manager-native-itc">
- <auto_tcn>38</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>38</total_tcn>
- <pkg_name>tv/tct-package-manager-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-bundle-native-itc">
- <auto_tcn>9</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>9</total_tcn>
- <pkg_name>tv/tct-bundle-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-system-info-native-ctc">
- <auto_tcn>4</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>4</total_tcn>
- <pkg_name>tv/tct-system-info-native-ctc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-mime-type-native-utc">
- <auto_tcn>15</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>15</total_tcn>
- <pkg_name>tv/tct-mime-type-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-dlog-native-utc">
- <auto_tcn>4</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>4</total_tcn>
- <pkg_name>tv/tct-dlog-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-media-content-native-utc">
- <auto_tcn>475</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>475</total_tcn>
- <pkg_name>tv/tct-media-content-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-metadata-editor-native-utc">
- <auto_tcn>18</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>18</total_tcn>
- <pkg_name>tv/tct-metadata-editor-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-audio-io-native-utc">
- <auto_tcn>72</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>72</total_tcn>
- <pkg_name>tv/tct-audio-io-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-media-controller-native-utc">
- <auto_tcn>85</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>85</total_tcn>
- <pkg_name>tv/tct-media-controller-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-opengl-native-ctc">
- <auto_tcn>3</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>3</total_tcn>
- <pkg_name>tv/tct-opengl-native-ctc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-capi-message-port-native-utc">
- <auto_tcn>52</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>52</total_tcn>
- <pkg_name>tv/tct-capi-message-port-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-wav-player-native-itc">
- <auto_tcn>1</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>1</total_tcn>
- <pkg_name>tv/tct-wav-player-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-package-manager-native-utc">
- <auto_tcn>102</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>102</total_tcn>
- <pkg_name>tv/tct-package-manager-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-key-manager-native-utc">
- <auto_tcn>103</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>103</total_tcn>
- <pkg_name>tv/tct-key-manager-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tone-player-native-utc">
- <auto_tcn>4</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>4</total_tcn>
- <pkg_name>tv/tct-tone-player-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-bluetooth-native-utc">
- <auto_tcn>169</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>169</total_tcn>
- <pkg_name>tv/tct-bluetooth-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-media-key-native-itc">
- <auto_tcn>1</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>1</total_tcn>
- <pkg_name>tv/tct-media-key-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-app-manager-native-utc">
- <auto_tcn>121</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>121</total_tcn>
- <pkg_name>tv/tct-app-manager-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-bundle-native-utc">
- <auto_tcn>53</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>53</total_tcn>
- <pkg_name>tv/tct-bundle-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-mime-type-native-itc">
- <auto_tcn>2</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>2</total_tcn>
- <pkg_name>tv/tct-mime-type-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-webkit2-native-utc">
- <auto_tcn>184</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>184</total_tcn>
- <pkg_name>tv/tct-webkit2-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-image-util-native-ctc">
- <auto_tcn>2</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>2</total_tcn>
- <pkg_name>tv/tct-image-util-native-ctc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-libstorage64-native-utc">
- <auto_tcn>31</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>31</total_tcn>
- <pkg_name>tv/tct-libstorage64-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tts-native-itc">
- <auto_tcn>14</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>14</total_tcn>
- <pkg_name>tv/tct-tts-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-wav-player-native-utc">
- <auto_tcn>9</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>9</total_tcn>
- <pkg_name>tv/tct-wav-player-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tts-native-utc">
- <auto_tcn>104</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>104</total_tcn>
- <pkg_name>tv/tct-tts-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-screen-mirroring-native-itc">
- <auto_tcn>5</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>5</total_tcn>
- <pkg_name>tv/tct-screen-mirroring-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-screen-mirroring-native-utc">
- <auto_tcn>33</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>33</total_tcn>
- <pkg_name>tv/tct-screen-mirroring-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tbm-native-utc">
- <auto_tcn>17</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>17</total_tcn>
- <pkg_name>tv/tct-tbm-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tone-player-native-itc">
- <auto_tcn>1</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>1</total_tcn>
- <pkg_name>tv/tct-tone-player-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-system-info-native-utc">
- <auto_tcn>12</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>12</total_tcn>
- <pkg_name>tv/tct-system-info-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-thumbnail-util-native-utc">
- <auto_tcn>14</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>14</total_tcn>
- <pkg_name>tv/tct-thumbnail-util-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-dlog-native-itc">
- <auto_tcn>2</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>2</total_tcn>
- <pkg_name>tv/tct-dlog-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-voice-control-native-utc">
- <auto_tcn>74</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>74</total_tcn>
- <pkg_name>tv/tct-voice-control-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-bluetooth-native-itc">
- <auto_tcn>23</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>23</total_tcn>
- <pkg_name>tv/tct-bluetooth-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-native-common-native-utc">
- <auto_tcn>5</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>5</total_tcn>
- <pkg_name>tv/tct-native-common-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-application-native-utc">
- <auto_tcn>269</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>269</total_tcn>
- <pkg_name>tv/tct-application-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-wifi-native-utc">
- <auto_tcn>154</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>154</total_tcn>
- <pkg_name>tv/tct-wifi-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-metadata-extractor-native-utc">
- <auto_tcn>23</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>23</total_tcn>
- <pkg_name>tv/tct-metadata-extractor-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-sound-manager-native-itc">
- <auto_tcn>21</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>21</total_tcn>
- <pkg_name>tv/tct-sound-manager-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-runtime-info-native-ctc">
- <auto_tcn>15</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>15</total_tcn>
- <pkg_name>tv/tct-runtime-info-native-ctc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-camera-native-utc">
- <auto_tcn>323</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>323</total_tcn>
- <pkg_name>tv/tct-camera-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-voice-control-elm-native-utc">
- <auto_tcn>72</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>72</total_tcn>
- <pkg_name>tv/tct-voice-control-elm-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-url-download-native-utc">
- <auto_tcn>121</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>121</total_tcn>
- <pkg_name>tv/tct-url-download-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-camera-native-itc">
- <auto_tcn>78</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>78</total_tcn>
- <pkg_name>tv/tct-camera-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-runtime-info-native-utc">
- <auto_tcn>126</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>126</total_tcn>
- <pkg_name>tv/tct-runtime-info-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-app-manager-native-itc">
- <auto_tcn>38</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>38</total_tcn>
- <pkg_name>tv/tct-app-manager-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-appcore-agent-native-utc">
- <auto_tcn>11</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>11</total_tcn>
- <pkg_name>tv/tct-appcore-agent-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-runtime-info-native-itc">
- <auto_tcn>7</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>7</total_tcn>
- <pkg_name>tv/tct-runtime-info-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-connection-native-utc">
- <auto_tcn>172</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>172</total_tcn>
- <pkg_name>tv/tct-connection-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-image-util-native-utc">
- <auto_tcn>95</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>95</total_tcn>
- <pkg_name>tv/tct-image-util-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-application-native-itc">
- <auto_tcn>55</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>55</total_tcn>
- <pkg_name>tv/tct-application-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-recorder-native-utc">
- <auto_tcn>114</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>114</total_tcn>
- <pkg_name>tv/tct-recorder-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-native-common-native-itc">
- <auto_tcn>2</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>2</total_tcn>
- <pkg_name>tv/tct-native-common-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-media-key-native-utc">
- <auto_tcn>3</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>3</total_tcn>
- <pkg_name>tv/tct-media-key-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-data-control-native-utc">
- <auto_tcn>89</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>89</total_tcn>
- <pkg_name>tv/tct-data-control-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-audio-io-native-itc">
- <auto_tcn>26</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>26</total_tcn>
- <pkg_name>tv/tct-audio-io-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-metadata-editor-native-itc">
- <auto_tcn>7</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>7</total_tcn>
- <pkg_name>tv/tct-metadata-editor-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-sound-manager-native-ctc">
- <auto_tcn>1</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>1</total_tcn>
- <pkg_name>tv/tct-sound-manager-native-ctc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-connection-native-ctc">
- <auto_tcn>1</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>1</total_tcn>
- <pkg_name>tv/tct-connection-native-ctc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-libstorage-native-itc">
- <auto_tcn>10</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>10</total_tcn>
- <pkg_name>tv/tct-libstorage-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-webkit2-native-itc">
- <auto_tcn>82</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>82</total_tcn>
- <pkg_name>tv/tct-webkit2-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-key-manager-native-itc">
- <auto_tcn>34</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>34</total_tcn>
- <pkg_name>tv/tct-key-manager-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-voice-control-native-itc">
- <auto_tcn>22</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>22</total_tcn>
- <pkg_name>tv/tct-voice-control-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-system-info-native-itc">
- <auto_tcn>4</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>4</total_tcn>
- <pkg_name>tv/tct-system-info-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-capi-media-tool-native-itc">
- <auto_tcn>44</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>44</total_tcn>
- <pkg_name>tv/tct-capi-media-tool-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-libstorage-native-utc">
- <auto_tcn>31</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>31</total_tcn>
- <pkg_name>tv/tct-libstorage-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-libfeedback-native-utc">
- <auto_tcn>13</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>13</total_tcn>
- <pkg_name>tv/tct-libfeedback-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-efl-util-native-utc">
- <auto_tcn>27</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>27</total_tcn>
- <pkg_name>tv/tct-efl-util-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-trace-native-utc">
- <auto_tcn>5</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>5</total_tcn>
- <pkg_name>tv/tct-trace-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-libfeedback-native-itc">
- <auto_tcn>4</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>4</total_tcn>
- <pkg_name>tv/tct-libfeedback-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-service-adaptor-client-native-itc">
- <auto_tcn>24</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>24</total_tcn>
- <pkg_name>tv/tct-service-adaptor-client-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-connection-native-itc">
- <auto_tcn>61</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>61</total_tcn>
- <pkg_name>tv/tct-connection-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-capi-message-port-native-itc">
- <auto_tcn>6</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>6</total_tcn>
- <pkg_name>tv/tct-capi-message-port-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-image-util-native-itc">
- <auto_tcn>14</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>14</total_tcn>
- <pkg_name>tv/tct-image-util-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-audio-io-native-ctc">
- <auto_tcn>1</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>1</total_tcn>
- <pkg_name>tv/tct-audio-io-native-ctc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-media-controller-native-itc">
- <auto_tcn>28</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>28</total_tcn>
- <pkg_name>tv/tct-media-controller-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tbm-native-itc">
- <auto_tcn>7</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>7</total_tcn>
- <pkg_name>tv/tct-tbm-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-recorder-native-itc">
- <auto_tcn>33</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>33</total_tcn>
- <pkg_name>tv/tct-recorder-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-sound-manager-native-utc">
- <auto_tcn>71</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>71</total_tcn>
- <pkg_name>tv/tct-sound-manager-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-service-adaptor-client-native-utc">
- <auto_tcn>127</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>127</total_tcn>
- <pkg_name>tv/tct-service-adaptor-client-native-utc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-efl-util-native-itc">
- <auto_tcn>3</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>3</total_tcn>
- <pkg_name>tv/tct-efl-util-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-url-download-native-itc">
- <auto_tcn>27</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>27</total_tcn>
- <pkg_name>tv/tct-url-download-native-itc-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-data-control-native-itc">
- <auto_tcn>33</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>33</total_tcn>
- <pkg_name>tv/tct-data-control-native-itc-2.4.zip</pkg_name>
- </suite>
-</ns3:testplan>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_tv_3.0" profile="tv">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>172</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>172</total_tcn>\r
- <pkg_name>tv/tct-connection-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>206</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>206</total_tcn>\r
- <pkg_name>tv/tct-webkit2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>tv/tct-privilege-info-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-adaptor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>96</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>96</total_tcn>\r
- <pkg_name>tv/tct-dali-adaptor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mtp-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>tv/tct-mtp-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-native-common-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-wav-player-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>tv/tct-capi-ui-inputmethod-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-direct-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>140</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>140</total_tcn>\r
- <pkg_name>tv/tct-wifi-direct-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediademuxer-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>tv/tct-mediademuxer-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>tv/tct-capi-message-port-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>tv/tct-push-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-appcore-agent-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>348</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>348</total_tcn>\r
- <pkg_name>tv/tct-camera-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-thumbnail-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>tv/tct-thumbnail-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>tv/tct-tbm-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-libstorage-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-accounts-svc-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>tv/tct-accounts-svc-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-phonenumber-utils-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>tv/tct-phonenumber-utils-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>tv/tct-native-common-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-editor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>tv/tct-metadata-editor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>tv/tct-mediacodec-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-service2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>58</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>58</total_tcn>\r
- <pkg_name>tv/tct-calendar-service2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>tv/tct-mediacodec-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-streamer-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>tv/tct-capi-media-streamer-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>127</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>127</total_tcn>\r
- <pkg_name>tv/tct-key-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>526</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>526</total_tcn>\r
- <pkg_name>tv/tct-media-content-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>tv/tct-opengl-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>tv/tct-sound-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-controller-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>tv/tct-media-controller-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>tv/tct-efl-ext-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-elm-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>tv/tct-voice-control-elm-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>tv/tct-metadata-extractor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>tv/tct-camera-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screen-mirroring-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>tv/tct-screen-mirroring-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>tv/tct-video-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>tv/tct-push-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>tv/tct-dlog-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>42</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>tv/tct-app-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>94</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>94</total_tcn>\r
- <pkg_name>tv/tct-audio-io-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>92</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>92</total_tcn>\r
- <pkg_name>tv/tct-package-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>tv/tct-player-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediatool-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>133</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>133</total_tcn>\r
- <pkg_name>tv/tct-mediatool-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-core-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>864</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>864</total_tcn>\r
- <pkg_name>tv/tct-dali-core-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sync-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>tv/tct-sync-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>tv/tct-efl-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>tv/tct-efl-ext-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>208</total_tcn>\r
- <pkg_name>tv/tct-wifi-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-mediamuxer-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>tv/tct-capi-mediamuxer-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-util-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>tv/tct-video-util-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>tv/tct-bundle-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>53</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>tv/tct-bundle-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>31</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>tv/tct-libstorage-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>tv/tct-mime-type-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-url-download-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>27</total_tcn>\r
- <pkg_name>tv/tct-url-download-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>99</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>99</total_tcn>\r
- <pkg_name>tv/tct-capi-ui-inputmethod-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>tv/tct-application-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contacts-service2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>198</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>198</total_tcn>\r
- <pkg_name>tv/tct-contacts-service2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>191</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>191</total_tcn>\r
- <pkg_name>tv/tct-player-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-elm-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>tv/tct-voice-control-elm-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>tv/tct-appcore-agent-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>tv/tct-system-info-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-context-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>tv/tct-context-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>268</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>268</total_tcn>\r
- <pkg_name>tv/tct-application-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>tv/tct-data-control-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-direct-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>tv/tct-wifi-direct-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>104</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>104</total_tcn>\r
- <pkg_name>tv/tct-tts-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>tv/tct-metadata-extractor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>52</total_tcn>\r
- <pkg_name>tv/tct-capi-message-port-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>43</total_tcn>\r
- <pkg_name>tv/tct-video-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>tv/tct-sound-manager-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-service2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>149</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>149</total_tcn>\r
- <pkg_name>tv/tct-calendar-service2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>206</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>206</total_tcn>\r
- <pkg_name>tv/tct-image-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-capi-ui-inputmethod-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>tv/tct-media-key-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-editor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>tv/tct-metadata-editor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-dlog-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>tv/tct-runtime-info-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-toolkit-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>238</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>238</total_tcn>\r
- <pkg_name>tv/tct-dali-toolkit-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>tv/tct-efl-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>tv/tct-audio-io-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-oauth2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>tv/tct-oauth2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>tv/tct-recorder-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-toolkit-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>435</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>435</total_tcn>\r
- <pkg_name>tv/tct-dali-toolkit-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>tv/tct-mediacodec-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>47</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>47</total_tcn>\r
- <pkg_name>tv/tct-player-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-mime-type-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-controller-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>tv/tct-media-controller-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>tv/tct-system-info-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-thumbnail-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>tv/tct-thumbnail-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>tv/tct-key-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>tv/tct-connection-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>tv/tct-runtime-info-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>tv/tct-tts-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>tv/tct-wifi-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-oauth2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>tv/tct-oauth2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sync-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>tv/tct-sync-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>tv/tct-libstorage-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-direct-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>tv/tct-wifi-direct-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-accounts-svc-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>144</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>144</total_tcn>\r
- <pkg_name>tv/tct-accounts-svc-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-url-download-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>121</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>121</total_tcn>\r
- <pkg_name>tv/tct-url-download-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>88</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>88</total_tcn>\r
- <pkg_name>tv/tct-stt-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>tv/tct-stt-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>151</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>151</total_tcn>\r
- <pkg_name>tv/tct-recorder-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>tv/tct-voice-control-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-context-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>29</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>29</total_tcn>\r
- <pkg_name>tv/tct-context-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>126</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>126</total_tcn>\r
- <pkg_name>tv/tct-runtime-info-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-mediademuxer-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>tv/tct-capi-mediademuxer-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>169</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>169</total_tcn>\r
- <pkg_name>tv/tct-bluetooth-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-core-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>1645</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1645</total_tcn>\r
- <pkg_name>tv/tct-dali-core-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>51</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>51</total_tcn>\r
- <pkg_name>tv/tct-capi-media-tool-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>tv/tct-package-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-adaptor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>tv/tct-dali-adaptor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>200</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>200</total_tcn>\r
- <pkg_name>tv/tct-media-content-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>tv/tct-tbm-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>86</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>86</total_tcn>\r
- <pkg_name>tv/tct-webkit2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-streamer-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>tv/tct-capi-media-streamer-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>101</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>101</total_tcn>\r
- <pkg_name>tv/tct-sound-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>97</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>97</total_tcn>\r
- <pkg_name>tv/tct-voice-control-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contacts-service2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>tv/tct-contacts-service2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>tv/tct-audio-io-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>121</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>121</total_tcn>\r
- <pkg_name>tv/tct-app-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screen-mirroring-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>tv/tct-screen-mirroring-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-image-util-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>tv/tct-privilege-info-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>tv/tct-image-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediamuxer-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>tv/tct-mediamuxer-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>tv/tct-media-key-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>tv/tct-wav-player-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-phonenumber-utils-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>tv/tct-phonenumber-utils-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>tv/tct-bluetooth-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>tv/tct-system-info-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>tv/tct-data-control-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_wearable_2.3.2" profile="wearable">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>162</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>162</total_tcn>\r
- <pkg_name>wearable/tct-connection-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>175</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>175</total_tcn>\r
- <pkg_name>wearable/tct-webkit2-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-privilege-info-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-native-common-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-wav-player-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messages-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>wearable/tct-messages-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-permission-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>wearable/tct-filesystem-permission-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-badge-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-capi-message-port-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-settings-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-system-settings-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messages-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>wearable/tct-messages-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>wearable/tct-push-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-tool-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>94</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>94</total_tcn>\r
- <pkg_name>wearable/tct-capi-media-tool-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget-viewer-evas-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>50</total_tcn>\r
- <pkg_name>wearable/tct-widget-viewer-evas-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>wearable/tct-sensor-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-appcore-agent-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-watch-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>wearable/tct-appcore-watch-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-radio-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>wearable/tct-radio-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>194</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>194</total_tcn>\r
- <pkg_name>wearable/tct-location-manager-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>320</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>320</total_tcn>\r
- <pkg_name>wearable/tct-camera-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cairo-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>wearable/tct-cairo-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>wearable/tct-tbm-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-libstorage-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>67</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>67</total_tcn>\r
- <pkg_name>wearable/tct-telephony-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>wearable/tct-native-common-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-widget-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>wearable/tct-appcore-widget-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-base-utils-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>284</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>284</total_tcn>\r
- <pkg_name>wearable/tct-base-utils-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-context-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-context-manager-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>39</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>39</total_tcn>\r
- <pkg_name>wearable/tct-mediacodec-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>wearable/tct-mediacodec-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>47</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>47</total_tcn>\r
- <pkg_name>wearable/tct-key-manager-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>418</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>418</total_tcn>\r
- <pkg_name>wearable/tct-media-content-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>wearable/tct-opengl-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>wearable/tct-sound-manager-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tone-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-tone-player-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>wearable/tct-efl-ext-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-widget-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>wearable/tct-appcore-widget-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>wearable/tct-metadata-extractor-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>wearable/tct-camera-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>27</total_tcn>\r
- <pkg_name>wearable/tct-push-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-dlog-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>wearable/tct-app-manager-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>66</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>wearable/tct-audio-io-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>72</total_tcn>\r
- <pkg_name>wearable/tct-package-manager-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-player-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-efl-util-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>192</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>192</total_tcn>\r
- <pkg_name>wearable/tct-efl-ext-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>148</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>148</total_tcn>\r
- <pkg_name>wearable/tct-wifi-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>96</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>96</total_tcn>\r
- <pkg_name>wearable/tct-sensor-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-bundle-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>50</total_tcn>\r
- <pkg_name>wearable/tct-bundle-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>31</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>wearable/tct-libstorage-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>wearable/tct-mime-type-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>47</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>47</total_tcn>\r
- <pkg_name>wearable/tct-application-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-camera-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>136</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>136</total_tcn>\r
- <pkg_name>wearable/tct-player-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-appcore-agent-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>wearable/tct-system-info-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-device-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-radio-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>wearable/tct-radio-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>186</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>186</total_tcn>\r
- <pkg_name>wearable/tct-application-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-context-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>wearable/tct-context-manager-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>60</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>wearable/tct-data-control-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>50</total_tcn>\r
- <pkg_name>wearable/tct-tts-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-settings-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>wearable/tct-system-settings-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-metadata-extractor-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>wearable/tct-capi-message-port-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>59</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>59</total_tcn>\r
- <pkg_name>wearable/tct-device-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-sound-manager-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget-viewer-evas-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>wearable/tct-widget-viewer-evas-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cairo-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-cairo-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>57</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>57</total_tcn>\r
- <pkg_name>wearable/tct-image-util-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-media-key-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>157</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>157</total_tcn>\r
- <pkg_name>wearable/tct-nfc-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-dlog-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-platform-permission-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>141</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>141</total_tcn>\r
- <pkg_name>wearable/tct-platform-permission-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-runtime-info-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>wearable/tct-efl-util-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-audio-io-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>wearable/tct-device-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-base-utils-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>645</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>645</total_tcn>\r
- <pkg_name>wearable/tct-base-utils-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>wearable/tct-recorder-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>43</total_tcn>\r
- <pkg_name>wearable/tct-player-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-mime-type-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>wearable/tct-system-info-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>wearable/tct-key-manager-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-connection-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget-service-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>wearable/tct-widget-service-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>wearable/tct-runtime-info-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-smartcard-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>wearable/tct-smartcard-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-tts-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>wearable/tct-badge-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-watch-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-appcore-watch-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-smartcard-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-smartcard-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>46</total_tcn>\r
- <pkg_name>wearable/tct-wifi-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>wearable/tct-libstorage-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>58</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>58</total_tcn>\r
- <pkg_name>wearable/tct-stt-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>wearable/tct-stt-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>114</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>114</total_tcn>\r
- <pkg_name>wearable/tct-recorder-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>114</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>114</total_tcn>\r
- <pkg_name>wearable/tct-runtime-info-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>263</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>263</total_tcn>\r
- <pkg_name>wearable/tct-bluetooth-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>wearable/tct-capi-media-tool-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-location-manager-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>wearable/tct-package-manager-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-telephony-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>142</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>142</total_tcn>\r
- <pkg_name>wearable/tct-media-content-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>wearable/tct-tbm-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>72</total_tcn>\r
- <pkg_name>wearable/tct-webkit2-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>98</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>98</total_tcn>\r
- <pkg_name>wearable/tct-notification-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>64</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>64</total_tcn>\r
- <pkg_name>wearable/tct-sound-manager-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>41</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>wearable/tct-notification-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>21</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>21</total_tcn>\r
- <pkg_name>wearable/tct-telephony-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>21</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>21</total_tcn>\r
- <pkg_name>wearable/tct-audio-io-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>35</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>35</total_tcn>\r
- <pkg_name>wearable/tct-location-manager-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tone-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-tone-player-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>108</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>108</total_tcn>\r
- <pkg_name>wearable/tct-app-manager-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-image-util-native-ctc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-privilege-info-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>wearable/tct-image-util-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>57</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>57</total_tcn>\r
- <pkg_name>wearable/tct-connection-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>39</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>39</total_tcn>\r
- <pkg_name>wearable/tct-nfc-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>wearable/tct-media-key-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget-service-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>46</total_tcn>\r
- <pkg_name>wearable/tct-widget-service-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>wearable/tct-wav-player-native-utc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>43</total_tcn>\r
- <pkg_name>wearable/tct-bluetooth-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-system-info-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>wearable/tct-sensor-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>wearable/tct-data-control-native-itc-2.3.2.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_wearable_3.0" profile="wearable">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>172</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>172</total_tcn>\r
- <pkg_name>wearable/tct-connection-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>183</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>183</total_tcn>\r
- <pkg_name>wearable/tct-webkit2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vpn-service-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>wearable/tct-vpn-service-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-privilege-info-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-adaptor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>96</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>96</total_tcn>\r
- <pkg_name>wearable/tct-dali-adaptor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mtp-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-mtp-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-wav-player-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-native-common-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_viewer_evas-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>wearable/tct-widget_viewer_evas-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-capi-ui-inputmethod-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-permission-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>wearable/tct-filesystem-permission-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messages-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>wearable/tct-messages-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>wearable/tct-badge-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_viewer_evas-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>wearable/tct-widget_viewer_evas-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediademuxer-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>wearable/tct-mediademuxer-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>wearable/tct-capi-message-port-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-settings-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-system-settings-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messages-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>wearable/tct-messages-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>wearable/tct-push-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>wearable/tct-sensor-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-appcore-agent-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-watch-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>wearable/tct-appcore-watch-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-radio-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>wearable/tct-radio-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>143</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>143</total_tcn>\r
- <pkg_name>wearable/tct-location-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>362</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>362</total_tcn>\r
- <pkg_name>wearable/tct-camera-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-thumbnail-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>wearable/tct-thumbnail-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cairo-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>wearable/tct-cairo-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>wearable/tct-tbm-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-streamrecorder-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>125</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>125</total_tcn>\r
- <pkg_name>wearable/tct-streamrecorder-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-libstorage-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-accounts-svc-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>wearable/tct-accounts-svc-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>208</total_tcn>\r
- <pkg_name>wearable/tct-telephony-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-phonenumber-utils-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>wearable/tct-phonenumber-utils-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>wearable/tct-native-common-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-vision-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>wearable/tct-capi-media-vision-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fido-client-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>wearable/tct-fido-client-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-base-utils-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>287</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>287</total_tcn>\r
- <pkg_name>wearable/tct-base-utils-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-widget-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>wearable/tct-appcore-widget-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-editor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>wearable/tct-metadata-editor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>wearable/tct-mediacodec-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-maps-service-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>337</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>337</total_tcn>\r
- <pkg_name>wearable/tct-capi-maps-service-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nsd-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>wearable/tct-nsd-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-streamer-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>102</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>102</total_tcn>\r
- <pkg_name>wearable/tct-capi-media-streamer-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>wearable/tct-mediacodec-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>127</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>127</total_tcn>\r
- <pkg_name>wearable/tct-key-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>504</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>504</total_tcn>\r
- <pkg_name>wearable/tct-media-content-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>wearable/tct-opengl-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>wearable/tct-sound-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tone-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>wearable/tct-tone-player-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-controller-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>wearable/tct-media-controller-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-widget-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>wearable/tct-appcore-widget-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>59</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>59</total_tcn>\r
- <pkg_name>wearable/tct-efl-ext-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-elm-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>wearable/tct-voice-control-elm-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>wearable/tct-metadata-extractor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>wearable/tct-camera-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-motion-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-motion-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>wearable/tct-push-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-dlog-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>42</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>wearable/tct-app-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>94</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>94</total_tcn>\r
- <pkg_name>wearable/tct-audio-io-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>92</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>92</total_tcn>\r
- <pkg_name>wearable/tct-package-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-maps-service-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>72</total_tcn>\r
- <pkg_name>wearable/tct-capi-maps-service-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-player-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediatool-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>133</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>133</total_tcn>\r
- <pkg_name>wearable/tct-mediatool-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-core-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>801</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>801</total_tcn>\r
- <pkg_name>wearable/tct-dali-core-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sync-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>wearable/tct-sync-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>wearable/tct-efl-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>151</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>151</total_tcn>\r
- <pkg_name>wearable/tct-efl-ext-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>208</total_tcn>\r
- <pkg_name>wearable/tct-wifi-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>66</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>wearable/tct-sensor-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-mediamuxer-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>wearable/tct-capi-mediamuxer-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>53</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>wearable/tct-bundle-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>wearable/tct-bundle-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>31</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>wearable/tct-libstorage-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_service-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>46</total_tcn>\r
- <pkg_name>wearable/tct-widget_service-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>wearable/tct-mime-type-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-url-download-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>27</total_tcn>\r
- <pkg_name>wearable/tct-url-download-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>99</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>99</total_tcn>\r
- <pkg_name>wearable/tct-capi-ui-inputmethod-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-eom-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>wearable/tct-eom-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contacts-service2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>206</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>206</total_tcn>\r
- <pkg_name>wearable/tct-contacts-service2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>wearable/tct-application-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-camera-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>191</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>191</total_tcn>\r
- <pkg_name>wearable/tct-player-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-elm-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>wearable/tct-voice-control-elm-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>wearable/tct-appcore-agent-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>wearable/tct-system-info-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-device-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>268</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>268</total_tcn>\r
- <pkg_name>wearable/tct-application-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-radio-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>wearable/tct-radio-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>wearable/tct-data-control-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nsd-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>wearable/tct-nsd-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>104</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>104</total_tcn>\r
- <pkg_name>wearable/tct-tts-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-settings-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>wearable/tct-system-settings-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-metadata-extractor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>64</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>64</total_tcn>\r
- <pkg_name>wearable/tct-device-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>53</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>wearable/tct-capi-message-port-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-sound-manager-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cairo-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>9</total_tcn>\r
- <pkg_name>wearable/tct-cairo-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>214</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>214</total_tcn>\r
- <pkg_name>wearable/tct-image-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-ui-inputmethod-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-capi-ui-inputmethod-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-media-key-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-trace-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>wearable/tct-trace-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>160</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>160</total_tcn>\r
- <pkg_name>wearable/tct-nfc-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-dlog-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-platform-permission-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>46</total_tcn>\r
- <pkg_name>wearable/tct-platform-permission-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-metadata-editor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>wearable/tct-metadata-editor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>wearable/tct-runtime-info-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage64-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>31</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>wearable/tct-libstorage64-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>wearable/tct-efl-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-toolkit-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>234</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>234</total_tcn>\r
- <pkg_name>wearable/tct-dali-toolkit-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-audio-io-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>wearable/tct-device-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-base-utils-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>877</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>877</total_tcn>\r
- <pkg_name>wearable/tct-base-utils-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-oauth2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>wearable/tct-oauth2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-toolkit-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>435</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>435</total_tcn>\r
- <pkg_name>wearable/tct-dali-toolkit-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>wearable/tct-recorder-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacodec-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-mediacodec-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>55</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>55</total_tcn>\r
- <pkg_name>wearable/tct-player-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-controller-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>28</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>wearable/tct-media-controller-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-mime-type-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-system-info-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-thumbnail-util-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-thumbnail-util-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>wearable/tct-key-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-connection-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>wearable/tct-runtime-info-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-smartcard-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>wearable/tct-smartcard-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-tts-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>wearable/tct-badge-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mtp-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>wearable/tct-mtp-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcore-watch-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-appcore-watch-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-smartcard-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>wearable/tct-smartcard-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-iotcon-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>346</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>346</total_tcn>\r
- <pkg_name>wearable/tct-iotcon-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>60</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>wearable/tct-wifi-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fido-client-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>19</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>wearable/tct-fido-client-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-oauth2-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>wearable/tct-oauth2-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sync-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>wearable/tct-sync-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-accounts-svc-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>144</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>144</total_tcn>\r
- <pkg_name>wearable/tct-accounts-svc-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>wearable/tct-libstorage-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-url-download-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>121</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>121</total_tcn>\r
- <pkg_name>wearable/tct-url-download-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>88</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>88</total_tcn>\r
- <pkg_name>wearable/tct-stt-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>wearable/tct-stt-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>143</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>143</total_tcn>\r
- <pkg_name>wearable/tct-recorder-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>wearable/tct-voice-control-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediastreamrecorder-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>29</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>29</total_tcn>\r
- <pkg_name>wearable/tct-mediastreamrecorder-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>134</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>134</total_tcn>\r
- <pkg_name>wearable/tct-runtime-info-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>302</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>302</total_tcn>\r
- <pkg_name>wearable/tct-bluetooth-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-mediademuxer-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>wearable/tct-capi-mediademuxer-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-core-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>1645</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1645</total_tcn>\r
- <pkg_name>wearable/tct-dali-core-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>51</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>51</total_tcn>\r
- <pkg_name>wearable/tct-capi-media-tool-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-location-manager-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>38</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>wearable/tct-package-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>wearable/tct-telephony-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dali-adaptor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>wearable/tct-dali-adaptor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>189</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>189</total_tcn>\r
- <pkg_name>wearable/tct-media-content-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>wearable/tct-tbm-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libfeedback-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>13</total_tcn>\r
- <pkg_name>wearable/tct-libfeedback-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>75</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>wearable/tct-webkit2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capi-media-streamer-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-capi-media-streamer-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>229</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>229</total_tcn>\r
- <pkg_name>wearable/tct-notification-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>101</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>101</total_tcn>\r
- <pkg_name>wearable/tct-sound-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>wearable/tct-notification-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-voice-control-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>97</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>97</total_tcn>\r
- <pkg_name>wearable/tct-voice-control-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-eom-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>42</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>wearable/tct-eom-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget_service-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>wearable/tct-widget_service-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contacts-service2-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>wearable/tct-contacts-service2-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-telephony-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>wearable/tct-telephony-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>wearable/tct-audio-io-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-location-manager-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>43</total_tcn>\r
- <pkg_name>wearable/tct-location-manager-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tone-player-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-tone-player-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>130</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>130</total_tcn>\r
- <pkg_name>wearable/tct-app-manager-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-image-util-native-ctc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-vision-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>wearable/tct-media-vision-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-privilege-info-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vpn-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>wearable/tct-vpn-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>wearable/tct-image-util-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-connection-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>wearable/tct-connection-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>wearable/tct-nfc-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ttrace-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>wearable/tct-ttrace-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediamuxer-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>wearable/tct-mediamuxer-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>wearable/tct-media-key-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>wearable/tct-wav-player-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-libfeedback-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-libfeedback-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-phonenumber-utils-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-phonenumber-utils-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-motion-native-utc" category=" UnitTestCases ">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>wearable/tct-motion-native-utc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>wearable/tct-bluetooth-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>wearable/tct-system-info-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>wearable/tct-sensor-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>wearable/tct-data-control-native-itc-3.0.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_mobile_2.4" profile="mobile">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-webdatabase-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>247</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>247</total_tcn>\r
- <pkg_name>mobile/tct-webdatabase-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-mms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>123</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>123</total_tcn>\r
- <pkg_name>mobile/tct-messaging-mms-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>141</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>159</total_tcn>\r
- <pkg_name>mobile/tct-multicolumn-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>86</total_tcn>\r
- <pkg_name>mobile/tct-workers-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-email-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>308</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>309</total_tcn>\r
- <pkg_name>mobile/tct-messaging-email-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>470</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>470</total_tcn>\r
- <pkg_name>mobile/tct-time-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>151</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>151</total_tcn>\r
- <pkg_name>mobile/tct-forms-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>98</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>101</total_tcn>\r
- <pkg_name>mobile/tct-fileapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-ext01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>64</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>64</total_tcn>\r
- <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>133</auto_tcn>\r
- <manual_tcn>78</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>mobile/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>mobile/tct-privilege-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>mobile/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>mobile/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>176</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>176</total_tcn>\r
- <pkg_name>mobile/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>12</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>93</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>94</total_tcn>\r
- <pkg_name>mobile/tct-notification-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fmradio-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>67</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>74</total_tcn>\r
- <pkg_name>mobile/tct-fmradio-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>mobile/tct-appcache-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystemapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>208</total_tcn>\r
- <pkg_name>mobile/tct-filesystemapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>9</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>270</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>270</total_tcn>\r
- <pkg_name>mobile/tct-websocket-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>28</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>mobile/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>548</auto_tcn>\r
- <manual_tcn>25</manual_tcn>\r
- <total_tcn>573</total_tcn>\r
- <pkg_name>mobile/tct-extra-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>16</total_tcn>\r
- <pkg_name>mobile/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>29</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>400</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>400</total_tcn>\r
- <pkg_name>mobile/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>73</total_tcn>\r
- <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-networkbearerselection-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>mobile/tct-networkbearerselection-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>41</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-push-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-browserstate-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>262</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>262</total_tcn>\r
- <pkg_name>mobile/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>80</total_tcn>\r
- <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>mobile/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>195</auto_tcn>\r
- <manual_tcn>35</manual_tcn>\r
- <total_tcn>230</total_tcn>\r
- <pkg_name>mobile/tct-nfc-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>mobile/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contact-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>441</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>441</total_tcn>\r
- <pkg_name>mobile/tct-contact-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>245</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>245</total_tcn>\r
- <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-notification-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>82</manual_tcn>\r
- <total_tcn>150</total_tcn>\r
- <pkg_name>mobile/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>mobile/tct-websetting-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>333</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>334</total_tcn>\r
- <pkg_name>mobile/tct-audio-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">\r
- <auto_tcn>17</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>17</total_tcn>\r
- <pkg_name>mobile/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>mobile/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>184</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>192</total_tcn>\r
- <pkg_name>mobile/tct-application-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>257</auto_tcn>\r
- <manual_tcn>142</manual_tcn>\r
- <total_tcn>399</total_tcn>\r
- <pkg_name>mobile/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>mobile/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>131</manual_tcn>\r
- <total_tcn>142</total_tcn>\r
- <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-ui01-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>422</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>422</total_tcn>\r
- <pkg_name>mobile/tct-webaudio-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filewriterapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>mobile/tct-filewriterapi-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>119</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>119</total_tcn>\r
- <pkg_name>mobile/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>mobile/tct-secureelement-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>56</total_tcn>\r
- <pkg_name>mobile/tct-power-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>65</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>65</total_tcn>\r
- <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>60</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <!--\r
- <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- -->\r
- <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-account-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>89</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>89</total_tcn>\r
- <pkg_name>mobile/tct-account-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>mobile/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bookmark-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>mobile/tct-bookmark-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>354</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>354</total_tcn>\r
- <pkg_name>mobile/tct-calendar-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <!--\r
- <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>mobile/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- -->\r
- <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>148</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>149</total_tcn>\r
- <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>113</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>113</total_tcn>\r
- <pkg_name>mobile/tct-datacontrol-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-appcontrol-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-callhistory-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>27</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>mobile/tct-callhistory-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <!--\r
- <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- -->\r
- <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>845</auto_tcn>\r
- <manual_tcn>19</manual_tcn>\r
- <total_tcn>864</total_tcn>\r
- <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>44</total_tcn>\r
- <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>68</total_tcn>\r
- <pkg_name>mobile/tct-sse-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <!--\r
- <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>33</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- -->\r
- <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>mobile/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacontroller-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>162</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>165</total_tcn>\r
- <pkg_name>mobile/tct-mediacontroller-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>304</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>304</total_tcn>\r
- <pkg_name>mobile/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>289</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>292</total_tcn>\r
- <pkg_name>mobile/tct-filesystem-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-sms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>184</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>184</total_tcn>\r
- <pkg_name>mobile/tct-messaging-sms-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>mobile/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>177</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>181</total_tcn>\r
- <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>mobile/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>541</auto_tcn>\r
- <manual_tcn>74</manual_tcn>\r
- <total_tcn>615</total_tcn>\r
- <pkg_name>mobile/tct-backgrounds-css3-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>361</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>365</total_tcn>\r
- <pkg_name>mobile/tct-video-html5-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>889</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>889</total_tcn>\r
- <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_mobile_3.0" profile="mobile">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-jsenhance-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-jsenhance-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-multicolumn-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>136</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>154</total_tcn>\r
- <pkg_name>common/tct-multicolumn-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-mms-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>123</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>123</total_tcn>\r
- <pkg_name>mobile/tct-messaging-mms-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-devicemotion-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>common/tct-devicemotion-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-workers-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>77</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-workers-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-transitions-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-transitions-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-namespace-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-namespace-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-email-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>307</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>308</total_tcn>\r
- <pkg_name>mobile/tct-messaging-email-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-network-information-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-network-information-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-crypto-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-crypto-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-2dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>common/tct-2dtransforms-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dialogs-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>9</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-dialogs-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-time-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>470</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>470</total_tcn>\r
- <pkg_name>mobile/tct-time-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-forms-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>common/tct-forms-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capability-tests" category="Compliance">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-capability-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fileapi-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>38</total_tcn>\r
- <pkg_name>common/tct-fileapi-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacapture-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-mediacapture-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>mobile/tct-ext01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-exif-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>64</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>64</total_tcn>\r
- <pkg_name>common/tct-exif-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-csp-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>137</auto_tcn>\r
- <manual_tcn>83</manual_tcn>\r
- <total_tcn>220</total_tcn>\r
- <pkg_name>common/tct-csp-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>209</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>209</total_tcn>\r
- <pkg_name>mobile/tct-privilege-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediakey-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>mobile/tct-mediakey-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>52</total_tcn>\r
- <pkg_name>common/tct-media-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>mobile/tct-deviceorientation-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webmessaging-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>175</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>175</total_tcn>\r
- <pkg_name>common/tct-webmessaging-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-file-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>172</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>172</total_tcn>\r
- <pkg_name>common/tct-file-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>12</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-package-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-template-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-template-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>96</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>96</total_tcn>\r
- <pkg_name>common/tct-notification-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fmradio-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>mobile/tct-fmradio-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-rt01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcache-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>common/tct-appcache-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-svg-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>14</manual_tcn>\r
- <total_tcn>57</total_tcn>\r
- <pkg_name>common/tct-svg-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websocket-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>266</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>266</total_tcn>\r
- <pkg_name>common/tct-websocket-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-flexiblebox-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>14</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>common/tct-flexiblebox-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dnd-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-dnd-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-extra-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>548</auto_tcn>\r
- <manual_tcn>25</manual_tcn>\r
- <total_tcn>573</total_tcn>\r
- <pkg_name>common/tct-extra-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fullscreen-nonw3c-tests" category="Supplementary APIs">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>common/tct-fullscreen-nonw3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-colors-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>29</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>common/tct-colors-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-indexeddb-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>343</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>343</total_tcn>\r
- <pkg_name>common/tct-indexeddb-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sandbox-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>46</total_tcn>\r
- <pkg_name>common/tct-sandbox-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-networkbearerselection-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>mobile/tct-networkbearerselection-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messageport-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>51</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>51</total_tcn>\r
- <pkg_name>common/tct-messageport-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/tct-push-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-browserstate-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-browserstate-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cors-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-cors-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-xmlhttprequest-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>212</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>212</total_tcn>\r
- <pkg_name>common/tct-xmlhttprequest-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-navigationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>common/tct-navigationtiming-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-typedarrays-nonw3c-tests" category="Supplementary APIs">\r
- <auto_tcn>446</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>446</total_tcn>\r
- <pkg_name>common/tct-typedarrays-nonw3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animations-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>common/tct-animations-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>mobile/tct-badge-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>218</auto_tcn>\r
- <manual_tcn>37</manual_tcn>\r
- <total_tcn>255</total_tcn>\r
- <pkg_name>mobile/tct-nfc-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pagevisibility-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>common/tct-pagevisibility-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ResponsiveImage-w3c-tests" category="Tizen W3C APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-ResponsiveImage-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-content-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>245</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>245</total_tcn>\r
- <pkg_name>common/tct-content-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-contact-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>479</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>479</total_tcn>\r
- <pkg_name>mobile/tct-contact-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-gumallow-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-gumallow-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>39</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>mobile/tct-notification-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-serviceworkers-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-serviceworkers-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-preference-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>mobile/tct-preference-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-globalization-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-globalization-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-sp01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>75</manual_tcn>\r
- <total_tcn>143</total_tcn>\r
- <pkg_name>mobile/tct-widget02-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websetting-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>mobile/tct-websetting-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>152</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>152</total_tcn>\r
- <pkg_name>common/tct-audio-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-import-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-import-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screenorientation-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-screenorientation-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt02-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-rt02-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp02-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-sp02-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>mobile/tct-sound-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext02-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>common/tct-ext02-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>193</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>199</total_tcn>\r
- <pkg_name>mobile/tct-application-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-humanactivitymonitor-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>87</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>102</total_tcn>\r
- <pkg_name>common/tct-humanactivitymonitor-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>255</auto_tcn>\r
- <manual_tcn>147</manual_tcn>\r
- <total_tcn>402</total_tcn>\r
- <pkg_name>mobile/tct-bluetooth-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fonts-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>131</manual_tcn>\r
- <total_tcn>143</total_tcn>\r
- <pkg_name>common/tct-fonts-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-speech-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>87</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>91</total_tcn>\r
- <pkg_name>common/tct-speech-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-security-tcs-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>mobile/tct-ui01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>common/tct-animationtiming-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel2-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-selectorslevel2-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi01-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-wgtapi01-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webaudio-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>257</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>257</total_tcn>\r
- <pkg_name>common/tct-webaudio-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-inputdevice-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>39</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>mobile/tct-inputdevice-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-secureelement-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>102</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>102</total_tcn>\r
- <pkg_name>mobile/tct-secureelement-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>166</auto_tcn>\r
- <manual_tcn>21</manual_tcn>\r
- <total_tcn>187</total_tcn>\r
- <pkg_name>mobile/tct-sensor-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-power-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>56</total_tcn>\r
- <pkg_name>mobile/tct-power-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>common/tct-privilege-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-alarm-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>60</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>common/tct-alarm-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-touchevent-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>common/tct-touchevent-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-woff-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>22</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-woff-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-wgtapi02-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-archive-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-archive-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-account-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>90</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>90</total_tcn>\r
- <pkg_name>mobile/tct-account-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tizen-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>common/tct-tizen-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget01-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>common/tct-widget01-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bookmark-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>mobile/tct-bookmark-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-3dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-3dtransforms-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>355</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>355</total_tcn>\r
- <pkg_name>mobile/tct-calendar-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geoallow-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>209</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>212</total_tcn>\r
- <pkg_name>common/tct-geoallow-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sessionhistory-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>117</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>119</total_tcn>\r
- <pkg_name>common/tct-sessionhistory-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-datacontrol-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>115</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>115</total_tcn>\r
- <pkg_name>common/tct-datacontrol-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-callhistory-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>27</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>mobile/tct-callhistory-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcontrol-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>5</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>5</total_tcn>\r
- <pkg_name>mobile/tct-appcontrol-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-events-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-events-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geodeny-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-geodeny-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-ui-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-canvas-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>848</auto_tcn>\r
- <manual_tcn>20</manual_tcn>\r
- <total_tcn>868</total_tcn>\r
- <pkg_name>common/tct-canvas-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-keymanager-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>39</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>39</total_tcn>\r
- <pkg_name>common/tct-keymanager-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel1-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-selectorslevel1-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sse-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>66</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-sse-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widgetpolicy-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>22</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-widgetpolicy-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-batterystatus-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>common/tct-batterystatus-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacontroller-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>162</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>165</total_tcn>\r
- <pkg_name>common/tct-mediacontroller-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>289</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>292</total_tcn>\r
- <pkg_name>mobile/tct-filesystem-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systeminfo-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>382</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>382</total_tcn>\r
- <pkg_name>mobile/tct-systeminfo-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-feedback-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>mobile/tct-feedback-tizen-tests-3.0.zip</pkg_name>\r
- </suite> \r
- <suite name="tct-file-transfer-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-file-transfer-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-customelement-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-customelement-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-device-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-beacon-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-beacon-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vibration-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>common/tct-vibration-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messaging-sms-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>184</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>184</total_tcn>\r
- <pkg_name>mobile/tct-messaging-sms-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-text-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>common/tct-text-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stab-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-stab-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webstorage-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>195</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>200</total_tcn>\r
- <pkg_name>common/tct-webstorage-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-download-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>common/tct-download-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediaqueries-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>63</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>63</total_tcn>\r
- <pkg_name>common/tct-mediaqueries-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systemsetting-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>mobile/tct-systemsetting-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>197</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>200</total_tcn>\r
- <pkg_name>common/tct-video-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>541</auto_tcn>\r
- <manual_tcn>74</manual_tcn>\r
- <total_tcn>615</total_tcn>\r
- <pkg_name>common/tct-backgrounds-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pm-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-pm-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webgl-nonw3c-tests" category="Supplementary APIs">\r
- <auto_tcn>910</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>911</total_tcn>\r
- <pkg_name>common/tct-webgl-nonw3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<ns3:testplan name="Web_Full_tv_2.4" profile="tv" xmlns="" xmlns:ns3="http://www.example.org/plan/">
- <execute_type>Auto</execute_type>
- <suite launcher="WRTLauncher" name="tct-animationtiming-w3c-tests">
- <auto_tcn>11</auto_tcn>
- <manual_tcn>7</manual_tcn>
- <total_tcn>18</total_tcn>
- <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-indexeddb-w3c-tests">
- <auto_tcn>391</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>391</total_tcn>
- <pkg_name>tv/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-ext02-wrt-tests">
- <auto_tcn>8</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>8</total_tcn>
- <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-pagevisibility-w3c-tests">
- <auto_tcn>18</auto_tcn>
- <manual_tcn>2</manual_tcn>
- <total_tcn>20</total_tcn>
- <pkg_name>tv/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-ext01-wrt-tests">
- <auto_tcn>2</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>2</total_tcn>
- <pkg_name>tv/tct-ext01-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-websocket-w3c-tests">
- <auto_tcn>268</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>268</total_tcn>
- <pkg_name>tv/tct-websocket-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-content-tizen-tests">
- <auto_tcn>245</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>245</total_tcn>
- <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-flexiblebox-css3-tests">
- <auto_tcn>25</auto_tcn>
- <manual_tcn>28</manual_tcn>
- <total_tcn>53</total_tcn>
- <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tv-channel-tizen-tests">
- <auto_tcn>166</auto_tcn>
- <manual_tcn>3</manual_tcn>
- <total_tcn>169</total_tcn>
- <pkg_name>tv/tct-tv-channel-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-rt01-wrt-tests">
- <auto_tcn>12</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>12</total_tcn>
- <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-multicolumn-css3-tests">
- <auto_tcn>141</auto_tcn>
- <manual_tcn>18</manual_tcn>
- <total_tcn>159</total_tcn>
- <pkg_name>tv/tct-multicolumn-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-appwgt-wrt-tests">
- <auto_tcn>7</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>7</total_tcn>
- <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-archive-tizen-tests">
- <auto_tcn>106</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>106</total_tcn>
- <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-gumallow-w3c-tests">
- <auto_tcn>6</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>6</total_tcn>
- <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-fullscreen-nonw3c-tests">
- <auto_tcn>16</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>16</total_tcn>
- <pkg_name>tv/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-mediacapture-w3c-tests">
- <auto_tcn>7</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>7</total_tcn>
- <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-jsenhance-html5-tests">
- <auto_tcn>49</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>49</total_tcn>
- <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-pm-wrt-tests">
- <auto_tcn>24</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>24</total_tcn>
- <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-wgtapi02-w3c-tests">
- <auto_tcn>0</auto_tcn>
- <manual_tcn>34</manual_tcn>
- <total_tcn>34</total_tcn>
- <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-widgetpolicy-w3c-tests">
- <auto_tcn>0</auto_tcn>
- <manual_tcn>33</manual_tcn>
- <total_tcn>33</total_tcn>
- <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-mediaqueries-css3-tests">
- <auto_tcn>52</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>52</total_tcn>
- <pkg_name>tv/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-typedarrays-nonw3c-tests">
- <auto_tcn>80</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>80</total_tcn>
- <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-webaudio-w3c-tests">
- <auto_tcn>422</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>422</total_tcn>
- <pkg_name>tv/tct-webaudio-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-widget02-w3c-tests">
- <auto_tcn>68</auto_tcn>
- <manual_tcn>49</manual_tcn>
- <total_tcn>117</total_tcn>
- <pkg_name>tv/tct-widget02-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-filesystem-tizen-tests">
- <auto_tcn>291</auto_tcn>
- <manual_tcn>3</manual_tcn>
- <total_tcn>294</total_tcn>
- <pkg_name>tv/tct-filesystem-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-keymanager-tizen-tests">
- <auto_tcn>39</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>39</total_tcn>
- <pkg_name>tv/tct-keymanager-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-webgl-nonw3c-tests">
- <auto_tcn>889</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>889</total_tcn>
- <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-download-tizen-tests">
- <auto_tcn>62</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>62</total_tcn>
- <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-selectorslevel2-w3c-tests">
- <auto_tcn>30</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>30</total_tcn>
- <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tv-displaycontrol-tizen-tests">
- <auto_tcn>20</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>20</total_tcn>
- <pkg_name>tv/tct-tv-displaycontrol-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-alarm-tizen-tests">
- <auto_tcn>60</auto_tcn>
- <manual_tcn>1</manual_tcn>
- <total_tcn>61</total_tcn>
- <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-inputdevice-tizen-tests">
- <auto_tcn>30</auto_tcn>
- <manual_tcn>3</manual_tcn>
- <total_tcn>33</total_tcn>
- <pkg_name>tv/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-websetting-tizen-tests">
- <auto_tcn>22</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>22</total_tcn>
- <pkg_name>tv/tct-websetting-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-messageport-tizen-tests">
- <auto_tcn>48</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>48</total_tcn>
- <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-privilege-tizen-tests">
- <auto_tcn>65</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>65</total_tcn>
- <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-sse-w3c-tests">
- <auto_tcn>68</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>68</total_tcn>
- <pkg_name>tv/tct-sse-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-namespace-tizen-tests">
- <auto_tcn>23</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>23</total_tcn>
- <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tv-window-tizen-tests">
- <auto_tcn>81</auto_tcn>
- <manual_tcn>4</manual_tcn>
- <total_tcn>85</total_tcn>
- <pkg_name>tv/tct-tv-window-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-maxLength-wrt-tests">
- <auto_tcn>14</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>14</total_tcn>
- <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tv-audiocontrol-tizen-tests">
- <auto_tcn>61</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>61</total_tcn>
- <pkg_name>tv/tct-tv-audiocontrol-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-xmlhttprequest-w3c-tests">
- <auto_tcn>202</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>202</total_tcn>
- <pkg_name>tv/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-security-tcs-tests">
- <auto_tcn>3</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>3</total_tcn>
- <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-backgrounds-css3-tests">
- <auto_tcn>541</auto_tcn>
- <manual_tcn>74</manual_tcn>
- <total_tcn>615</total_tcn>
- <pkg_name>tv/tct-backgrounds-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-webstorage-w3c-tests">
- <auto_tcn>177</auto_tcn>
- <manual_tcn>4</manual_tcn>
- <total_tcn>181</total_tcn>
- <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-package-tizen-tests">
- <auto_tcn>54</auto_tcn>
- <manual_tcn>12</manual_tcn>
- <total_tcn>66</total_tcn>
- <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-text-css3-tests">
- <auto_tcn>27</auto_tcn>
- <manual_tcn>15</manual_tcn>
- <total_tcn>42</total_tcn>
- <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-systeminfo-tizen-tests">
- <auto_tcn>296</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>296</total_tcn>
- <pkg_name>tv/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-sandbox-html5-tests">
- <auto_tcn>72</auto_tcn>
- <manual_tcn>1</manual_tcn>
- <total_tcn>73</total_tcn>
- <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-sp02-wrt-tests">
- <auto_tcn>1</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>1</total_tcn>
- <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-selectorslevel1-w3c-tests">
- <auto_tcn>78</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>78</total_tcn>
- <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-csp-w3c-tests">
- <auto_tcn>133</auto_tcn>
- <manual_tcn>78</manual_tcn>
- <total_tcn>211</total_tcn>
- <pkg_name>tv/tct-csp-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-colors-css3-tests">
- <auto_tcn>46</auto_tcn>
- <manual_tcn>29</manual_tcn>
- <total_tcn>75</total_tcn>
- <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tv-info-tizen-tests">
- <auto_tcn>23</auto_tcn>
- <manual_tcn>3</manual_tcn>
- <total_tcn>26</total_tcn>
- <pkg_name>tv/tct-tv-info-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-2dtransforms-css3-tests">
- <auto_tcn>34</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>34</total_tcn>
- <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-application-tizen-tests">
- <auto_tcn>183</auto_tcn>
- <manual_tcn>6</manual_tcn>
- <total_tcn>189</total_tcn>
- <pkg_name>tv/tct-application-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-forms-html5-tests">
- <auto_tcn>146</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>146</total_tcn>
- <pkg_name>tv/tct-forms-html5-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-tizen-tizen-tests">
- <auto_tcn>81</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>81</total_tcn>
- <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-cors-w3c-tests">
- <auto_tcn>10</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>10</total_tcn>
- <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-exif-tizen-tests">
- <auto_tcn>64</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>64</total_tcn>
- <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-capability-tests">
- <auto_tcn>15</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>15</total_tcn>
- <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-fileapi-w3c-tests">
- <auto_tcn>97</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>97</total_tcn>
- <pkg_name>tv/tct-fileapi-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-browserstate-html5-tests">
- <auto_tcn>3</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>3</total_tcn>
- <pkg_name>tv/tct-browserstate-html5-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-canvas-html5-tests">
- <auto_tcn>846</auto_tcn>
- <manual_tcn>18</manual_tcn>
- <total_tcn>864</total_tcn>
- <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-widget01-w3c-tests">
- <auto_tcn>73</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>73</total_tcn>
- <pkg_name>tv/tct-widget01-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-time-tizen-tests">
- <auto_tcn>459</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>459</total_tcn>
- <pkg_name>tv/tct-time-tizen-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-ui01-wrt-tests">
- <auto_tcn>11</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>11</total_tcn>
- <pkg_name>tv/tct-ui01-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-appcache-html5-tests">
- <auto_tcn>36</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>36</total_tcn>
- <pkg_name>tv/tct-appcache-html5-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-screenorientation-w3c-tests">
- <auto_tcn>17</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>17</total_tcn>
- <pkg_name>tv/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-rt02-wrt-tests">
- <auto_tcn>3</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>3</total_tcn>
- <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-sp01-wrt-tests">
- <auto_tcn>4</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>4</total_tcn>
- <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-svg-html5-tests">
- <auto_tcn>3</auto_tcn>
- <manual_tcn>9</manual_tcn>
- <total_tcn>12</total_tcn>
- <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-sessionhistory-html5-tests">
- <auto_tcn>148</auto_tcn>
- <manual_tcn>1</manual_tcn>
- <total_tcn>149</total_tcn>
- <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-workers-w3c-tests">
- <auto_tcn>84</auto_tcn>
- <manual_tcn>1</manual_tcn>
- <total_tcn>85</total_tcn>
- <pkg_name>tv/tct-workers-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-wgtapi01-w3c-tests">
- <auto_tcn>107</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>107</total_tcn>
- <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-3dtransforms-css3-tests">
- <auto_tcn>32</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>32</total_tcn>
- <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-transitions-css3-tests">
- <auto_tcn>26</auto_tcn>
- <manual_tcn>5</manual_tcn>
- <total_tcn>31</total_tcn>
- <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-stab-wrt-tests">
- <auto_tcn>1</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>1</total_tcn>
- <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-animations-css3-tests">
- <auto_tcn>24</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>24</total_tcn>
- <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-fonts-css3-tests">
- <auto_tcn>11</auto_tcn>
- <manual_tcn>131</manual_tcn>
- <total_tcn>142</total_tcn>
- <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-navigationtiming-w3c-tests">
- <auto_tcn>45</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>45</total_tcn>
- <pkg_name>tv/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-ui-css3-tests">
- <auto_tcn>43</auto_tcn>
- <manual_tcn>1</manual_tcn>
- <total_tcn>44</total_tcn>
- <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-extra-html5-tests">
- <auto_tcn>544</auto_tcn>
- <manual_tcn>25</manual_tcn>
- <total_tcn>569</total_tcn>
- <pkg_name>tv/tct-extra-html5-tests-2.4.zip</pkg_name>
- </suite>
- <suite launcher="WRTLauncher" name="tct-webmessaging-w3c-tests">
- <auto_tcn>175</auto_tcn>
- <manual_tcn>0</manual_tcn>
- <total_tcn>175</total_tcn>
- <pkg_name>tv/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>
- </suite>
-</ns3:testplan>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_tv_3.0" profile="tv">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-jsenhance-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-jsenhance-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-multicolumn-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>136</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>154</total_tcn>\r
- <pkg_name>common/tct-multicolumn-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-devicemotion-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>common/tct-devicemotion-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-workers-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>77</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-workers-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-namespace-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>tv/tct-namespace-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-transitions-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-transitions-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-network-information-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-network-information-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-crypto-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-crypto-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-2dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>common/tct-2dtransforms-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dialogs-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>9</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-dialogs-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-time-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>454</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>454</total_tcn>\r
- <pkg_name>tv/tct-time-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-forms-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>common/tct-forms-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capability-tests" category="Compliance">\r
- <auto_tcn>35</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>35</total_tcn>\r
- <pkg_name>common/tct-capability-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fileapi-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>common/tct-fileapi-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>tv/tct-ext01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacapture-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-mediacapture-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-exif-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>64</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>64</total_tcn>\r
- <pkg_name>common/tct-exif-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-csp-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>137</auto_tcn>\r
- <manual_tcn>83</manual_tcn>\r
- <total_tcn>220</total_tcn>\r
- <pkg_name>common/tct-csp-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>95</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>95</total_tcn>\r
- <pkg_name>tv/tct-privilege-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mse-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>95</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>95</total_tcn>\r
- <pkg_name>tv/tct-mse-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>57</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>57</total_tcn>\r
- <pkg_name>common/tct-media-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webmessaging-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>175</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>175</total_tcn>\r
- <pkg_name>common/tct-webmessaging-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>12</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-package-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-file-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>172</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>172</total_tcn>\r
- <pkg_name>common/tct-file-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>96</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>96</total_tcn>\r
- <pkg_name>common/tct-notification-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-template-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-template-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-rt01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcache-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>common/tct-appcache-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-svg-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>14</manual_tcn>\r
- <total_tcn>57</total_tcn>\r
- <pkg_name>common/tct-svg-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websocket-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>266</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>266</total_tcn>\r
- <pkg_name>common/tct-websocket-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-flexiblebox-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>14</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>common/tct-flexiblebox-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dnd-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-dnd-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-extra-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>548</auto_tcn>\r
- <manual_tcn>25</manual_tcn>\r
- <total_tcn>573</total_tcn>\r
- <pkg_name>common/tct-extra-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fullscreen-nonw3c-tests" category="Supplementary APIs">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>common/tct-fullscreen-nonw3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-colors-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>29</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>common/tct-colors-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-indexeddb-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>343</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>343</total_tcn>\r
- <pkg_name>common/tct-indexeddb-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sandbox-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>46</total_tcn>\r
- <pkg_name>common/tct-sandbox-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messageport-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>51</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>51</total_tcn>\r
- <pkg_name>common/tct-messageport-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-browserstate-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-browserstate-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cors-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-cors-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-xmlhttprequest-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>212</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>212</total_tcn>\r
- <pkg_name>common/tct-xmlhttprequest-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-navigationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>common/tct-navigationtiming-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-typedarrays-nonw3c-tests" category="Supplementary APIs">\r
- <auto_tcn>446</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>446</total_tcn>\r
- <pkg_name>common/tct-typedarrays-nonw3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animations-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>common/tct-animations-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pagevisibility-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>common/tct-pagevisibility-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ResponsiveImage-w3c-tests" category="Tizen W3C APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-ResponsiveImage-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-content-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>245</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>245</total_tcn>\r
- <pkg_name>common/tct-content-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-gumallow-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-gumallow-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-serviceworkers-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-serviceworkers-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-globalization-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>116</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>116</total_tcn>\r
- <pkg_name>common/tct-globalization-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-sp01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>45</manual_tcn>\r
- <total_tcn>113</total_tcn>\r
- <pkg_name>tv/tct-widget02-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websetting-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>tv/tct-websetting-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>152</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>152</total_tcn>\r
- <pkg_name>common/tct-audio-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-import-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-import-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screenorientation-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-screenorientation-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt02-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-rt02-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp02-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-sp02-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext02-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>common/tct-ext02-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>159</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>165</total_tcn>\r
- <pkg_name>tv/tct-application-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-humanactivitymonitor-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>87</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>102</total_tcn>\r
- <pkg_name>common/tct-humanactivitymonitor-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fonts-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>131</manual_tcn>\r
- <total_tcn>143</total_tcn>\r
- <pkg_name>common/tct-fonts-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-security-tcs-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-speech-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>86</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>91</total_tcn>\r
- <pkg_name>common/tct-speech-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>tv/tct-ui01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>common/tct-animationtiming-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel2-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-selectorslevel2-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi01-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-wgtapi01-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webaudio-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>257</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>257</total_tcn>\r
- <pkg_name>common/tct-webaudio-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tv-inputdevice-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>tv/tct-tv-inputdevice-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>common/tct-privilege-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-alarm-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>60</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>common/tct-alarm-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-touchevent-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>common/tct-touchevent-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-woff-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>22</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-woff-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-wgtapi02-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-archive-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-archive-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tizen-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>common/tct-tizen-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget01-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>common/tct-widget01-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-3dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-3dtransforms-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geoallow-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>209</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>212</total_tcn>\r
- <pkg_name>common/tct-geoallow-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sessionhistory-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>117</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>119</total_tcn>\r
- <pkg_name>common/tct-sessionhistory-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-datacontrol-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>115</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>115</total_tcn>\r
- <pkg_name>common/tct-datacontrol-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-events-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-events-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geodeny-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-geodeny-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-canvas-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>848</auto_tcn>\r
- <manual_tcn>20</manual_tcn>\r
- <total_tcn>868</total_tcn>\r
- <pkg_name>common/tct-canvas-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-ui-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-keymanager-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>39</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>39</total_tcn>\r
- <pkg_name>common/tct-keymanager-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel1-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-selectorslevel1-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sse-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>66</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-sse-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widgetpolicy-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>22</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-widgetpolicy-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-batterystatus-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>common/tct-batterystatus-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systeminfo-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>279</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>279</total_tcn>\r
- <pkg_name>tv/tct-systeminfo-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>287</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>290</total_tcn>\r
- <pkg_name>tv/tct-filesystem-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-file-transfer-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-file-transfer-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-customelement-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-customelement-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-device-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-beacon-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-beacon-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vibration-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>common/tct-vibration-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stab-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-stab-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-text-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>common/tct-text-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webstorage-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>195</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>200</total_tcn>\r
- <pkg_name>common/tct-webstorage-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-download-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>common/tct-download-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediaqueries-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>63</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>63</total_tcn>\r
- <pkg_name>common/tct-mediaqueries-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>541</auto_tcn>\r
- <manual_tcn>74</manual_tcn>\r
- <total_tcn>615</total_tcn>\r
- <pkg_name>common/tct-backgrounds-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>197</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>200</total_tcn>\r
- <pkg_name>common/tct-video-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pm-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-pm-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webgl-nonw3c-tests" category="Supplementary APIs">\r
- <auto_tcn>910</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>911</total_tcn>\r
- <pkg_name>common/tct-webgl-nonw3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_wearable_2.3.2" profile="wearable">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-preference-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>43</total_tcn>\r
- <pkg_name>wearable/tct-preference-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-sp01-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>63</manual_tcn>\r
- <total_tcn>131</total_tcn>\r
- <pkg_name>wearable/tct-widget02-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>common/tct-jsenhance-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>333</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>334</total_tcn>\r
- <pkg_name>common/tct-audio-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-sp02-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-rt02-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>common/tct-sound-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>86</total_tcn>\r
- <pkg_name>wearable/tct-workers-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>common/tct-ext02-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>31</total_tcn>\r
- <pkg_name>common/tct-transitions-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>wearable/tct-namespace-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>162</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>168</total_tcn>\r
- <pkg_name>common/tct-application-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>87</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>102</total_tcn>\r
- <pkg_name>common/tct-humanactivitymonitor-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>257</auto_tcn>\r
- <manual_tcn>142</manual_tcn>\r
- <total_tcn>399</total_tcn>\r
- <pkg_name>common/tct-bluetooth-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>131</manual_tcn>\r
- <total_tcn>142</total_tcn>\r
- <pkg_name>common/tct-fonts-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-speech-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-security-tcs-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>wearable/tct-ui01-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>common/tct-animationtiming-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>common/tct-selectorslevel2-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-2dtransforms-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>146</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>146</total_tcn>\r
- <pkg_name>wearable/tct-forms-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>470</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>470</total_tcn>\r
- <pkg_name>common/tct-time-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-wgtapi01-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>40</total_tcn>\r
- <pkg_name>common/tct-capability-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>97</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>97</total_tcn>\r
- <pkg_name>wearable/tct-fileapi-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>wearable/tct-ext01-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-mediacapture-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>64</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>64</total_tcn>\r
- <pkg_name>common/tct-exif-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>133</auto_tcn>\r
- <manual_tcn>78</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>common/tct-csp-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>common/tct-secureelement-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>146</auto_tcn>\r
- <manual_tcn>21</manual_tcn>\r
- <total_tcn>167</total_tcn>\r
- <pkg_name>common/tct-sensor-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
- <auto_tcn>190</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>190</total_tcn>\r
- <pkg_name>wearable/tct-privilege-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>56</total_tcn>\r
- <pkg_name>common/tct-power-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-appwgt-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>51</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>51</total_tcn>\r
- <pkg_name>wearable/tct-privilege-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-mediakey-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>61</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>common/tct-alarm-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>16</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-touchevent-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-wgtapi02-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>common/tct-deviceorientation-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-archive-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>175</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>175</total_tcn>\r
- <pkg_name>wearable/tct-webmessaging-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>12</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-package-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>85</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>85</total_tcn>\r
- <pkg_name>common/tct-notification-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>common/tct-tizen-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-rt01-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>wearable/tct-widget01-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>9</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-svg-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-3dtransforms-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>208</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>211</total_tcn>\r
- <pkg_name>common/tct-geoallow-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>148</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>149</total_tcn>\r
- <pkg_name>common/tct-sessionhistory-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>268</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>268</total_tcn>\r
- <pkg_name>wearable/tct-websocket-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>28</manual_tcn>\r
- <total_tcn>53</total_tcn>\r
- <pkg_name>common/tct-flexiblebox-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>113</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>113</total_tcn>\r
- <pkg_name>common/tct-datacontrol-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-dnd-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>544</auto_tcn>\r
- <manual_tcn>25</manual_tcn>\r
- <total_tcn>569</total_tcn>\r
- <pkg_name>wearable/tct-extra-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-geodeny-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>29</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>common/tct-colors-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>391</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>391</total_tcn>\r
- <pkg_name>wearable/tct-indexeddb-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>72</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>73</total_tcn>\r
- <pkg_name>common/tct-sandbox-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-camera-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>83</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>83</total_tcn>\r
- <pkg_name>wearable/tct-camera-nonw3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>44</total_tcn>\r
- <pkg_name>common/tct-ui-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>846</auto_tcn>\r
- <manual_tcn>19</manual_tcn>\r
- <total_tcn>865</total_tcn>\r
- <pkg_name>common/tct-canvas-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>48</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>48</total_tcn>\r
- <pkg_name>common/tct-messageport-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>41</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-push-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-selectorslevel1-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-widgetpolicy-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-batterystatus-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-cors-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>202</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>202</total_tcn>\r
- <pkg_name>wearable/tct-xmlhttprequest-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-maxLength-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>301</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>301</total_tcn>\r
- <pkg_name>wearable/tct-filesystem-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>289</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>289</total_tcn>\r
- <pkg_name>wearable/tct-systeminfo-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>80</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>80</total_tcn>\r
- <pkg_name>common/tct-typedarrays-nonw3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-animations-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>common/tct-badge-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>194</auto_tcn>\r
- <manual_tcn>36</manual_tcn>\r
- <total_tcn>230</total_tcn>\r
- <pkg_name>common/tct-nfc-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>2</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>common/tct-vibration-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>wearable/tct-pagevisibility-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-stab-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>27</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>common/tct-text-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>177</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>181</total_tcn>\r
- <pkg_name>common/tct-webstorage-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webuifw-tests" category="Web UI Framework">\r
- <auto_tcn>524</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>524</total_tcn>\r
- <pkg_name>wearable/tct-webuifw-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>common/tct-download-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>52</total_tcn>\r
- <pkg_name>wearable/tct-mediaqueries-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>230</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>230</total_tcn>\r
- <pkg_name>common/tct-content-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-gumallow-w3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>common/tct-systemsetting-tizen-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>361</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>365</total_tcn>\r
- <pkg_name>wearable/tct-video-html5-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>541</auto_tcn>\r
- <manual_tcn>74</manual_tcn>\r
- <total_tcn>615</total_tcn>\r
- <pkg_name>wearable/tct-backgrounds-css3-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-pm-wrt-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
- <auto_tcn>889</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>889</total_tcn>\r
- <pkg_name>common/tct-webgl-nonw3c-tests-2.3.1.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_wearable_3.0" profile="wearable">\r
- <execute_type>Auto</execute_type>\r
- <suite name="tct-jsenhance-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-jsenhance-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-multicolumn-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>136</auto_tcn>\r
- <manual_tcn>18</manual_tcn>\r
- <total_tcn>154</total_tcn>\r
- <pkg_name>common/tct-multicolumn-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-devicemotion-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>common/tct-devicemotion-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-workers-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>77</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-workers-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-transitions-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>9</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-transitions-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-namespace-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>wearable/tct-namespace-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-network-information-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-network-information-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-crypto-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>78</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>78</total_tcn>\r
- <pkg_name>common/tct-crypto-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-2dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>36</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>36</total_tcn>\r
- <pkg_name>common/tct-2dtransforms-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dialogs-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>13</auto_tcn>\r
- <manual_tcn>9</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-dialogs-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-time-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>470</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>470</total_tcn>\r
- <pkg_name>wearable/tct-time-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-forms-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>49</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>49</total_tcn>\r
- <pkg_name>common/tct-forms-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-capability-tests" category="Compliance">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>common/tct-capability-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fileapi-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>common/tct-fileapi-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>wearable/tct-ext01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacapture-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-mediacapture-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-exif-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>64</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>64</total_tcn>\r
- <pkg_name>common/tct-exif-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-csp-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>137</auto_tcn>\r
- <manual_tcn>83</manual_tcn>\r
- <total_tcn>220</total_tcn>\r
- <pkg_name>common/tct-csp-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>188</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>188</total_tcn>\r
- <pkg_name>wearable/tct-privilege-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediakey-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>15</total_tcn>\r
- <pkg_name>wearable/tct-mediakey-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-media-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>52</total_tcn>\r
- <pkg_name>common/tct-media-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>37</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>wearable/tct-deviceorientation-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webmessaging-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>175</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>175</total_tcn>\r
- <pkg_name>common/tct-webmessaging-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-package-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>54</auto_tcn>\r
- <manual_tcn>12</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-package-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-file-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>172</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>172</total_tcn>\r
- <pkg_name>common/tct-file-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-template-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-template-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>96</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>96</total_tcn>\r
- <pkg_name>common/tct-notification-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>12</total_tcn>\r
- <pkg_name>common/tct-rt01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-appcache-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>common/tct-appcache-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-svg-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>43</auto_tcn>\r
- <manual_tcn>14</manual_tcn>\r
- <total_tcn>57</total_tcn>\r
- <pkg_name>common/tct-svg-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-websocket-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>266</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>266</total_tcn>\r
- <pkg_name>common/tct-websocket-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-flexiblebox-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>14</manual_tcn>\r
- <total_tcn>28</total_tcn>\r
- <pkg_name>common/tct-flexiblebox-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-dnd-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-dnd-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-extra-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>548</auto_tcn>\r
- <manual_tcn>25</manual_tcn>\r
- <total_tcn>573</total_tcn>\r
- <pkg_name>common/tct-extra-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fullscreen-nonw3c-tests" category="Supplementary APIs">\r
- <auto_tcn>20</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>common/tct-fullscreen-nonw3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-colors-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>46</auto_tcn>\r
- <manual_tcn>29</manual_tcn>\r
- <total_tcn>75</total_tcn>\r
- <pkg_name>common/tct-colors-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-indexeddb-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>343</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>343</total_tcn>\r
- <pkg_name>common/tct-indexeddb-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sandbox-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>46</total_tcn>\r
- <pkg_name>common/tct-sandbox-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-messageport-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>51</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>51</total_tcn>\r
- <pkg_name>common/tct-messageport-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-push-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>wearable/tct-push-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-browserstate-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-browserstate-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-cors-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-cors-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-xmlhttprequest-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>212</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>212</total_tcn>\r
- <pkg_name>common/tct-xmlhttprequest-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-navigationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>82</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>82</total_tcn>\r
- <pkg_name>common/tct-navigationtiming-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-typedarrays-nonw3c-tests" category="Supplementary APIs">\r
- <auto_tcn>446</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>446</total_tcn>\r
- <pkg_name>common/tct-typedarrays-nonw3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animations-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>common/tct-animations-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-badge-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>26</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>26</total_tcn>\r
- <pkg_name>wearable/tct-badge-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
- <auto_tcn>195</auto_tcn>\r
- <manual_tcn>35</manual_tcn>\r
- <total_tcn>230</total_tcn>\r
- <pkg_name>wearable/tct-nfc-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pagevisibility-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>18</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>20</total_tcn>\r
- <pkg_name>common/tct-pagevisibility-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ResponsiveImage-w3c-tests" category="Tizen W3C APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-ResponsiveImage-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-content-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>245</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>245</total_tcn>\r
- <pkg_name>common/tct-content-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-gumallow-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>6</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>6</total_tcn>\r
- <pkg_name>common/tct-gumallow-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-notification-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>39</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>42</total_tcn>\r
- <pkg_name>wearable/tct-notification-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-serviceworkers-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-serviceworkers-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-preference-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>45</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>45</total_tcn>\r
- <pkg_name>wearable/tct-preference-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-globalization-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-globalization-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-sp01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>68</auto_tcn>\r
- <manual_tcn>75</manual_tcn>\r
- <total_tcn>143</total_tcn>\r
- <pkg_name>wearable/tct-widget02-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-audio-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>152</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>152</total_tcn>\r
- <pkg_name>common/tct-audio-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-import-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-import-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-screenorientation-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>14</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>14</total_tcn>\r
- <pkg_name>common/tct-screenorientation-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-rt02-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-rt02-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sp02-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-sp02-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sound-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>52</auto_tcn>\r
- <manual_tcn>8</manual_tcn>\r
- <total_tcn>60</total_tcn>\r
- <pkg_name>wearable/tct-sound-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ext02-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>8</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>8</total_tcn>\r
- <pkg_name>common/tct-ext02-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-application-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>159</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>165</total_tcn>\r
- <pkg_name>wearable/tct-application-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-humanactivitymonitor-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>87</auto_tcn>\r
- <manual_tcn>15</manual_tcn>\r
- <total_tcn>102</total_tcn>\r
- <pkg_name>common/tct-humanactivitymonitor-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-bluetooth-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>255</auto_tcn>\r
- <manual_tcn>145</manual_tcn>\r
- <total_tcn>400</total_tcn>\r
- <pkg_name>wearable/tct-bluetooth-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-fonts-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>131</manual_tcn>\r
- <total_tcn>143</total_tcn>\r
- <pkg_name>common/tct-fonts-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-speech-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>87</auto_tcn>\r
- <manual_tcn>4</manual_tcn>\r
- <total_tcn>91</total_tcn>\r
- <pkg_name>common/tct-speech-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
- <auto_tcn>3</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-security-tcs-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui01-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>11</total_tcn>\r
- <pkg_name>wearable/tct-ui01-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-animationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>11</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>common/tct-animationtiming-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel2-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>22</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-selectorslevel2-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi01-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>107</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>107</total_tcn>\r
- <pkg_name>common/tct-wgtapi01-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webaudio-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>257</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>257</total_tcn>\r
- <pkg_name>common/tct-webaudio-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-inputdevice-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>30</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>30</total_tcn>\r
- <pkg_name>wearable/tct-inputdevice-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-secureelement-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>101</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>102</total_tcn>\r
- <pkg_name>wearable/tct-secureelement-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sensor-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>166</auto_tcn>\r
- <manual_tcn>21</manual_tcn>\r
- <total_tcn>187</total_tcn>\r
- <pkg_name>wearable/tct-sensor-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-power-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>50</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>56</total_tcn>\r
- <pkg_name>wearable/tct-power-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-privilege-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>71</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>71</total_tcn>\r
- <pkg_name>common/tct-privilege-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-alarm-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>60</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>61</total_tcn>\r
- <pkg_name>common/tct-alarm-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-touchevent-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>12</auto_tcn>\r
- <manual_tcn>7</manual_tcn>\r
- <total_tcn>19</total_tcn>\r
- <pkg_name>common/tct-touchevent-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-woff-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>22</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-woff-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-wgtapi02-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>34</manual_tcn>\r
- <total_tcn>34</total_tcn>\r
- <pkg_name>common/tct-wgtapi02-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-archive-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>106</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>106</total_tcn>\r
- <pkg_name>common/tct-archive-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-tizen-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>81</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>81</total_tcn>\r
- <pkg_name>common/tct-tizen-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widget01-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>155</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>155</total_tcn>\r
- <pkg_name>common/tct-widget01-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-3dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>32</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>32</total_tcn>\r
- <pkg_name>common/tct-3dtransforms-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geoallow-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>209</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>212</total_tcn>\r
- <pkg_name>common/tct-geoallow-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sessionhistory-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>117</auto_tcn>\r
- <manual_tcn>2</manual_tcn>\r
- <total_tcn>119</total_tcn>\r
- <pkg_name>common/tct-sessionhistory-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-datacontrol-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>115</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>115</total_tcn>\r
- <pkg_name>common/tct-datacontrol-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-events-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>6</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-events-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-geodeny-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>3</total_tcn>\r
- <pkg_name>common/tct-geodeny-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-ui-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>40</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>41</total_tcn>\r
- <pkg_name>common/tct-ui-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-canvas-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>848</auto_tcn>\r
- <manual_tcn>20</manual_tcn>\r
- <total_tcn>868</total_tcn>\r
- <pkg_name>common/tct-canvas-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-keymanager-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>39</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>39</total_tcn>\r
- <pkg_name>common/tct-keymanager-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-selectorslevel1-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-selectorslevel1-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-sse-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>66</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>66</total_tcn>\r
- <pkg_name>common/tct-sse-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-widgetpolicy-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>0</auto_tcn>\r
- <manual_tcn>22</manual_tcn>\r
- <total_tcn>22</total_tcn>\r
- <pkg_name>common/tct-widgetpolicy-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-batterystatus-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>25</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>25</total_tcn>\r
- <pkg_name>common/tct-batterystatus-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediacontroller-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>162</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>165</total_tcn>\r
- <pkg_name>wearable/tct-mediacontroller-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-filesystem-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>289</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>289</total_tcn>\r
- <pkg_name>wearable/tct-filesystem-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systeminfo-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>293</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>293</total_tcn>\r
- <pkg_name>wearable/tct-systeminfo-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-feedback-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>15</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>18</total_tcn>\r
- <pkg_name>wearable/tct-feedback-tizen-tests-3.0.zip</pkg_name>\r
- </suite> <suite name="tct-file-transfer-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>23</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>23</total_tcn>\r
- <pkg_name>common/tct-file-transfer-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-customelement-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>10</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>10</total_tcn>\r
- <pkg_name>common/tct-customelement-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-device-cordova-tests" category="Cordova Plugin APIs">\r
- <auto_tcn>7</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>7</total_tcn>\r
- <pkg_name>common/tct-device-cordova-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-beacon-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>4</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>4</total_tcn>\r
- <pkg_name>common/tct-beacon-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-vibration-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>2</total_tcn>\r
- <pkg_name>common/tct-vibration-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-text-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>34</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>37</total_tcn>\r
- <pkg_name>common/tct-text-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-stab-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>1</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>1</total_tcn>\r
- <pkg_name>common/tct-stab-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webstorage-w3c-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>195</auto_tcn>\r
- <manual_tcn>5</manual_tcn>\r
- <total_tcn>200</total_tcn>\r
- <pkg_name>common/tct-webstorage-w3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-download-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>62</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>62</total_tcn>\r
- <pkg_name>common/tct-download-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-mediaqueries-css3-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>63</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>63</total_tcn>\r
- <pkg_name>common/tct-mediaqueries-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-systemsetting-tizen-tests" category="Tizen Web Device APIs">\r
- <auto_tcn>33</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>33</total_tcn>\r
- <pkg_name>wearable/tct-systemsetting-tizen-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-video-html5-tests" category="W3C/HTML5 APIs">\r
- <auto_tcn>197</auto_tcn>\r
- <manual_tcn>3</manual_tcn>\r
- <total_tcn>200</total_tcn>\r
- <pkg_name>common/tct-video-html5-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
- <auto_tcn>541</auto_tcn>\r
- <manual_tcn>74</manual_tcn>\r
- <total_tcn>615</total_tcn>\r
- <pkg_name>common/tct-backgrounds-css3-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-pm-wrt-tests" category="Tizen WRT Core Spec">\r
- <auto_tcn>24</auto_tcn>\r
- <manual_tcn>0</manual_tcn>\r
- <total_tcn>24</total_tcn>\r
- <pkg_name>common/tct-pm-wrt-tests-3.0.zip</pkg_name>\r
- </suite>\r
- <suite name="tct-webgl-nonw3c-tests" category="Supplementary APIs">\r
- <auto_tcn>910</auto_tcn>\r
- <manual_tcn>1</manual_tcn>\r
- <total_tcn>911</total_tcn>\r
- <pkg_name>common/tct-webgl-nonw3c-tests-3.0.zip</pkg_name>\r
- </suite>\r
-</ns3:testplan>\r
-\r
+++ /dev/null
-#!/usr/bin/python
-
-from glob import glob
-
-from setuptools import setup, find_packages
-
-setup(
- name = "tct-shell",
- description = "Console tool for Tizen Compliance Test",
- author = "Cathy Shen",
- author_email = "daniel.tao@intel.com",
- version = "1.0.16",
- include_package_data = True,
- data_files = [('/opt/tools/shell/plan', glob('plan/*')),
- ('/opt/tools/shell/', ['CONFIG', 'LICENSE', 'VERSION']),
- ('/opt/tools/shell/style', glob('style/*')),
- ('/opt/tools/', ['tct-shell', 'tct-plan-generator'])],
- packages = find_packages(),
-)
+++ /dev/null
-globals = com.arne.GlobalLogics$ServerLifeCycle\r
-\r
-server.host = 182.254.132.122\r
-server.port = 8080\r
-\r
-platform.imgUrlPattern = http://182.254.132.122/imgStorage/%s\r
-platform.servlet.imgStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/imgStorage"}}\r
-platform.bookUrlPattern = http://182.254.132.122/bookStorage/%s\r
-platform.servlet.bookStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/bookStorage"}}\r
-platform.bookImgUrlPattern = http://182.254.132.122/bookImgStorage/%s\r
-platform.servlet.bookImgStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/bookImgStorage"}}\r
-platform.appUrlPattern = http://182.254.132.122/appStorage/%s\r
-platform.servlet.appStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/appStorage"}}\r
-platform.appTestUrlPattern = http://182.254.132.122/appTestStorage/%s\r
-platform.servlet.appTestStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/appTestStorage"}}\r
-platform.docUrlPattern = http://182.254.132.122/docStorage/%s\r
-platform.servlet.docStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/docStorage"}}\r
-\r
-platform.ysbookImgUrlPattern = http://182.254.132.122/bookImgStorage/%s\r
-platform.servlet.ysbookImgStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/bookImgStorage"}}\r
-\r
-platform.servlet.xmlStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/xml/"}}\r
-platform.attachmentPattern = http://182.254.132.122/Attachments/%s\r
-\r
-platform.ysbookImgUrlPattern.small.flag = 0\r
-platform.ysbookImgUrlPattern.small.width=110\r
-platform.ysbookImgUrlPattern.small = http://182.254.132.122/bookImgStorage/small/%s\r
-platform.servlet.ysbookImgStorage.small = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/bookImgStorage/small"}}\r
-\r
-platform.servlet.qrCodeStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/qrCode/"}}\r
-platform.servlet.qrCodeStr = /home/leader21/sltLeader21/leader21/qrCode/\r
-platform.qrCodePattern = http://182.254.132.122/qrCode/%s\r
-platform.servlet.qrCode.width = 300\r
-platform.servlet.qrCode.height = 300\r
-\r
-platform.xmlStr = /home/leader21/sltLeader21/leader21/xml/\r
-platform.appStr = /home/leader21/sltLeader21/leader21/appStorage/\r
-\r
-platform.test.device.ids = /home/leader21/sltLeader21/leader21/device/ids.txt\r
-\r
-platform.join_act_count = 10\r
-platform.act_fillgolden.join_begin = 2014-02-10 00:00:00\r
-platform.act_fillgolden.join_end = 2014-02-28 23:59:59\r
-\r
-YL.merchantName = LEADER21\r
-YL.merchantId = 802310048992658\r
-YL.password = 61dear86420\r
-YL.private.p12 = /home/leader21/sltLeader21/leader21/PAY.YL/up_61dear_p12.p12\r
-YL.head.cer = /home/leader21/sltLeader21/leader21/PAY.YL/yl8001.cer\r
-YL.merchant_public_cer = /home/leader21/sltLeader21/leader21/PAY.YL/up_61dear_cer.cer\r
-YL.sendUrl = http://mobilepay.unionpaysecure.com/qzjy/MerOrderAction/deal.action\r
-YL.backEndUrl = http://182.254.132.122:8080/order/yl_back\r
-\r
-\r
-ZFB.partner = 2088701185025742\r
-ZFB.private_key = MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMym9J2yZ1K1/Lq+9V4UqDylZ7JygEk24d9vtFmPbNCGywU5JiQddfif8/lN8XcdpgvoNl1ujiXzpT6w5n2GYEKycg3B8zHcdoU8tWzWVL6GGbeZ/4dLY2U2XMPWtBJ+256ZP9qxN0iyBP8/qex57Ua43goWBRML5TPa/wQaCE2HAgMBAAECgYEAkiYAtsV7CBQy4eIRNBiodHbi8QrYFnD9KSWKtBK68MfyIE7JsCzh3KXOA5HoCNrBg+tXN64GEZBHx9dpIuddwbzZwoKv4DBWKRaIZDgfCyhWfopAYpxcGODngREIsdaBL7MSpElxfl2opMTESTIGSfXi4ZJFNb1kys7NlxjKEfECQQDo1kN+ka1s/Tk/oZHFysaM653oqdi6hTjpqSZJqlK7VAShQoKlR6aDy2phB3HWI2Qc5NJbNbEwqZ0+ISyhldATAkEA4QLmeWj2ZKcMwNitwq9i6Y9h4TZ0jG70B/+JgaayPFplwIjOiLn5rlLF+GRUsDJya/GQGCeAYsMIHUkbJDSDPQJBAOHCh1Uc+VQ5P54kEgz/bX9MIiNrNFq+PA3L1fUNcgRzFb4qmDScAae+v5nvNwCT9klR0Wlg6Tqu62lHj1fpxAMCQHY79OlVGyuWj+ABu4RybnI18oPJ/oIQh1BwmUu0UTHfeloqSQSVXLqaKga0ib+wMmnAHCxlDVRYETp6QLXMli0CQAOaSMnMfTrWwgdSSZVz9YKMqtCa1hzkUekTBQWFryNCLl+z54BMMhBSrj8XcGXkyD9ROzR+8HtS2ofuMn69XC8=\r
-ZFB.seller_id = 2088701185025742\r
-ZFB.log_path = /home/leader21/sltLeader21/leader21/\r
-ZFB.it_b_pay = 30 m\r
-ZFB.show_url = http://182.254.132.122/\r
-ZFB.backEndUrl = http://182.254.132.122:8080/order/zfb_back\r
-ZFB.ali_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB\r
-\r
-YB.pay_urlprefix=https://ok.yeepay.com/payapi\r
-YB.paytest_merchantaccount = YB01000000675\r
-YB.paytest_merchant_publickey = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPGXEFfLsmUVlBzb/4LjH+512G4fjVX9exKfM6ZET+JYNpGoNGTx6Qa1Q9vT4wMKR+fWTyGtjzP2T8AjTbAX4MuhzjxEfoWGzSz4On24F6cdYbcl9ZW92Ejic3w6B9QNkQ6QccOBviBjWlfm59jlfnDzxvibhMjuG/K+MJzfnLZwIDAQAB\r
-YB.paytest_merchant_privatekey = MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI8ZcQV8uyZRWUHNv/guMf7nXYbh+NVf17Ep8zpkRP4lg2kag0ZPHpBrVD29PjAwpH59ZPIa2PM/ZPwCNNsBfgy6HOPER+hYbNLPg6fbgXpx1htyX1lb3YSOJzfDoH1A2RDpBxw4G+IGNaV+bn2OV+cPPG+JuEyO4b8r4wnN+ctnAgMBAAECgYA8fB92l0svnhDhLIto5nXBbZ/tpFQeNH2h575kPv+egNKzuT4lmMmtd4BK/FNt4RGWWYAyiUCMSI5xqqkWrOHO8yrECuG3HOJOJuDFIZ6IA+4deVujzKGGuShV93Stm0Kkgz4L6Gy3FTiDzSV2Sb4WdSlObbtol8jvYHvdK1if6QJBAMza32yMWd2UzJ8kZLnBZTqO27zxpW523NRC7kP/osJqHqjaa3eTlPSUwHIE79kUtajLnnjSB4ZNNqQBp1OfUtUCQQCy04OOSaeTCMqdw9Z+b9eImkols/b//fH5wm8miK1SYGux4vghIObneOgHA0hZL3z3SRwK1E0Uw9IgZo77t+tLAkAVJvhw7eENlyK1v/1CjOyV6lBYJx9s04sjw7F0hf3ZUznNN5hnJW74/i8M1uOpJ5FGV5gKY61xOaHNt3n+kXHtAkEAqL8ljlh8tCgAot1Rg+BgP/xwaaGoPCrTcz8CChfBjlGEbsliIkjc+6LBORTk6ZwBTYyE1Mc/sY+TspV06Z3FfwJAKQA7ilH5VL7i7hwBF2q83pT5dco/vND1/RanOFgHMmuMrgWckvmWNs0wJh7nqomQVFkoxNRqWngH9/+qGHoD1w==\r
-YB.paytest_yibao_publickey = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDD/yQOpBS2bulX2a+sHLXJPkAfMhF5dgmpc9+wGxOWqzvuxCgjy1Kyb9SwXVqHJtl1S+PA6ZSXdOosRgjVBhKonYU+7CLj0gvDk50mfhzFEM5bSEeM7Vu9G2gwy4yVJKV7lKg6KvGDzwdJpodvT8DS04OaBwcp6zvf6heqYNDyTQIDAQAB\r
-YB.user_id_card = 355533056614185\r
-YB.server_mac_addr = 14-DA-E9-F0-7C-47\r
-YB.server_ip_addr = 210.73.207.184\r
-YB.userua = bkb\r
-YB.callbackurl = http://182.254.132.122:8080/order/yb_back\r
-YB.fcallbackurl = http://182.254.132.122/close.html\r
-\r
-Exam.question.count = 7\r
-platform.servlet.questionStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/"}}\r
-platform.questionPattern = http://182.254.132.122/%s\r
-platform.questionPatternStr = http://182.254.132.122/\r
-\r
-platform.activity.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.admin.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.apps.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.books.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.examinations.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.history.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.user.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.user_books.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.user_increase.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.user_wealth.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-platform.api.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
-\r
-servlet.activity.class =com.arne.platform.activity.ActivityServlet\r
-servlet.activity.path = /activity/*\r
-servlet.admin.class =com.arne.platform.admin.AdminServlet\r
-servlet.admin.path = /admin/*\r
-servlet.apps.class =com.arne.platform.apps.AppsServlet\r
-servlet.apps.path = /apps/*,/a/*\r
-servlet.books.class =com.arne.platform.books.BooksServlet\r
-servlet.books.path = /books/*\r
-servlet.history.class =com.arne.platform.history.HistoryServlet\r
-servlet.history.path = /history/*\r
-servlet.user.class =com.arne.platform.user.UserServlet\r
-servlet.user.path = /user/*\r
-servlet.userbooks.class =com.arne.platform.user_books.User_booksServlet\r
-servlet.userbooks.path = /userbooks/*\r
-servlet.user_increase.class =com.arne.platform.user_increase.User_increaseServlet\r
-servlet.user_increase.path = /user_increase/*\r
-servlet.userwealth.class =com.arne.platform.user_wealth.User_wealthServlet\r
-servlet.userwealth.path = /userwealth/*\r
-servlet.solutionapi.class =com.arne.platform.solutionapi.SolutionApiServlet\r
-servlet.solutionapi.path = /solutionapi/*\r
-servlet.exam.class =com.arne.platform.exam.ExamServlet\r
-servlet.exam.path = /exam/*\r
-servlet.order.class =com.arne.platform.order.OrderServlet\r
-servlet.order.path = /order/*\r
+++ /dev/null
-function getScrollTop() {
- return f_scrollTop();
-}
-
-function f_scrollTop() {
- return f_filterResults($(window) ? $(window).scrollTop() : 0,
- document.documentElement ? document.documentElement.scrollTop : 0,
- document.body ? document.body.scrollTop : 0);
-}
-function f_filterResults(n_win, n_docel, n_body) {
- var n_result = n_win ? n_win : 0;
- if (n_docel && (!n_result || (n_result > n_docel)))
- n_result = n_docel;
- return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
-}
-
-function setScrollTop() {
- $(window) ? $(window).scrollTop(0) : 0;
- document.documentElement ? document.documentElement.scrollTop = 0 : 0;
- document.body ? document.body.scrollTop = 0 : 0;
-}
-
-function goTopEx() {
- $node = $('#goTopBtn');
- if (getScrollTop() > 0) {
- $node.show();
- } else {
- $node.hide();
- }
-
- $(window).scroll(function() {
- if (getScrollTop() > 0) {
- $node.show();
- } else {
- $node.hide();
- }
- });
-
- $node.click(function() {
- setScrollTop();
- });
-}
-
-function drawRatio() {
- $('.suite_item').each(function(i, node) {
- drawSuiteRatio(node)
- });
-}
-
-$(".see_all").click(function(){
- $("#see_all").show();
- $("#see_fail").hide();
- $("#see_block").hide();
- $("#see_na").hide();
- updateToggles();
- return false;
-});
-
-$(".see_failed").click(function(){
- $("#see_all").hide();
- $("#see_fail").show();
- $("#see_block").hide();
- $("#see_na").hide();
- updateToggles();
- return false;
-});
-
-$(".see_blocked").click(function(){
- $("#see_all").hide();
- $("#see_fail").hide();
- $("#see_block").show();
- $("#see_na").hide();
- updateToggles();
- return false;
-});
-
-$(".see_na").click(function(){
- $("#see_all").hide();
- $("#see_fail").hide();
- $("#see_block").hide();
- $("#see_na").show();
- updateToggles();
- return false;
-});
-
-$("a.test_case_popup").click(function(){
- var $this = $(this);
- Popup.show($this.attr('id'));
- return false;
-});
-
-$(".see_capabilities").click(function(){
- if ($('#capability_table').css('display') == 'none') {
- $("#capability_table").show();
- }else{
- $("#capability_table").hide();
- }
- return false;
-});
-
-function drawSuiteRatio(node) {
- arrTitle = new Array("Passed", "Failed", "Blocked", "Not Executed");
- var $node = $(node);
- var $total = $node.find('.total');
- var $pass = $node.find('.pass');
- var $fail = $node.find('.fail');
- var $block = $node.find('.block');
- var $na = $node.find('.na');
- var $div = $node.find('.RatioGraphic');
-
- var total_int = parseInt($total.text());
- var pass_int = parseInt($pass.text());
- var fail_int = parseInt($fail.text());
- var block_int = parseInt($block.text());
- var na_int = parseInt($na.text());
-
- var pass_rate = pass_int * 100 / total_int;
- var fail_rate = fail_int * 100 / total_int;
- var block_rate = block_int * 100 / total_int;
- var na_rate = na_int * 100 / total_int;
-
- var areaWidth = 380;
-
- var pass_width = areaWidth * pass_rate / 100;
- var fail_width = areaWidth * fail_rate / 100;
- var block_width = areaWidth * block_rate / 100;
- var na_width = areaWidth * na_rate / 100;
-
- pass_rate = pass_rate.toFixed(2);
- fail_rate = fail_rate.toFixed(2);
- block_rate = block_rate.toFixed(2);
- na_rate = na_rate.toFixed(2);
-
- var pass_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/blue.jpg");"
- var fail_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/red.jpg");"
- var block_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/orange.jpg");"
- var na_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/gray.jpg");"
-
- var html = "<table width=\"380.68\" align=\"center\"><tbody><tr>";
- if (pass_width > 0){
- html += "<td width=\""
- + pass_width
- + "\" style=\""
- + pass_style
- + "\" title=\"Passed :"
- + pass_rate
- + "%\">";
- if (pass_width > 20){
- html += pass_rate + "%"
- }
- html += "</td>";
- }
- if (fail_width > 0){
- html += "<td width=\""
- + fail_width
- + "\" style=\""
- + fail_style
- + "\" title=\"Failed :"
- + fail_rate
- + "%\">";
- if (fail_width > 20){
- html += fail_rate + "%"
- }
- html += "</td>";
- }
- if (block_width > 0){
- html += "<td width=\""
- + block_width
- + "\" style=\""
- + block_style
- + "\" title=\"Blocked :"
- + block_rate
- + "%\">";
- if (block_width > 20){
- html += block_rate + "%"
- }
- html += "</td>";
- }
- if (na_width > 0){
- html += "<td width=\""
- + na_width
- + "\" style=\""
- + na_style
- + "\" title=\"Blocked :"
- + na_rate
- + "%\">";
- if (na_width > 20){
- html += na_rate + "%"
- }
- html += "</td>";
- }
- html += "</tr></tbody></table>";
- $div.html(html);
-}
+++ /dev/null
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
-f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
-{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
+++ /dev/null
-/**
- * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
- *
- * Dual licensed under the MIT and GPL licenses.
- * This basically means you can use this code however you want for
- * free, but don't claim to have written it yourself!
- * Donations always accepted: http://www.JavascriptToolbox.com/donate/
- *
- * Please do not link to the .js files on javascripttoolbox.com from
- * your site. Copy the files locally to your server instead.
- *
- */
-/* ******************************************************************* */
-/* UTIL FUNCTIONS */
-/* ******************************************************************* */
-var Util = {'$VERSION':1.06};
-
-// Util functions - these are GLOBAL so they
-// look like built-in functions.
-
-// Determine if an object is an array
-function isArray(o) {
- return (o!=null && typeof(o)=="object" && typeof(o.length)=="number" && (o.length==0 || defined(o[0])));
-};
-
-// Determine if an object is an Object
-function isObject(o) {
- return (o!=null && typeof(o)=="object" && defined(o.constructor) && o.constructor==Object && !defined(o.nodeName));
-};
-
-// Determine if a reference is defined
-function defined(o) {
- return (typeof(o)!="undefined");
-};
-
-// Iterate over an array, object, or list of items and run code against each item
-// Similar functionality to Perl's map() function
-function map(func) {
- var i,j,o;
- var results = [];
- if (typeof(func)=="string") {
- func = new Function('$_',func);
- }
- for (i=1; i<arguments.length; i++) {
- o = arguments[i];
- if (isArray(o)) {
- for (j=0; j<o.length; j++) {
- results[results.length] = func(o[j]);
- }
- }
- else if (isObject(o)) {
- for (j in o) {
- results[results.length] = func(o[j]);
- }
- }
- else {
- results[results.length] = func(o);
- }
- }
- return results;
-};
-
-// Set default values in an object if they are undefined
-function setDefaultValues(o,values) {
- if (!defined(o) || o==null) {
- o = {};
- }
- if (!defined(values) || values==null) {
- return o;
- }
- for (var val in values) {
- if (!defined(o[val])) {
- o[val] = values[val];
- }
- }
- return o;
-};
-
-/* ******************************************************************* */
-/* DEFAULT OBJECT PROTOTYPE ENHANCEMENTS */
-/* ******************************************************************* */
-// These functions add useful functionality to built-in objects
-Array.prototype.contains = function(o) {
- var i,l;
- if (!(l = this.length)) { return false; }
- for (i=0; i<l; i++) {
- if (o==this[i]) {
- return true;
- }
- }
-};
-
-/* ******************************************************************* */
-/* DOM FUNCTIONS */
-/* ******************************************************************* */
-var DOM = (function() {
- var dom = {};
-
- // Get a parent tag with a given nodename
- dom.getParentByTagName = function(o,tagNames) {
- if(o==null) { return null; }
- if (isArray(tagNames)) {
- tagNames = map("return $_.toUpperCase()",tagNames);
- while (o=o.parentNode) {
- if (o.nodeName && tagNames.contains(o.nodeName)) {
- return o;
- }
- }
- }
- else {
- tagNames = tagNames.toUpperCase();
- while (o=o.parentNode) {
- if (o.nodeName && tagNames==o.nodeName) {
- return o;
- }
- }
- }
- return null;
- };
-
- // Remove a node from its parent
- dom.removeNode = function(o) {
- if (o!=null && o.parentNode && o.parentNode.removeChild) {
- // First remove all attributes which are func references, to avoid memory leaks
- for (var i in o) {
- if (typeof(o[i])=="function") {
- o[i] = null;
- }
- }
- o.parentNode.removeChild(o);
- return true;
- }
- return false;
- };
-
- // Get the outer width in pixels of an object, including borders, padding, and margin
- dom.getOuterWidth = function(o) {
- if (defined(o.offsetWidth)) {
- return o.offsetWidth;
- }
- return null;
- };
-
- // Get the outer height in pixels of an object, including borders, padding, and margin
- dom.getOuterHeight = function(o) {
- if (defined(o.offsetHeight)) {
- return o.offsetHeight;
- }
- return null;
- };
-
- // Resolve an item, an array of items, or an object of items
- dom.resolve = function() {
- var results = new Array();
- var i,j,o;
- for (var i=0; i<arguments.length; i++) {
- var o = arguments[i];
- if (o==null) {
- if (arguments.length==1) {
- return null;
- }
- results[results.length] = null;
- }
- else if (typeof(o)=='string') {
- if (document.getElementById) {
- o = document.getElementById(o);
- }
- else if (document.all) {
- o = document.all[o];
- }
- if (arguments.length==1) {
- return o;
- }
- results[results.length] = o;
- }
- else if (isArray(o)) {
- for (j=0; j<o.length; j++) {
- results[results.length] = o[j];
- }
- }
- else if (isObject(o)) {
- for (j in o) {
- results[results.length] = o[j];
- }
- }
- else if (arguments.length==1) {
- return o;
- }
- else {
- results[results.length] = o;
- }
- }
- return results;
- };
- dom.$ = dom.resolve;
-
- return dom;
-})();
-
-/* ******************************************************************* */
-/* CSS FUNCTIONS */
-/* ******************************************************************* */
-var CSS = (function(){
- var css = {};
-
- // Convert an RGB string in the form "rgb (255, 255, 255)" to "#ffffff"
- css.rgb2hex = function(rgbString) {
- if (typeof(rgbString)!="string" || !defined(rgbString.match)) { return null; }
- var result = rgbString.match(/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/);
- if (result==null) { return rgbString; }
- var rgb = +result[1] << 16 | +result[2] << 8 | +result[3];
- var hex = "";
- var digits = "0123456789abcdef";
- while(rgb!=0) {
- hex = digits.charAt(rgb&0xf)+hex;
- rgb>>>=4;
- }
- while(hex.length<6) { hex='0'+hex; }
- return "#" + hex;
- };
-
- // Convert hyphen style names like border-width to camel case like borderWidth
- css.hyphen2camel = function(property) {
- if (!defined(property) || property==null) { return null; }
- if (property.indexOf("-")<0) { return property; }
- var str = "";
- var c = null;
- var l = property.length;
- for (var i=0; i<l; i++) {
- c = property.charAt(i);
- str += (c!="-")?c:property.charAt(++i).toUpperCase();
- }
- return str;
- };
-
- // Determine if an object or class string contains a given class.
- css.hasClass = function(obj,className) {
- if (!defined(obj) || obj==null || !RegExp) { return false; }
- var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
- if (typeof(obj)=="string") {
- return re.test(obj);
- }
- else if (typeof(obj)=="object" && obj.className) {
- return re.test(obj.className);
- }
- return false;
- };
-
- // Add a class to an object
- css.addClass = function(obj,className) {
- if (typeof(obj)!="object" || obj==null || !defined(obj.className)) { return false; }
- if (obj.className==null || obj.className=='') {
- obj.className = className;
- return true;
- }
- if (css.hasClass(obj,className)) { return true; }
- obj.className = obj.className + " " + className;
- return true;
- };
-
- // Remove a class from an object
- css.removeClass = function(obj,className) {
- if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
- if (!css.hasClass(obj,className)) { return false; }
- var re = new RegExp("(^|\\s+)" + className + "(\\s+|$)");
- obj.className = obj.className.replace(re,' ');
- return true;
- };
-
- // Fully replace a class with a new one
- css.replaceClass = function(obj,className,newClassName) {
- if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
- css.removeClass(obj,className);
- css.addClass(obj,newClassName);
- return true;
- };
-
- // Get the currently-applied style of an object
- css.getStyle = function(o, property) {
- if (o==null) { return null; }
- var val = null;
- var camelProperty = css.hyphen2camel(property);
- // Handle "float" property as a special case
- if (property=="float") {
- val = css.getStyle(o,"cssFloat");
- if (val==null) {
- val = css.getStyle(o,"styleFloat");
- }
- }
- else if (o.currentStyle && defined(o.currentStyle[camelProperty])) {
- val = o.currentStyle[camelProperty];
- }
- else if (window.getComputedStyle) {
- val = window.getComputedStyle(o,null).getPropertyValue(property);
- }
- else if (o.style && defined(o.style[camelProperty])) {
- val = o.style[camelProperty];
- }
- // For color values, make the value consistent across browsers
- // Convert rgb() colors back to hex for consistency
- if (/^\s*rgb\s*\(/.test(val)) {
- val = css.rgb2hex(val);
- }
- // Lowercase all #hex values
- if (/^#/.test(val)) {
- val = val.toLowerCase();
- }
- return val;
- };
- css.get = css.getStyle;
-
- // Set a style on an object
- css.setStyle = function(o, property, value) {
- if (o==null || !defined(o.style) || !defined(property) || property==null || !defined(value)) { return false; }
- if (property=="float") {
- o.style["cssFloat"] = value;
- o.style["styleFloat"] = value;
- }
- else if (property=="opacity") {
- o.style['-moz-opacity'] = value;
- o.style['-khtml-opacity'] = value;
- o.style.opacity = value;
- if (defined(o.style.filter)) {
- o.style.filter = "alpha(opacity=" + value*100 + ")";
- }
- }
- else {
- o.style[css.hyphen2camel(property)] = value;
- }
- return true;
- };
- css.set = css.setStyle;
-
- // Get a unique ID which doesn't already exist on the page
- css.uniqueIdNumber=1000;
- css.createId = function(o) {
- if (defined(o) && o!=null && defined(o.id) && o.id!=null && o.id!="") {
- return o.id;
- }
- var id = null;
- while (id==null || document.getElementById(id)!=null) {
- id = "ID_"+(css.uniqueIdNumber++);
- }
- if (defined(o) && o!=null && (!defined(o.id)||o.id=="")) {
- o.id = id;
- }
- return id;
- };
-
- return css;
-})();
-
-/* ******************************************************************* */
-/* EVENT FUNCTIONS */
-/* ******************************************************************* */
-
-var Event = (function(){
- var ev = {};
-
- // Resolve an event using IE's window.event if necessary
- // --------------------------------------------------------------------
- ev.resolve = function(e) {
- if (!defined(e) && defined(window.event)) {
- e = window.event;
- }
- return e;
- };
-
- // Add an event handler to a function
- // Note: Don't use 'this' within functions added using this method, since
- // the attachEvent and addEventListener models differ.
- // --------------------------------------------------------------------
- ev.add = function( obj, type, fn, capture ) {
- if (obj.addEventListener) {
- obj.addEventListener( type, fn, capture );
- return true;
- }
- else if (obj.attachEvent) {
- obj.attachEvent( "on"+type, fn );
- return true;
- }
- return false;
- };
-
- // Get the mouse position of an event
- // --------------------------------------------------------------------
- // PageX/Y, where they exist, are more reliable than ClientX/Y because
- // of some browser bugs in Opera/Safari
- ev.getMouseX = function(e) {
- e = ev.resolve(e);
- if (defined(e.pageX)) {
- return e.pageX;
- }
- if (defined(e.clientX)) {
- return e.clientX+Screen.getScrollLeft();
- }
- return null;
- };
- ev.getMouseY = function(e) {
- e = ev.resolve(e);
- if (defined(e.pageY)) {
- return e.pageY;
- }
- if (defined(e.clientY)) {
- return e.clientY+Screen.getScrollTop();
- }
- return null;
- };
-
- // Stop the event from bubbling up to parent elements.
- // Two method names map to the same function
- // --------------------------------------------------------------------
- ev.cancelBubble = function(e) {
- e = ev.resolve(e);
- if (typeof(e.stopPropagation)=="function") { e.stopPropagation(); }
- if (defined(e.cancelBubble)) { e.cancelBubble = true; }
- };
- ev.stopPropagation = ev.cancelBubble;
-
- // Prevent the default handling of the event to occur
- // --------------------------------------------------------------------
- ev.preventDefault = function(e) {
- e = ev.resolve(e);
- if (typeof(e.preventDefault)=="function") { e.preventDefault(); }
- if (defined(e.returnValue)) { e.returnValue = false; }
- };
-
- return ev;
-})();
-
-/* ******************************************************************* */
-/* SCREEN FUNCTIONS */
-/* ******************************************************************* */
-var Screen = (function() {
- var screen = {};
-
- // Get a reference to the body
- // --------------------------------------------------------------------
- screen.getBody = function() {
- if (document.body) {
- return document.body;
- }
- if (document.getElementsByTagName) {
- var bodies = document.getElementsByTagName("BODY");
- if (bodies!=null && bodies.length>0) {
- return bodies[0];
- }
- }
- return null;
- };
-
- // Get the amount that the main document has scrolled from top
- // --------------------------------------------------------------------
- screen.getScrollTop = function() {
- if (document.documentElement && defined(document.documentElement.scrollTop) && document.documentElement.scrollTop>0) {
- return document.documentElement.scrollTop;
- }
- if (document.body && defined(document.body.scrollTop)) {
- return document.body.scrollTop;
- }
- return null;
- };
-
- // Get the amount that the main document has scrolled from left
- // --------------------------------------------------------------------
- screen.getScrollLeft = function() {
- if (document.documentElement && defined(document.documentElement.scrollLeft) && document.documentElement.scrollLeft>0) {
- return document.documentElement.scrollLeft;
- }
- if (document.body && defined(document.body.scrollLeft)) {
- return document.body.scrollLeft;
- }
- return null;
- };
-
- // Util function to default a bad number to 0
- // --------------------------------------------------------------------
- screen.zero = function(n) {
- return (!defined(n) || isNaN(n))?0:n;
- };
-
- // Get the width of the entire document
- // --------------------------------------------------------------------
- screen.getDocumentWidth = function() {
- var width = 0;
- var body = screen.getBody();
- if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
- var rightMargin = parseInt(CSS.get(body,'marginRight'),10) || 0;
- var leftMargin = parseInt(CSS.get(body,'marginLeft'), 10) || 0;
- width = Math.max(body.offsetWidth + leftMargin + rightMargin, document.documentElement.clientWidth);
- }
- else {
- width = Math.max(body.clientWidth, body.scrollWidth);
- }
- if (isNaN(width) || width==0) {
- width = screen.zero(self.innerWidth);
- }
- return width;
- };
-
- // Get the height of the entire document
- // --------------------------------------------------------------------
- screen.getDocumentHeight = function() {
- var body = screen.getBody();
- var innerHeight = (defined(self.innerHeight)&&!isNaN(self.innerHeight))?self.innerHeight:0;
- if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
- var topMargin = parseInt(CSS.get(body,'marginTop'),10) || 0;
- var bottomMargin = parseInt(CSS.get(body,'marginBottom'), 10) || 0;
- return Math.max(body.offsetHeight + topMargin + bottomMargin, document.documentElement.clientHeight, document.documentElement.scrollHeight, screen.zero(self.innerHeight));
- }
- return Math.max(body.scrollHeight, body.clientHeight, screen.zero(self.innerHeight));
- };
-
- // Get the width of the viewport (viewable area) in the browser window
- // --------------------------------------------------------------------
- screen.getViewportWidth = function() {
- if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
- return document.documentElement.clientWidth;
- }
- else if (document.compatMode && document.body) {
- return document.body.clientWidth;
- }
- return screen.zero(self.innerWidth);
- };
-
- // Get the height of the viewport (viewable area) in the browser window
- // --------------------------------------------------------------------
- screen.getViewportHeight = function() {
- if (!window.opera && document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
- return document.documentElement.clientHeight;
- }
- else if (document.compatMode && !window.opera && document.body) {
- return document.body.clientHeight;
- }
- return screen.zero(self.innerHeight);
- };
-
- return screen;
-})();var Sort = (function(){
- var sort = {};
- sort.AlphaNumeric = function(a,b) {
- if (a==b) { return 0; }
- if (a<b) { return -1; }
- return 1;
- };
-
- sort.Default = sort.AlphaNumeric;
-
- sort.NumericConversion = function(val) {
- if (typeof(val)!="number") {
- if (typeof(val)=="string") {
- val = parseFloat(val.replace(/,/g,''));
- if (isNaN(val) || val==null) { val=0; }
- }
- else {
- val = 0;
- }
- }
- return val;
- };
-
- sort.Numeric = function(a,b) {
- return sort.NumericConversion(a)-sort.NumericConversion(b);
- };
-
- sort.IgnoreCaseConversion = function(val) {
- if (val==null) { val=""; }
- return (""+val).toLowerCase();
- };
-
- sort.IgnoreCase = function(a,b) {
- return sort.AlphaNumeric(sort.IgnoreCaseConversion(a),sort.IgnoreCaseConversion(b));
- };
-
- sort.CurrencyConversion = function(val) {
- if (typeof(val)=="string") {
- val = val.replace(/^[^\d\.]/,'');
- }
- return sort.NumericConversion(val);
- };
-
- sort.Currency = function(a,b) {
- return sort.Numeric(sort.CurrencyConversion(a),sort.CurrencyConversion(b));
- };
-
- sort.DateConversion = function(val) {
- // inner util function to parse date formats
- function getdate(str) {
- // inner util function to convert 2-digit years to 4
- function fixYear(yr) {
- yr = +yr;
- if (yr<50) { yr += 2000; }
- else if (yr<100) { yr += 1900; }
- return yr;
- };
- var ret;
- // YYYY-MM-DD
- if (ret=str.match(/(\d{2,4})-(\d{1,2})-(\d{1,2})/)) {
- return (fixYear(ret[1])*10000) + (ret[2]*100) + (+ret[3]);
- }
- // MM/DD/YY[YY] or MM-DD-YY[YY]
- if (ret=str.match(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/)) {
- return (fixYear(ret[3])*10000) + (ret[1]*100) + (+ret[2]);
- }
- return 99999999; // So non-parsed dates will be last, not first
- };
- return getdate(val);
- };
-
- sort.Date = function(a,b) {
- return sort.Numeric(sort.DateConversion(a),sort.DateConversion(b));
- };
-
- return sort;
-})();
-
-var Position = (function() {
- // Resolve a string identifier to an object
- // ========================================
- function resolveObject(s) {
- if (document.getElementById && document.getElementById(s)!=null) {
- return document.getElementById(s);
- }
- else if (document.all && document.all[s]!=null) {
- return document.all[s];
- }
- else if (document.anchors && document.anchors.length && document.anchors.length>0 && document.anchors[0].x) {
- for (var i=0; i<document.anchors.length; i++) {
- if (document.anchors[i].name==s) {
- return document.anchors[i]
- }
- }
- }
- }
-
- var pos = {};
- pos.$VERSION = 1.0;
-
- // Set the position of an object
- // =============================
- pos.set = function(o,left,top) {
- if (typeof(o)=="string") {
- o = resolveObject(o);
- }
- if (o==null || !o.style) {
- return false;
- }
-
- // If the second parameter is an object, it is assumed to be the result of getPosition()
- if (typeof(left)=="object") {
- var pos = left;
- left = pos.left;
- top = pos.top;
- }
-
- o.style.left = left + "px";
- o.style.top = top + "px";
- return true;
- };
-
- // Retrieve the position and size of an object
- // ===========================================
- pos.get = function(o) {
- var fixBrowserQuirks = true;
- // If a string is passed in instead of an object ref, resolve it
- if (typeof(o)=="string") {
- o = resolveObject(o);
- }
-
- if (o==null) {
- return null;
- }
-
- var left = 0;
- var top = 0;
- var width = 0;
- var height = 0;
- var parentNode = null;
- var offsetParent = null;
-
-
- offsetParent = o.offsetParent;
- var originalObject = o;
- var el = o; // "el" will be nodes as we walk up, "o" will be saved for offsetParent references
- while (el.parentNode!=null) {
- el = el.parentNode;
- if (el.offsetParent==null) {
- }
- else {
- var considerScroll = true;
- /*
- In Opera, if parentNode of the first object is scrollable, then offsetLeft/offsetTop already
- take its scroll position into account. If elements further up the chain are scrollable, their
- scroll offsets still need to be added in. And for some reason, TR nodes have a scrolltop value
- which must be ignored.
- */
- if (fixBrowserQuirks && window.opera) {
- if (el==originalObject.parentNode || el.nodeName=="TR") {
- considerScroll = false;
- }
- }
- if (considerScroll) {
- if (el.scrollTop && el.scrollTop>0) {
- top -= el.scrollTop;
- }
- if (el.scrollLeft && el.scrollLeft>0) {
- left -= el.scrollLeft;
- }
- }
- }
- // If this node is also the offsetParent, add on the offsets and reset to the new offsetParent
- if (el == offsetParent) {
- left += o.offsetLeft;
- if (el.clientLeft && el.nodeName!="TABLE") {
- left += el.clientLeft;
- }
- top += o.offsetTop;
- if (el.clientTop && el.nodeName!="TABLE") {
- top += el.clientTop;
- }
- o = el;
- if (o.offsetParent==null) {
- if (o.offsetLeft) {
- left += o.offsetLeft;
- }
- if (o.offsetTop) {
- top += o.offsetTop;
- }
- }
- offsetParent = o.offsetParent;
- }
- }
-
-
- if (originalObject.offsetWidth) {
- width = originalObject.offsetWidth;
- }
- if (originalObject.offsetHeight) {
- height = originalObject.offsetHeight;
- }
-
- return {'left':left, 'top':top, 'width':width, 'height':height
- };
- };
-
- // Retrieve the position of an object's center point
- // =================================================
- pos.getCenter = function(o) {
- var c = this.get(o);
- if (c==null) { return null; }
- c.left = c.left + (c.width/2);
- c.top = c.top + (c.height/2);
- return c;
- };
-
- return pos;
-})();// CLASS CONSTRUCTOR
-// --------------------------------------------------------------------
-var Popup = function(div, options) {
- this.div = defined(div)?div:null;
- this.index = Popup.maxIndex++;
- this.ref = "Popup.objects["+this.index+"]";
- Popup.objects[this.index] = this;
- // Store a reference to the DIV by id, also
- if (typeof(this.div)=="string") {
- Popup.objectsById[this.div] = this;
- }
- if (defined(this.div) && this.div!=null && defined(this.div.id)) {
- Popup.objectsById[this.div.id] = this.div.id;
- }
- // Apply passed-in options
- if (defined(options) && options!=null && typeof(options)=="object") {
- for (var i in options) {
- this[i] = options[i];
- }
- }
- return this;
-};
-
-// CLASS PROPERTIES
-// --------------------------------------------------------------------
-// Index of popup objects, to maintain a global reference if necessary
-Popup.maxIndex = 0;
-Popup.objects = {};
-Popup.objectsById = {};
-
-// The z-index value that popups will start at
-Popup.minZIndex = 101;
-
-// Class names to assign to other objects
-Popup.screenClass = "PopupScreen";
-Popup.iframeClass = "PopupIframe";
-Popup.screenIframeClass = "PopupScreenIframe";
-
-// CLASS METHODS
-// --------------------------------------------------------------------
-
-// Hide all currently-visible non-modal dialogs
-Popup.hideAll = function() {
- for (var i in Popup.objects) {
- var p = Popup.objects[i];
- if (!p.modal && p.autoHide) {
- p.hide();
- }
- }
-};
-// Catch global events as a trigger to hide auto-hide popups
-Event.add(document, "mouseup", Popup.hideAll, false);
-
-// A simple class method to show a popup without creating an instance
-Popup.show = function(divObject, referenceObject, position, options, modal) {
- var popup;
- if (defined(divObject)) {
- popup = new Popup(divObject);
- }
- else {
- popup = new Popup();
- popup.destroyDivOnHide = true;
- }
- if (defined(referenceObject)) { popup.reference = DOM.resolve(referenceObject); }
- if (defined(position)) { popup.position = position; }
- if (defined(options) && options!=null && typeof(options)=="object") {
- for (var i in options) {
- popup[i] = options[i];
- }
- }
- if (typeof(modal)=="boolean") {
- popup.modal = modal;
- }
- popup.destroyObjectsOnHide = true;
- popup.show();
- return popup;
-};
-
-// A simple class method to show a modal popup
-Popup.showModal = function(divObject, referenceObject, position, options) {
- Popup.show(divObject, referenceObject, position, options, true);
-};
-
-// A method to retrieve a popup object based on a div ID
-Popup.get = function(divId) {
- if (defined(Popup.objectsById[divId])) {
- return Popup.objectsById[divId];
- }
- return null;
-};
-
-// A method to hide a popup based on a div id
-Popup.hide = function(divId) {
- var popup = Popup.get(divId);
- if (popup!=null) {
- popup.hide();
- }
-};
-
-// PROTOTYPE PROPERTIES
-// --------------------------------------------------------------------
-Popup.prototype.content = null;
-Popup.prototype.className = "PopupDiv";
-Popup.prototype.style = null; // Styles to be applied to the DIV
-Popup.prototype.width = null;
-Popup.prototype.height = null;
-Popup.prototype.top = null;
-Popup.prototype.left = null;
-Popup.prototype.offsetLeft = 0;
-Popup.prototype.offsetTop = 0;
-Popup.prototype.constrainToScreen = true;
-Popup.prototype.autoHide = true;
-Popup.prototype.useIframeShim = false; /*@cc_on @*/ /*@if (@_win32) {Popup.prototype.useIframeShim = true;} @end @*/
-Popup.prototype.iframe = null;
-Popup.prototype.position = null; // vertical: "above top center bottom below", horizontal: "adjacent-left,left,center,right,adjacent-right"
-Popup.prototype.reference = null;
-Popup.prototype.modal = false;
-Popup.prototype.destroyDivOnHide = false;
-Popup.prototype.destroyObjectsOnHide = false;
-Popup.prototype.screen = null;
-Popup.prototype.screenIframeShim = null;
-Popup.prototype.screenOpacity=.4;
-Popup.prototype.screenColor="#cccccc";
-
-// INSTANCE METHODS
-// --------------------------------------------------------------------
-
-// Show the popup
-// --------------------------------------------------------------------
-Popup.prototype.show = function(options, modal) {
- this.modal = this.modal || (typeof(modal)=="boolean" && modal);
- if (defined(options) && options!=null && typeof(options)=="object") {
- for (var i in options) {
- this[i] = options[i];
- }
- }
- this.div = DOM.resolve(this.div);
- CSS.setStyle(this.div,'position','absolute');
-
- // If there is no div pre-defined to use, create one
- if (this.div==null) {
- this.div = this.createDiv();
- }
- if (this.content!=null) {
- this.div.innerHTML = this.content;
- this.content = null;
- }
- if (this.className!=null) {
- this.div.className = this.className;
- }
- if (this.style!=null) {
- this.applyStyle();
- }
- if (this.width!=null) {
- this.div.style.width = this.width+"px";
- this.div.style.overflowX="auto";
- }
- if (this.height!=null) {
- this.div.style.height = this.height+"px";
- this.div.style.overflowY="auto";
- }
-
- // Do the actual display - this is a separate method so display transitions can be implemented
- this.transition();
-
- // Make sure clicks on the DIV don't bubble up to the document
- this.div.onclick = function(e) {
- Event.cancelBubble(Event.resolve(e));
- };
- this.div.onmouseup = this.div.onclick;
-
- // Focus to the DIV if possible
- if (this.modal && this.div.focus) {
- this.div.focus();
- }
-};
-
-// Show the popup but make it modal
-// --------------------------------------------------------------------
-Popup.prototype.transition = function() {
- if (this.modal) {
- this.addScreen();
- }
-
- // Make the DIV displayed but hidden so its size can be measured
- CSS.setStyle(this.div,'visibility','hidden');
- CSS.setStyle(this.div,'display','block');
-
- // Position the popup
- this.setPosition();
-
- // Add the shim if necessary
- if (this.useIframeShim) {
- this.addIframeShim();
- }
-
- // Make sure the DIV is higher than the shim
- this.div.style.zIndex = Popup.minZIndex++;
-
- CSS.setStyle(this.div,'display','block');
- CSS.setStyle(this.div,'visibility','visible');
-};
-
-// Show the popup but make it modal
-// --------------------------------------------------------------------
-Popup.prototype.showModal = function(options) {
- this.show(options,true);
-};
-
-// Apply user styles to the DIV
-// --------------------------------------------------------------------
-Popup.prototype.applyStyle = function() {
- if (this.div!=null && this.style!=null && typeof(this.style)=="object") {
- for (var i in this.style) {
- this.div.style[i] = this.style[i];
- }
- }
-};
-
-// Hide the popup
-// --------------------------------------------------------------------
-Popup.prototype.hide = function() {
- // If this was a temp object creating on-the-fly, then remove objects from the DOM so
- // The document doesn't get littered with extra objects
- if (this.destroyDivOnHide) {
- DOM.removeNode(this.div);
- this.div = null;
- delete Popup.objects[this.id];
- }
- else if (this.div!=null) {
- CSS.setStyle(this.div,'display','none');
- }
-
- if (this.destroyObjectsOnHide) {
- DOM.removeNode(this.iframe);
- DOM.removeNode(this.screen);
- DOM.removeNode(this.screenIframeShim);
- }
- else {
- if (this.iframe!=null) {
- this.iframe.style.display = "none";
- }
- if (this.screen!=null) {
- this.screen.style.display = "none";
- }
- if (this.screenIframeShim!=null) {
- this.screenIframeShim.style.display = "none";
- }
- }
-};
-
-// Util funcs for position
-// --------------------------------------------------------------------
-Popup.prototype.setTop = function(top) {
- this.div.style.top = top+"px";
-};
-Popup.prototype.setLeft = function(left) {
- this.div.style.left = left+"px";
-};
-Popup.prototype.getTop = function() {
- return parseInt(CSS.getStyle(this.div,"top"),10);
-};
-Popup.prototype.getLeft = function() {
- return parseInt(CSS.getStyle(this.div,"left"),10);
-};
-
-// All the logic to position the popup based on various criteria
-// --------------------------------------------------------------------
-Popup.prototype.setPosition = function() {
- if (this.position!=null) {
- var m = this.position.match(/^(\S+)\s+(\S+)/);
- if (m!=null && m.length==3) {
- var v = m[1];
- var h = m[2];
-
- var ref = this.reference;
- if (ref==null) { ref = Screen.getBody(); }
- var p = Position.get(ref);
- var refTop = p.top;
- var refLeft = p.left;
- var refWidth = DOM.getOuterWidth(ref);
- var refHeight = DOM.getOuterHeight(ref);
-
- var width = DOM.getOuterWidth(this.div);
- var height = DOM.getOuterHeight(this.div);
-
- var scrollLeft = Screen.getScrollLeft();
- var scrollTop = Screen.getScrollTop();
-
- // Set vertical position relative to reference object
- if (v=="above") { this.setTop(refTop-height+this.offsetTop); }
- else if (v=="top") { this.setTop(refTop+this.offsetTop); }
- else if (v=="center") { this.setTop(refTop+(refHeight/2)-(height/2)+this.offsetTop); }
- else if (v=="bottom") { this.setTop(refTop+refHeight-height+this.offsetTop); }
- else if (v=="below") { this.setTop(refTop+refHeight+this.offsetTop); }
-
- // Set horizontal position relative to reference object
- if (h=="adjacent-left") { this.setLeft(refLeft-width+this.offsetLeft); }
- else if (h=="left") { this.setLeft(refLeft+this.offsetLeft); }
- else if (h=="center") { this.setLeft(refLeft+(refWidth/2)-(width/2)+this.offsetLeft); }
- else if (h=="right") { this.setLeft(refLeft+refWidth-width+this.offsetLeft); }
- else if (h=="adjacent-right") { this.setLeft(refLeft+refWidth+this.offsetLeft); }
- }
- }
- else if (this.top==null && this.left==null) {
- this.center();
- }
- else {
- if (this.top==null) { this.top=0; }
- if (this.left==null) { this.left=0; }
- this.div.style.top = this.top+this.offsetTop+"px";
- this.div.style.left = this.left+this.offsetLeft+"px";
- }
-
- // Re-position to make sure it stays on the screen
- if (this.constrainToScreen) {
- this.fitToScreen();
- }
-};
-
-// Append an object to the body
-// --------------------------------------------------------------------
-Popup.prototype.appendToBody = function(o) {
- var body = Screen.getBody();
- if (body && body.appendChild) {
- body.appendChild(o);
- }
-};
-
-// Create a new DIV object to be used for a popup
-// --------------------------------------------------------------------
-Popup.prototype.createDiv = function() {
- if (document.createElement) {
- var d = document.createElement("DIV");
- d.style.position="absolute";
- d.style.display="block";
- d.style.visibility="hidden";
- this.appendToBody(d);
- return d;
- }
- alert("ERROR: Couldn't create DIV element in Popup.prototype.createDiv()");
- return null;
-};
-
-// Create a new IFRAME object to be used behind the popup
-// --------------------------------------------------------------------
-Popup.prototype.createIframe = function() {
- if (document.createElement) {
- var i= document.createElement("IFRAME");
- i.style.position="absolute";
- i.style.display="block";
- i.style.visibility="hidden";
- i.style.background="none";
- this.appendToBody(i);
- return i;
- }
- else {
- alert("ERROR: Couldn't create IFRAME object in Popup.prototype.createIframe()");
- }
-};
-
-// Add an IFRAME shim for the DIV
-// --------------------------------------------------------------------
-Popup.prototype.addIframeShim = function() {
- if (this.iframe==null) {
- this.iframe = this.createIframe();
- }
- this.iframe.className = Popup.iframeClass;
- CSS.setStyle(this.iframe,'top',this.getTop()+"px");
- CSS.setStyle(this.iframe,'left',this.getLeft()+"px");
- CSS.setStyle(this.iframe,'width',DOM.getOuterWidth(this.div) + "px");
- CSS.setStyle(this.iframe,'height',DOM.getOuterHeight(this.div) + "px");
- CSS.setStyle(this.iframe,'zIndex',Popup.minZIndex++);
- CSS.setStyle(this.iframe,'opacity',0);
- CSS.setStyle(this.iframe,'visibility','visible');
- CSS.setStyle(this.iframe,'display','block');
-};
-
-// Create a "screen" to make a popup modal
-// --------------------------------------------------------------------
-Popup.prototype.addScreen = function() {
- if (this.screen==null) {
- this.screen = this.createDiv();
- this.screen.style.top="0px";
- this.screen.style.left="0px";
- this.screen.style.backgroundColor = this.screenColor;
- this.screen.className=Popup.screenClass;;
- CSS.setStyle(this.screen,"opacity",this.screenOpacity);
- this.screen.onclick = function(e) { Event.cancelBubble(Event.resolve(e)); }
- }
- if (this.screenIframeShim==null) {
- this.screenIframeShim = this.createIframe();
- this.screenIframeShim.style.top="0px";
- this.screenIframeShim.style.left="0px";
- this.screenIframeShim.className=Popup.screenIframeClass;
- CSS.setStyle(this.screenIframeShim,"opacity",0);
- }
- this.screen.style.width = Screen.getDocumentWidth()+"px";
- this.screen.style.height = Screen.getDocumentHeight()+"px";
- this.screenIframeShim.style.width = Screen.getDocumentWidth()+"px";
- this.screenIframeShim.style.height = Screen.getDocumentHeight()+"px";
- this.screenIframeShim.style.zIndex = Popup.minZIndex++;
- this.screenIframeShim.style.visibility="visible";
- this.screenIframeShim.style.display="block";
- this.screen.style.zIndex = Popup.minZIndex++;
- this.screen.style.visibility="visible";
- this.screen.style.display="block";
-};
-
-// Re-position the DIV so it stays on the screen
-// --------------------------------------------------------------------
-Popup.prototype.fitToScreen = function() {
- var width = DOM.getOuterWidth(this.div);
- var height = DOM.getOuterHeight(this.div);
- var top = this.getTop();
- var left = this.getLeft();
-
- var clientWidth = Screen.getViewportWidth();
- var clientHeight = Screen.getViewportHeight();
-
- var scrollLeft = Screen.getScrollLeft();
- var scrollTop = Screen.getScrollTop();
-
- if (top-scrollTop+height>clientHeight) {
- top = top - ((top+height) - (scrollTop+clientHeight));
- this.div.style.top = top + "px";
- }
- if (left-scrollLeft+width>clientWidth) {
- left = left - ((left+width) - (scrollLeft+clientWidth));
- this.div.style.left = left + "px";
- }
- if (top<scrollTop) {
- this.div.style.top=scrollTop+"px";
- }
- if (left<scrollLeft) {
- this.div.style.left=scrollLeft+"px";
- }
-};
-
-// Center the DIV object
-// --------------------------------------------------------------------
-Popup.prototype.center = function() {
- var left = DOM.getOuterWidth(this.div);
- var top = DOM.getOuterHeight(this.div);
- if (isNaN(left)) { left=0; }
- if (isNaN(top)) { top=0; }
- var clientW = Screen.getViewportWidth();
- var clientH = Screen.getViewportHeight();
- if (clientW!=null && clientH!=null) {
- top = (clientH-top)/2;
- left = (clientW-left)/2;
- }
- top += Screen.getScrollTop();
- left += Screen.getScrollLeft();
-
- this.div.style.top = top+this.offsetTop+"px";
- this.div.style.left = left+this.offsetLeft+"px";
-};
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="html" version="1.0" encoding="UTF-8"
- indent="yes" />
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "./style/tests.css";
- </STYLE>
- <head>
- <script type="text/javascript" src="./style/jquery.min.js" />
- </head>
- <body>
- <div id="testcasepage">
- <div id="title">
- <table>
- <tr>
- <td>
- <h1>TCT Report</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="overview">
- <table>
- <tr>
- <td>
- <div id="summary">
- <table>
- <tr>
- <th colspan="2">Test Summary</th>
- </tr>
- <tr>
- <td>TCT Version</td>
- <td>
- <xsl:value-of select="result_summary/environment/@tct_version" />
- </td>
- </tr>
- <tr>
- <td>Test Plan Name</td>
- <td>
- <xsl:value-of select="result_summary/@plan_name" />
- </td>
- </tr>
- <tr>
- <td>Test Profile</td>
- <td>
- <xsl:value-of select="result_summary/environment/@tct_profile" />
- </td>
- </tr>
- <tr>
- <td>Build ID</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@build_id">
- <xsl:if test="result_summary/environment/@build_id = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@build_id" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Test Total</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/total_case)" />
- </td>
- </tr>
- <tr>
- <td>Test Passed</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/pass_case)" />
- </td>
- </tr>
- <tr>
- <td>Test Failed</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/fail_case)" />
- </td>
- </tr>
- <tr>
- <td>Test Blocked</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/block_case)" />
- </td>
- </tr>
- <tr>
- <td>Test Not Executed</td>
- <td>
- <xsl:value-of select="sum(result_summary//suite/na_case)" />
- </td>
- </tr>
- <tr>
- <td>Time</td>
- <td>
- <xsl:value-of select="result_summary/summary/start_at" />
- ~
- <xsl:value-of select="result_summary/summary/end_at" />
- </td>
- </tr>
- </table>
- </div>
- </td>
- <td>
- <div id="device">
- <table>
- <tr>
- <th colspan="2">Device Information</th>
- </tr>
- <tr>
- <td>Host Device</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@host">
- <xsl:if test="result_summary/environment/@host = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@host" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Manufacturer</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@manufacturer">
- <xsl:if test="result_summary/environment/@manufacturer = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@manufacturer" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Device Model</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@device_model">
- <xsl:if test="result_summary/environment/@device_model = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@device_model" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Device ID</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@device_id">
- <xsl:if test="result_summary/environment/@device_id = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@device_id" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Screen Size</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@screen_size">
- <xsl:if test="result_summary/environment/@screen_size = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@screen_size" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Resolution</td>
- <td>
- <xsl:choose>
- <xsl:when test="result_summary/environment/@resolution">
- <xsl:if test="result_summary/environment/@resolution = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="result_summary/environment/@resolution" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- </table>
- </div>
- </td>
- </tr>
- </table>
- </div>
- <div id="capability">
- <div id="title">
- <a name="contents"></a>
- <table>
- <tr>
- <td class="title">
- <h1><a href="#" class="see_capabilities">Device Capability</a></h1>
- </td>
- </tr>
- </table>
- </div>
- <xsl:choose>
- <xsl:when test="result_summary/capabilities">
- <div id="capability_table" style="display:none;">
- <table>
- <tr>
- <th>Capability Name</th>
- <th>Type</th>
- <th>Value</th>
- </tr>
- <xsl:for-each select="result_summary/capabilities/capability">
- <xsl:sort select="@name" />
- <tr>
- <td>
- <xsl:value-of select="@name" />
- </td>
- <td>
- <xsl:value-of select="@type" />
- </td>
- <td>
- <xsl:choose>
- <xsl:when test="value">
- <xsl:value-of select="value" />
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="@support" />
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </div>
- </xsl:when>
- <xsl:otherwise>
- The information of device capability is not available.
- </xsl:otherwise>
- </xsl:choose>
- </div>
- <div id="btc">
- <table>
- <tr>
- <td>
- <a href="#" class="see_all">Show all</a>
- </td>
- <td>
- <a href="#" class="see_failed">Show only failed</a>
- </td>
- <td>
- <a href="#" class="see_blocked">Show only blocked</a>
- </td>
- <td>
- <a href="#" class="see_na">Show only not executed</a>
- </td>
- </tr>
- </table>
- </div>
- <div id="title">
- <h1></h1>
- </div>
- <div id="suite_summary">
- <div id="title">
- <a name="contents"></a>
- <table>
- <tr>
- <td class="title">
- <h1>Test Summary by Suite</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="see_all">
- <table>
- <tr>
- <th>Suite</th>
- <th>Total</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Executed</th>
- <th class="Ratio">Ratio</th>
- </tr>
- <xsl:for-each select="result_summary/suite">
- <xsl:if test="total_case > 0">
- <tr class="suite_item">
- <xsl:attribute name="id">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- <td>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@name" />.xml</xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td class="total">
- <xsl:value-of select="total_case" />
- </td>
- <td class="pass">
- <xsl:value-of select="pass_case" />
- </td>
- <td class="fail">
- <xsl:value-of select="fail_case" />
- </td>
- <td class="block">
- <xsl:value-of select="block_case" />
- </td>
- <td class="na">
- <xsl:value-of select="na_case" />
- </td>
- <td class="Ratio">
- <div class="RatioGraphic" />
- </td>
- </tr>
- </xsl:if>
- </xsl:for-each>
- </table>
- </div>
- <div id="see_fail" style="display:none;">
- <table>
- <tr>
- <th>Suite</th>
- <th>Total</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Executed</th>
- <th class="Ratio">Ratio</th>
- </tr>
- <xsl:for-each select="result_summary/suite">
- <xsl:if test="fail_case > 0">
- <tr class="suite_item">
- <xsl:attribute name="id">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- <td>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@name" />.xml</xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td class="total">
- <xsl:value-of select="total_case" />
- </td>
- <td class="pass">
- <xsl:value-of select="pass_case" />
- </td>
- <td class="fail">
- <xsl:value-of select="fail_case" />
- </td>
- <td class="block">
- <xsl:value-of select="block_case" />
- </td>
- <td class="na">
- <xsl:value-of select="na_case" />
- </td>
- <td class="Ratio">
- <div class="RatioGraphic" />
- </td>
- </tr>
- </xsl:if>
- </xsl:for-each>
- </table>
- </div>
- <div id="see_block" style="display:none;">
- <table>
- <tr>
- <th>Suite</th>
- <th>Total</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Executed</th>
- <th class="Ratio">Ratio</th>
- </tr>
- <xsl:for-each select="result_summary/suite">
- <xsl:if test="block_case > 0">
- <tr class="suite_item">
- <xsl:attribute name="id">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- <td>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@name" />.xml</xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td class="total">
- <xsl:value-of select="total_case" />
- </td>
- <td class="pass">
- <xsl:value-of select="pass_case" />
- </td>
- <td class="fail">
- <xsl:value-of select="fail_case" />
- </td>
- <td class="block">
- <xsl:value-of select="block_case" />
- </td>
- <td class="na">
- <xsl:value-of select="na_case" />
- </td>
- <td class="Ratio">
- <div class="RatioGraphic" />
- </td>
- </tr>
- </xsl:if>
- </xsl:for-each>
- </table>
- </div>
- <div id="see_na" style="display:none;">
- <table>
- <tr>
- <th>Suite</th>
- <th>Total</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Executed</th>
- <th class="Ratio">Ratio</th>
- </tr>
- <xsl:for-each select="result_summary/suite">
- <xsl:if test="na_case > 0">
- <tr class="suite_item">
- <xsl:attribute name="id">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- <td>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@name" />.xml</xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td class="total">
- <xsl:value-of select="total_case" />
- </td>
- <td class="pass">
- <xsl:value-of select="pass_case" />
- </td>
- <td class="fail">
- <xsl:value-of select="fail_case" />
- </td>
- <td class="block">
- <xsl:value-of select="block_case" />
- </td>
- <td class="na">
- <xsl:value-of select="na_case" />
- </td>
- <td class="Ratio">
- <div class="RatioGraphic" />
- </td>
- </tr>
- </xsl:if>
- </xsl:for-each>
- </table>
- </div>
- </div>
- </div>
- <div id="goTopBtn">
- <img border="0" src="./style/back_top.png" />
- </div>
- <script type="text/javascript" src="./style/application.js" />
- <script language="javascript" type="text/javascript">
- $(document).ready(function(){
- goTopEx();
- drawRatio();
- });
- </script>
- </body>
- </html>
- </xsl:template>
- <xsl:template name="br-replace">
- <xsl:param name="word" />
- <xsl:variable name="cr">
- <xsl:text>\n</xsl:text>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="contains($word,$cr)">
- <xsl:value-of select="substring-before($word,$cr)" />
- <br />
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word" select="substring-after($word,$cr)" />
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$word" />
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="html" version="1.0" encoding="UTF-8"
- indent="yes" />
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "./style/tests.css";
- </STYLE>
- <head>
- <script type="text/javascript" src="./style/jquery.min.js" />
- <script type="text/javascript" src="./style/popup.js" />
- </head>
- <body>
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1 align="center">Suite Test Results</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="btc">
- <table>
- <tr>
- <td>
- <a href="#" class="see_all">Show all</a>
- </td>
- <td>
- <a href="#" class="see_failed">Show only failed</a>
- </td>
- <td>
- <a href="#" class="see_blocked">Show only blocked</a>
- </td>
- <td>
- <a href="#" class="see_na">Show only not executed</a>
- </td>
- <td>
- <a href="summary.xml">Summary</a>
- </td>
- </tr>
- </table>
- </div>
- <div id="testcasepage">
- <div id="cases">
- <div id="see_all">
- <xsl:for-each select="test_definition/suite">
- <div id="suite_title">
- <h2>
- Test Suite:
- <xsl:value-of select="@name" />
- (All)
- </h2>
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <tr>
- <xsl:choose>
- <xsl:when test="@name">
- <td colspan="3">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- <td colspan="1">
- <h4>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@set_debug_msg" /></xsl:attribute>
- dlog
- </a>
- </h4>
- </td>
- </xsl:when>
- <xsl:otherwise>
- <td colspan="4">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- </xsl:otherwise>
- </xsl:choose>
- </tr>
- <xsl:for-each select=".//testcase">
- <tr>
- <td>
- <div
- style="background-color:#F5DEB3;border:1px solid black;display:none;">
- <xsl:attribute name="id"><xsl:value-of
- select="@id" /></xsl:attribute>
- <p>
- <xsl:for-each select="./description/steps//step">
- <xsl:sort select="@order" />
- <B>
- Step
- <xsl:value-of select="@order" />
- :
- </B>
- <br />
- <xsl:value-of select=".//step_desc" />
- <br />
- <B>Expected:</B>
- <xsl:value-of select=".//expected" />
- <br />
- </xsl:for-each>
- </p>
- <p>
- <br />
- <B>
- Entry:
- <br />
- </B>
- <xsl:value-of select="./description//test_script_entry" />
- <br />
- </p>
- </div>
- <a href="#" class="test_case_popup">
- <xsl:attribute name="id"><xsl:value-of
- select="@id" /></xsl:attribute>
- <xsl:value-of select="@id" />
- </a>
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <xsl:choose>
- <xsl:when test="@result">
- <xsl:if test="@result = 'FAIL'">
- <td class="red_rate">
- <xsl:value-of select="@result" />
- </td>
- </xsl:if>
- <xsl:if test="@result = 'PASS'">
- <td class="green_rate">
- <xsl:value-of select="@result" />
- </td>
- </xsl:if>
- <xsl:if test="@result = 'BLOCK' ">
- <td class="orange_rate">
- BLOCK
- </td>
- </xsl:if>
- <xsl:if
- test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
- <td class="gray_rate">
- Not Run
- </td>
- </xsl:if>
- </xsl:when>
- <xsl:otherwise>
- <td>
-
- </td>
- </xsl:otherwise>
- </xsl:choose>
- <td>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word"
- select=".//result_info/stdout" />
- </xsl:call-template>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- <div id="see_fail" style="display:none;">
- <xsl:for-each select="test_definition/suite">
- <div id="suite_title">
- <h2>
- Test Suite:
- <xsl:value-of select="@name" />
- (Failed only)
- </h2>
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <tr>
- <xsl:choose>
- <xsl:when test="@name">
- <td colspan="3">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- <td colspan="1">
- <h4>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@set_debug_msg" /></xsl:attribute>
- dlog
- </a>
- </h4>
- </td>
- </xsl:when>
- <xsl:otherwise>
- <td colspan="4">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- </xsl:otherwise>
- </xsl:choose>
- </tr>
- <xsl:for-each select=".//testcase[@result='FAIL']">
- <tr>
- <td>
- <div
- style="background-color:#F5DEB3;border:1px solid black;display:none;">
- <xsl:attribute name="id">fail_<xsl:value-of
- select="@id" /></xsl:attribute>
- <p>
- <xsl:for-each select="./description/steps//step">
- <xsl:sort select="@order" />
- <B>
- Step
- <xsl:value-of select="@order" />
- :
- </B>
- <br />
- <xsl:value-of select=".//step_desc" />
- <br />
- <B>Expected:</B>
- <xsl:value-of select=".//expected" />
- <br />
- </xsl:for-each>
- </p>
- <p>
- <br />
- <B>
- Entry:
- <br />
- </B>
- <xsl:value-of select="./description//test_script_entry" />
- <br />
- </p>
- </div>
- <a href="#" class="test_case_popup">
- <xsl:attribute name="id">fail_<xsl:value-of
- select="@id" /></xsl:attribute>
- <xsl:value-of select="@id" />
- </a>
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <td class="red_rate">
- <xsl:value-of select="@result" />
- </td>
- <td>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word"
- select=".//result_info/stdout" />
- </xsl:call-template>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- <div id="see_block" style="display:none;">
- <xsl:for-each select="test_definition/suite">
- <div id="suite_title">
- <h2>
- Test Suite:
- <xsl:value-of select="@name" />
- (Blocked Only)
- </h2>
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <tr>
- <xsl:choose>
- <xsl:when test="@name">
- <td colspan="3">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- <td colspan="1">
- <h4>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@set_debug_msg" /></xsl:attribute>
- dlog
- </a>
- </h4>
- </td>
- </xsl:when>
- <xsl:otherwise>
- <td colspan="4">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- </xsl:otherwise>
- </xsl:choose>
- </tr>
- <xsl:for-each select=".//testcase[@result='BLOCK']">
- <tr>
- <td>
- <div
- style="background-color:#F5DEB3;border:1px solid black;display:none;">
- <xsl:attribute name="id">block_<xsl:value-of
- select="@id" /></xsl:attribute>
- <p>
- <xsl:for-each select="./description/steps//step">
- <xsl:sort select="@order" />
- <B>
- Step
- <xsl:value-of select="@order" />
- :
- </B>
- <br />
- <xsl:value-of select=".//step_desc" />
- <br />
- <B>Expected:</B>
- <xsl:value-of select=".//expected" />
- <br />
- </xsl:for-each>
- </p>
- <p>
- <br />
- <B>
- Entry:
- <br />
- </B>
- <xsl:value-of select="./description//test_script_entry" />
- <br />
- </p>
- </div>
- <a href="#" class="test_case_popup">
- <xsl:attribute name="id">block_<xsl:value-of
- select="@id" /></xsl:attribute>
- <xsl:value-of select="@id" />
- </a>
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <td class="orange_rate">
- <xsl:value-of select="@result" />
- </td>
- <td>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word"
- select=".//result_info/stdout" />
- </xsl:call-template>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- <div id="see_na" style="display:none;">
- <xsl:for-each select="test_definition/suite">
- <div id="suite_title">
- <h2>
- Test Suite:
- <xsl:value-of select="@name" />
- (Not executed Only)
- </h2>
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <tr>
- <xsl:choose>
- <xsl:when test="@name">
- <td colspan="3">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- <td colspan="1">
- <h4>
- <a>
- <xsl:attribute name="href"><xsl:value-of
- select="@set_debug_msg" /></xsl:attribute>
- dlog
- </a>
- </h4>
- </td>
- </xsl:when>
- <xsl:otherwise>
- <td colspan="4">
- <h3>
- Test Set:
- <xsl:value-of select="@name" />
- </h3>
- </td>
- </xsl:otherwise>
- </xsl:choose>
- </tr>
- <xsl:for-each select=".//testcase[@result='N/A']">
- <tr>
- <td>
- <div
- style="background-color:#F5DEB3;border:1px solid black;display:none;">
- <xsl:attribute name="id">na_<xsl:value-of
- select="@id" /></xsl:attribute>
- <p>
- <xsl:for-each select="./description/steps//step">
- <xsl:sort select="@order" />
- <B>
- Step
- <xsl:value-of select="@order" />
- :
- </B>
- <br />
- <xsl:value-of select=".//step_desc" />
- <br />
- <B>Expected:</B>
- <xsl:value-of select=".//expected" />
- <br />
- </xsl:for-each>
- </p>
- <p>
- <br />
- <B>
- Entry:
- <br />
- </B>
- <xsl:value-of select="./description//test_script_entry" />
- <br />
- </p>
- </div>
- <a href="#" class="test_case_popup">
- <xsl:attribute name="id">na_<xsl:value-of
- select="@id" /></xsl:attribute>
- <xsl:value-of select="@id" />
- </a>
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <td class="gray_rate">
- <xsl:value-of select="@result" />
- </td>
- <td>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word"
- select=".//result_info/stdout" />
- </xsl:call-template>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- </div>
- </div>
- <div id="goTopBtn">
- <img border="0" src="./style/back_top.png" />
- </div>
- <script type="text/javascript" src="./style/application.js" />
- <script language="javascript" type="text/javascript">
- $(document).ready(function(){
- goTopEx();
- });
- </script>
- </body>
- </html>
- </xsl:template>
- <xsl:template name="br-replace">
- <xsl:param name="word" />
- <xsl:variable name="cr">
- <xsl:text>\n</xsl:text>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="contains($word,$cr)">
- <xsl:value-of select="substring-before($word,$cr)" />
- <br />
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word" select="substring-after($word,$cr)" />
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$word" />
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-</xsl:stylesheet>
+++ /dev/null
-@charset "UTF-8";\r
-/* CSS Document */\r
-#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td\r
- {\r
- margin: 0;\r
- padding: 0;\r
- border: 0;\r
- font-weight: inherit;\r
- font-style: inherit;\r
- font-size: 0.96em;\r
- font-family: arial;\r
- vertical-align: baseline;\r
-}\r
-\r
-#title td, #btc td{\r
- margin: 0;\r
- padding: 0;\r
- border: 0;\r
- font-weight: inherit;\r
- font-style: inherit;\r
- font-size: 0.96em;\r
- font-family: arial;\r
- vertical-align: baseline;\r
-}\r
-\r
-td.Ratio {\r
- text-align: left;\r
- font-weight: normal;\r
- padding: 4px 10px 4px 5px;\r
- vertical-align: middle;\r
-}\r
-\r
-th.Ratio {\r
- width: 400px;\r
-}\r
-\r
-#testcasepage p {\r
- text-align: left;\r
-}\r
-\r
-#suite_title {\r
- text-align: left;\r
-}\r
-\r
-#btc {\r
- text-align: right;\r
-}\r
-\r
-#btc table {\r
- position: absolute;\r
- right: 0px;\r
- width: 600px;\r
-}\r
-\r
-#testcasepage table {\r
- border-collapse: separate;\r
- border-spacing: 0;\r
- margin-bottom: 1.4em;\r
- vertical-align: middle;\r
-}\r
-\r
-#testcasepage th,#testcasepage td {\r
- text-align: left;\r
- font-weight: normal;\r
- padding: 4px 10px 4px 5px;\r
- vertical-align: middle;\r
-}\r
-\r
-#cases table {\r
- width: 101%;\r
-}\r
-\r
-#cases td {\r
- border-left: 0px;\r
- font-weight: normal;\r
- border-bottom: 0px;\r
-}\r
-\r
-#suite_summary table {\r
- width: 100%;\r
-}\r
-\r
-\r
-#overview table {\r
- width: 101%;\r
-}\r
-\r
-#overview table, #overview td, #overview tr {\r
- border-left: none;\r
- border-bottom: none;\r
- border-right: none;\r
- vertical-align: top;\r
-}\r
-\r
-#overview td{\r
- width: 50%;\r
-}\r
-\r
-#capability table {\r
- width: 50%;\r
-}\r
-\r
-#fail_cases table {\r
- width: 101%;\r
-}\r
-\r
-#title table {\r
- width: 101%;\r
-}\r
-\r
-#device table {\r
- width: 100%;\r
-}\r
-\r
-#summary table {\r
- width: 100%;\r
-}\r
-\r
-#testcasepage th {\r
- border-bottom: 1px solid #000;\r
- background-color: #AAAAAA;\r
- border-left: 1px solid #000;\r
- border-top: 1px solid #000;\r
- color: #000;\r
- font-weight: bold;\r
- vertical-align: bottom;\r
-}\r
-\r
-#summary th:last-child,#summary td:last-child, #device th:last-child,#device td:last-child, #suite_summary th:last-child,#suite_summary td:last-child,#cases th:last-child,#cases td:last-child,#capability th:last-child,#capability td:last-child {\r
- border-right: 1px solid #000;\r
-}\r
-\r
-#testcasepage td {\r
- font-weight: normal;\r
-}\r
-\r
-#summary td, #device td, #capability td, #suite_summary td, #cases td{\r
- border-left: 1px solid;\r
- font-weight: normal;\r
- border-bottom: 1px solid;\r
-}\r
-\r
-#testcasepage td.yellow_rate {\r
- background-color: #ffcc00;\r
-}\r
-\r
-#testcasepage td.green_rate {\r
- background-color: #1E90FF;\r
-}\r
-\r
-#testcasepage td.dgreen_rate {\r
- background-color: #339933;\r
-}\r
-\r
-#testcasepage td.red_rate {\r
- background-color: #FF3333;\r
-}\r
-\r
-#testcasepage td.orange_rate {\r
- background-color: #FFA500;\r
-}\r
-\r
-#testcasepage td.gray_rate {\r
- background-color: #AAAAAA;\r
-}\r
-\r
-#title table,#title tr,#title td {\r
- border-left: none;\r
- border-bottom: none;\r
- text-align: center;\r
-}\r
-\r
-#title td:last-child {\r
- border-right: none;\r
-}\r
-\r
-#testcasepage h1 {\r
- font-size: 2em;\r
- font-family: Arial, sans-serif;\r
- font-weight: bold;\r
- line-height: 1;\r
- color: #000;\r
- margin-bottom: 0.75em;\r
- padding-top: 0.25em;\r
- font-weight: bold;\r
-}\r
-\r
-#goTopBtn {\r
- right: 0px;\r
- bottom: 0px;\r
- position: fixed; +\r
- position: absolute;\r
- top: expression(parseInt(document.body.scrollTop)+document.body.clientHeight-40\r
- );\r
-}\r
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Tang, Shaofeng <shaofeng.tang@intel.com>
-
-
-import sys
-from tctshell.plan_options import PlanGeneratorOptions
-from tctshell.plan_runner import PlanRunner
-
-
-def main():
- wrapper = PlanGeneratorOptions()
- wrapper.parse_options(sys.argv)
- output = wrapper.get_output()
-
- runner = PlanRunner()
- runner.load_local_repo(wrapper.get_repository_folder(), \
- wrapper.get_tizenV(), wrapper.get_match_regex(), \
- wrapper.get_unmatch_regex(), wrapper.get_plan_name(),\
- wrapper.get_profile_name(), wrapper.get_execute_type())
-
- runner.to_xml(output)
-
-if __name__ == "__main__":
- main()
+++ /dev/null
-#!/usr/bin/python
-
-import sys
-from tctshell.scenario_options import ScenarioGeneratorOptions
-from tctshell.scenario_runner import ScenarioRunner
-
-
-def main():
- wrapper = ScenarioGeneratorOptions()
- wrapper.parse_options(sys.argv)
- output = wrapper.get_output()
- runner = ScenarioRunner()
- runner.load_local_repo(wrapper.get_planlist_args(), \
- wrapper.get_plansrc_folder(), wrapper.get_scen_name(), \
- wrapper.getPlanList(), wrapper.getDeviceList())
-
- runner.to_xml(output)
-
-if __name__ == "__main__":
- main()
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Tang, Shaofeng <shaofeng.tang@intel.com>
-
-import os
-import sys
-import traceback
-import timeit
-import logging
-import threading
-
-from tctshell.shellwrapper import ShellWrapper
-from tctshell.intention_generator import IntentionGenerator
-from tctshell.shellplanner import MultiRunnPlan
-from tctshell.shellworker import PlanExecutor
-from tctshell.distribute_plan import AutoPlanExecutor
-from tctshell.result_manager import ResultManager
-from tctshell.logmanager import LOGGER
-from tctshell.constants import Constants
-from tctshell.environment_manager import EnvironmentManager
-from tctshell.devicemanager import DevBaseManager
-from tctshell.sdbmanager import SdbManager
-
-
-def main():
- #time check
- env_manager = None
- plans = None
- devmgr = None
- try:
- start_time = timeit.default_timer()
-
- devbaseMgr = DevBaseManager()
- devbaseMgr.start()
-
- devmgr = devbaseMgr.DeviceManager()
- wrapper = ShellWrapper(devmgr)
- wrapper.parse_options(sys.argv)
-
- isPreconSet = wrapper.is_enable_preconf_func()
-
- devmgr.setDbuteDevIds(wrapper.getDbuteDevIds())
-
- resultIns = ResultManager()
- plans = IntentionGenerator.genIntentionData(wrapper, devmgr)
-
- if plans is None:
- LOGGER.error("Not found test suites")
- raise
-
- env_manager = EnvironmentManager(plans, isPreconSet, \
- wrapper.get_tracking_dump(), devmgr)
- env_manager.setup()
-
- MRP_i = MultiRunnPlan.getInstance()
- pExecutor = []
- if plans:
- for plan in plans:
- if len(plan.getSuites()) > 0:
- MRP_i.addPlan(plan.getPlanName(), plan)
-
- resultManager = threading.Thread(\
- target=resultIns.waitForFinishedPlans, name="ResultManager")
- resultManager.start()
-
- for counter, plan in enumerate(MRP_i.getPlanDict().values()):
- th = None
- if Constants.isDistMode():
- th = AutoPlanExecutor(plan, counter + 1, isPreconSet, \
- env_manager, wrapper.get_run_timeout(), devmgr)
- else:
- th = PlanExecutor(plan, counter + 1, isPreconSet, devmgr)
-
- pExecutor.append(th)
-
- if Constants.isDistMode():
- for plan_thread in pExecutor:
- env_manager.recovery_setup(plan_thread.autop_executors)
-
- for thread in pExecutor:
- thread.start()
-
- env_manager.start_monitor()
-
- pExecutor.append(resultManager)
- for thread in pExecutor:
- thread.join()
-
- env_manager.kill_monitors()
- LOGGER.info("[ Succeed to complete TCT-shell execution, good-bye ]")
-
- #time_check
- end_time = timeit.default_timer()
- timetaken = end_time - start_time
- LOGGER.debug("Time taken: %d min %d sec" % (timetaken / 60, \
- timetaken % 60))
-
- logging.shutdown()
- wrapper.fetch_logs(pExecutor)
- sys.exit(0)
- except SystemExit:
- raise
-
- except KeyboardInterrupt:
- Constants.clean_unzip_file()
- logging.shutdown()
- print ('\nKeyboardInterrupt')
- print ("Logs saved to ['/opt/tools/shell/tmp/logs']")
- if threading.activeCount() > 1:
- os._exit(1)
- else:
- sys.exit(1)
- except:
- if env_manager:
- env_manager.kill_monitors()
-
- if Constants.isDistMode():
- if plans:
- for plan in plans:
- for dev in devmgr.getSdbDeviceList():
- SdbManager.exportDumpFiles(dev.getDeviceId(), \
- plan.getResultFolderPath() + "/dump")
-
- Constants.clean_unzip_file()
- LOGGER.info("[ Failed to complete TCT-shell execution, good-bye ]")
- logging.shutdown()
- print ('-' * 60)
- traceback.print_exc(file=sys.stdout)
- print ('-' * 60)
- print ("Please check logs in [/opt/tools/shell/tmp/logs/]")
- if threading.activeCount() > 1:
- os._exit(1)
- else:
- sys.exit(1)
-
-
-if __name__ == "__main__":
- main()
-
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110 - 1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-""" The process kill for os"""
-
-import os
-import platform
-import signal
-import re
-import ctypes
-
-
-def killall(ppid):
- """Kill all children process by parent process ID"""
- os_ver = platform.system()
- try:
- if os_ver == "Linux" or os_ver == "Darwin":
- ppid = str(ppid)
- pidgrp = []
-
- def getchildpids(ppid):
- """Return a list of children process"""
- command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
- ppid)
- pids = os.popen(command).read()
- pids = pids.split()
- return pids
-
- pidgrp.extend(getchildpids(ppid))
- for pid in pidgrp:
- pidgrp.extend(getchildpids(pid))
- # Insert self process ID to PID group list
- pidgrp.insert(0, ppid)
- while len(pidgrp) > 0:
- pid = pidgrp.pop()
- try:
- os.kill(int(pid), signal.SIGKILL)
- except OSError as error:
- pattern = re.compile('No such process')
- match = pattern.search(str(error))
- if not match:
- print ("[ Error: fail to kill pid: %s," \
- " error: %s ]\n" % (int(pid), error))
- # kill for windows platform
- else:
- kernel32 = ctypes.windll.kernel32
- handle = kernel32.OpenProcess(1, 0, int(ppid))
- kernel32.TerminateProcess(handle, 0)
- except OSError as error:
- pattern = re.compile('No such process')
- match = pattern.search(str(error))
- if not match:
- print ("[ Error: fail to kill pid: %s, error: %s ]\n" \
- % (int(ppid), error))
- return None
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Tang, Shaofeng <shaofeng.tang@intel.com>
-
-import re
-import os
-import os.path
-import zipfile
-import shutil
-import configparser
-from .logmanager import LOGGER
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = configparser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-CONFIG_FILE = "/opt/tools/shell/CONFIG"
-parser = configparser.ConfigParser()
-parser.read(CONFIG_FILE)
-
-
-class Constants:
-
- TCT_VERSION = "TCT-SHELL-3.0"
-
- TCT_HOME = "/opt/tct/"
-
- SUITE_TEST_EXPECTED_TIME = 7
-
- TCT_PLAN_FOLDER = "/opt/tools/shell/plan/"
-
- TCT_SCEN_FOLDER = "/opt/tools/shell/scen/"
-
- STYLE_FOLDER = "/opt/tools/shell/style/"
-
- DEVICE_HEALTH_CMD = "/opt/tct/%s/scripts/tct-config-device.py"
-
- HEALTH_CHECK_FILE_PATH = "/opt/tct/%s/scripts/healthcheck.ini"
-
- RESULT_FOLDER = "/opt/tct/%s/shell/result/%s/"
-
- RESULT_REPO = "/opt/tct/%s/shell/result/%s/"
-
- AUTO_RESULT_SUFFIX = ".auto.xml"
-
- MANUAL_RESULT_SUFFIX = ".manual.xml"
-
- RERUN_AUTO_RESULT_SUFFIX = ".auto.rerun.xml"
-
- RERUN_MANUAL_RESULT_SUFFIX = ".manual.rerun.xml"
-
- RERUN_SUFFIX = ".rerun.xml"
-
- TCT_LOG_FOLDER = "/opt/tools/shell/tmp/logs"
-
- DEFAULT_TIZENV = ""
-
- #SDB Command
- SDB_PUSH = "sdb -s %s push"
- SDB_SHELL = "sdb -s %s shell"
- SDB_ROOT_ON = "sdb -s %s root on"
- SDB_DEVICES = "sdb devices"
- SDB_START_SERVER = "sdb start-server"
- SDB_KILL_SERVER = "sdb kill-server"
- SDB_CONNECT = "sdb connect %s"
- SDB_PULL = "sdb -s %s pull"
- SDB_CAT_CONFIG = " cat %s"
- SDB_LS = "sdb -s %s shell ls -al"
- SDB_DISPLAY_STOP = "sdb -s %s shell devicectl display stop"
- FILE_FOUND_SCRIPT = "[ -f %s ] && echo \"Found\" || echo \"Not Found\""
-
- UNZIP = "unzip -uo"
-
- LOCAL_CAPABILITY_PATH = "/opt/tools/shell/tmp/%s/device_capability.xml"
- LOCAL_BUILD_INFO_PATH = "/opt/tools/shell/tmp/%s/buildinfo.xml"
- LOCAL_SHELL_TEMP_PATH = "/opt/tools/shell/tmp/%s/"
-
- #Testkit-Lite
- LITE_CMD1 = "testkit-lite1.0"
- LITE_CMD2 = "testkit-lite2.0"
- PRIORITY_VALUE = False
- PRIORITY = "--priority P0 P1"
- LOCAL_PRE = "-f "
- DEVICE_PRE = "-f device:"
- LITE_E_PARAM = "-e ""WRTLauncher"""
- LITE_NON_ACTIVE_PARAM = "--non-active"
- LITE_DEVICE_PARAM = "--deviceid"
- LITE_CAPABILITY_PARAM = "--capability"
- TESTCASE_ID = "--id"
- EXECUTE_PREFF = " -e "
- ONLY_AUTO_CASES = "-A"
- ONLY_MANUAL_CASES = "-M"
-
- DEVICE_SUITE_DEF = "tests.xml"
- LITE_OUTPUT_PARAM = "-o "
- EXT_TYPE_PARAM = "-e xwalk"
- ENV_TYPE_PARAM = "--testenv \"Launcher=app_launcher \""
- COMM_TYPE_PARAM = "--comm tizenmobile"
- WRT_LAUNCHER_CMD = "WRTLauncher"
-
- #HOST/OPT
- SUITES_REPOSITORY = "/opt/tct/%s/packages/"
-
- INSTALL_ZIP_24 = "inst.sh"
- INSTALL_ZIP_W3 = "inst.py"
-
- UNINSTALL_ZIP_24 = "inst.sh -u"
- UNINSTALL_ZIP_W3 = "inst.py -u"
-
- #Scenario Generator
- DEFAULT_SCEN_NAME = "Scen_Full_test"
-
- #Plan Generator
- ALL_PROFILES = ['mobile', 'wearable', 'tv']
- DEFAULT_MATCH_REGEX = "*.zip"
- DEFAULT_UNMATCH_REGEX = None
- DEFAULT_PLAN_NAME = "Full_test"
- DEFAULT_PROFILE_NAME = "mobile"
- DEFAULT_EXECUTE_TYPE = "All"
- DEFAULT_PLAN_FILE = "tct_plan"
-
- REGEX_FOR_SPLIT_PKG_NAME = "-\d\.\d*"
-
- #Log Level
- DEFAULT_LOG_LEVEL = "INFO"
- LOG_LEVEL = None
- LOG_LEVELS = {"CRITICAL": 50,
- "ERROR": 40,
- "WARNING": 30,
- "INFO": 20,
- "DEBUG": 10,
- "NOTSET": 0
- }
-
- #Running Mode
- RUNNING_MODE_PLAN = "plan"
- RUNNING_MODE_SCEN = "scenario"
- RUNNING_MODE_RERUN = "rerun"
- RUNNING_MODE_SUITES = "suites"
- RUNNING_MODE_PROFILE = "profile"
- RERUNING_MODE = False
- SCENARIO_MODE = False
- DISTRIBUTE_MODE = False
-
- #PRECONFIGURE
- PRE_CONF_HOST_INI = "/opt/tools/shell/tmp/%s/tct-testconfig.ini"
- PRE_CONF_HOST_JSON = "/opt/tools/shell/tmp/%s/preconfigure.json"
- PRE_CONF_HOST_XML = "/opt/tools/shell/tmp/%s/tests.xml"
- PORT_CONF_HOST_JSON = "/opt/tools/shell/tmp/%s/portconfigure.json"
- NAT_CONF_HOST_TXT = "/opt/tools/shell/tmp/%s/TC_Config.txt"
- NAT_CONF_DEVICE_TXT = "/opt/usr/home/owner/share/"
-
- #Waiting Time
- #DEBUG PURPOSE. Original value: 300
- NO_WORKERS_TIMEOUT = 300
- #Temporary constant value. Should be dynamic.
- RECOVERY_TIME = 100
-
- DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
- DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-
- @staticmethod
- def setRecoveryTime(timeout):
- Constants.RECOVERY_TIMEOUT = timeout
-
- @staticmethod
- def getDEVICE_TESTS_FILE(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/%s/tests.xml")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/%s/tests.xml")
-
- @staticmethod
- def getDEVICE_SUITE_TARGET(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/")
-
- @staticmethod
- def getDEVICE_SUITE_FOLDER(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/")
-
- @staticmethod
- def getDEVICE_BUILD_INFO_PATH(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "Documents/tct/buildinfo.xml")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "Documents/tct/buildinfo.xml")
-
- @staticmethod
- def getDEVICE_CAPABILITY_PATH(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "Documents/tct/capability.xml")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "Documents/tct/capability.xml")
-
- @staticmethod
- def getPRE_CONF_DEVICE_INI(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/tct-testconfig.ini")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/tct-testconfig.ini")
-
- @staticmethod
- def getPRE_CONF_DEVICE_JSON(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/preconfigure.json")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/preconfigure.json")
-
- @staticmethod
- def getPRE_CONF_DEVICE_XML(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/tests.xml")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/tests.xml")
-
- @staticmethod
- def getPORT_CONF_DEVICE_JSON(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/portconfigure.json")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/portconfigure.json")
-
- @staticmethod
- def getTCT_PORT_CONF_DEVICE_JSON(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/portconfigure.json")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/portconfigure.json")
-
- @staticmethod
- def getTCT_PRE_CONF_DEVICE_JSON(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/preconfigure.json")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/preconfigure.json")
-
- @staticmethod
- def getNAT_CONF_DEVICE_TXT(_tizenV):
- if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/TC_Config.txt")
- else:
- return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/TC_Config.txt")
-
- @staticmethod
- def setLogLevel(lvl):
- Constants.LOG_LEVEL = lvl
-
- @staticmethod
- def setRerunMode(isRerun):
- Constants.RERUNING_MODE = isRerun
-
- @staticmethod
- def setScenMode(isScen):
- Constants.SCENARIO_MODE = isScen
-
- @staticmethod
- def setDistMode(isDist):
- Constants.DISTRIBUTE_MODE = isDist
-
- @staticmethod
- def isDistMode():
- return Constants.DISTRIBUTE_MODE
-
- @staticmethod
- def isScenMode():
- return Constants.SCENARIO_MODE
-
- @staticmethod
- def checkBuildIds(devs):
- check = True
- if len(devs) == 0:
- check = False
-
- first_buildId = None
- for count, dev in enumerate(devs):
- dev_buildId = dev.getDeviceBuildId()
- if count == 0:
- first_buildId = dev_buildId
- if not dev_buildId:
- check = False
- if not first_buildId in dev_buildId:
- check = False
-
- return check
-
- @staticmethod
- def getSuiteNameFromFile(suiteFile):
- suffixes = [Constants.AUTO_RESULT_SUFFIX, \
- Constants.MANUAL_RESULT_SUFFIX, \
- Constants.RERUN_AUTO_RESULT_SUFFIX, \
- Constants.RERUN_MANUAL_RESULT_SUFFIX]
- for suffix in suffixes:
- if suiteFile.endswith(suffix):
- suiteFile = suiteFile[:-len(suffix)]
- return suiteFile
-
- @staticmethod
- def checkFileExists(aPath):
- if os.path.exists(aPath):
- return True
- else:
- return False
-
- @staticmethod
- def getTempPath(filepath):
- xmlFolder = Constants.LOCAL_SHELL_TEMP_PATH % "temp_xml"
- if not os.path.isdir(xmlFolder):
- os.makedirs(xmlFolder, mode=0o777)
-
- xml_name = os.path.basename(filepath)
- temp_path = os.path.join(xmlFolder, xml_name)
- return temp_path
-
- @staticmethod
- def unzip_package(filepath):
- path = os.path.expanduser("~")
- os.chdir(path)
- if os.path.exists(Constants.DEFAULT_PLAN_FILE):
- shutil.rmtree(Constants.DEFAULT_PLAN_FILE)
-
- os.makedirs(Constants.DEFAULT_PLAN_FILE, mode=0o777)
- f = zipfile.ZipFile(filepath, 'r')
- for file in f.namelist():
- f.extract(file, path + "/" + Constants.DEFAULT_PLAN_FILE)
-
- @staticmethod
- def clean_unzip_file():
- os.chdir(os.path.expanduser("~"))
- if os.path.exists(Constants.DEFAULT_PLAN_FILE):
- shutil.rmtree(Constants.DEFAULT_PLAN_FILE)
-
- @staticmethod
- def move_log_file(src_file, dest_folder):
- log_folder = os.path.join(dest_folder, 'logs')
- if not os.path.isfile(src_file):
- LOGGER.warning('%s does not exist' % src_file)
- return False
- if not os.path.isdir(log_folder):
- os.mkdir(log_folder, mode=0o777)
-
- count = 1
- src_basename = os.path.basename(src_file)
- src_dir = os.path.dirname(src_file)
- title, ext = os.path.splitext(src_basename)
- while True:
- if os.path.exists(os.path.join(log_folder, src_basename)):
- src_basename = title + "_%s%s" % (count, ext)
- count += 1
- else:
- break
-
- rename_src = os.path.join(src_dir, src_basename)
- os.rename(src_file, rename_src)
- shutil.copy(rename_src, log_folder)
- return True
-
- @staticmethod
- def indent(elem, level=0):
- i = "\n" + level * " "
- if len(elem):
- if not elem.text or not elem.text.strip():
- elem.text = i + " "
- if not elem.tail or not elem.tail.strip():
- elem.tail = i
- for elem in elem:
- Constants.indent(elem, level + 1)
- if not elem.tail or not elem.tail.strip():
- elem.tail = i
- else:
- if level and (not elem.tail or not elem.tail.strip()):
- elem.tail = i
-
- @staticmethod
- def isSdbNetwork(deviceId):
- patt = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}:')
- ma = patt.match(deviceId)
- if ma:
- return True
- else:
- return False
-
- '''
- @staticmethod
- def getDeviceExceptions():
- devices = []
- try:
- devs = parser.get('DISTRIBUTE_MODE', 'DEVICE_EXCEPTIONS')
- devs = devs.splitlines()
- for dev in devs:
- if dev != '':
- devices.append(dev)
- LOGGER.info("Ignoring device: %s" % dev)
- except Exception as e:
- LOGGER.error("CONFIG file Parsing Error: %s" % e)
- finally:
- return devices
- '''
-
- @staticmethod
- def set_default_tizenV(_tizenV):
- Constants.DEFAULT_TIZENV = _tizenV
-
- @staticmethod
- def get_tct_binaryV():
- tct_binV = ""
- ver_path = '/opt/tct/%s/VERSION' % Constants.DEFAULT_TIZENV
- if os.path.exists(ver_path):
- ver_file = open('/opt/tct/%s/VERSION' % \
- Constants.DEFAULT_TIZENV, 'r')
- tct_binV = ver_file.readline().strip()
- return tct_binV
-
+++ /dev/null
-#!/usr/bin/python
-
-import queue
-from multiprocessing.managers import BaseManager
-
-from .sdbmanager import SdbManager
-from .constants import Constants
-from .logmanager import LOGGER
-from xml.etree import ElementTree
-from .exception import DevNotFoundErr
-
-
-class DeviceManager(object):
- devices = []
- dbutedevIds = []
- dumpMonitor_q = queue.Queue()
-
- def __init__(self):
- if len(self.devices) == 0:
- self.loadDeviceList()
-
- def _updateConnDevice(self, connDevices):
- self._resetDevices()
-
- for dev in connDevices:
- self.devices.append(dev)
-
- def _resetDevices(self):
- listSize = len(self.devices)
- del self.devices[0:listSize]
-
- def deleteFaultDevice(self, _devid):
- if len(self.devices) < 1:
- return False
- else:
- devs = self.getSdbDeviceList()
- for idx, dev in enumerate(devs):
- devId = dev.getDeviceId()
- if devId == _devid:
- del self.devices[idx]
- return True
- return False
-
- def isDeviceAvailable(self, deviceId):
- if len(self.devices) == 0:
- return False
- else:
- devs = self.getSdbDeviceList()
- for dev in devs:
- devId = dev.getDeviceId()
- if devId == deviceId:
- return True
- return False
-
- def getDeviceSize(self):
- return len(self.devices)
-
- def getSdbDeviceList(self):
- if self.dbutedevIds:
- remake_devices = []
- for devid in self.dbutedevIds:
- dev = self.getDevice(devid)
- if dev:
- remake_devices.append(dev)
-
- return remake_devices
- else:
- return self.devices
-
- def getDevice(self, deviceId):
- for dev in self.devices:
- if dev.getDeviceId() == deviceId:
- return dev
-
- LOGGER.error("The '%s' device Id exists error" % deviceId)
- return None
-
- def loadDeviceList(self):
- connDevices = []
- sdbOutLog = SdbManager.sdbDevices()
- if not sdbOutLog:
- return False
- devicesInfo = sdbOutLog.replace("List of devices attached", "")
- devList = devicesInfo.split('\n')
-
- for dev in devList:
- if len(dev) > 1:
- devInfoItem = dev.split('\t')
- if len(devInfoItem) < 2:
- continue
- devId = devInfoItem[0].rstrip()
- devType = devInfoItem[1].rstrip()
- devName = devInfoItem[2].rstrip()
- if not (devType == "unknown" or devType == "offline" \
- or devId == "unknown" or devId == "offline"):
- connDevices.append(SdbDevice(devId, devName, devType))
- else:
- raise DevNotFoundErr(devId)
-
- if len(connDevices) > 0:
- self._updateConnDevice(connDevices)
- LOGGER.debug("Connected Devices = %s" \
- % str([dev.devId for dev in self.devices]))
- return True
- else:
- self._resetDevices()
- LOGGER.debug("Reset Devices List")
- return False
-
- def setDbuteDevIds(self, _devIds):
- self.dbutedevIds = _devIds
-
- def add_dump_monitor_dev(self, _devid):
- LOGGER.debug("add dump monitor dev : %s" % _devid)
- self.dumpMonitor_q.put(_devid)
-
- '''
- def check_dump_monitor_que(self, _devid):
- LOGGER.debug("check dump monitor queue : %s" % _devid)
- temp_devs = []
- while not self.dumpMonitor_q.empty():
- devid = self.dumpMonitor_q.get()
- if devid == _devid:
- return True
- else:
- temp_devs.append(devid)
-
- for dev in temp_devs:
- self.dumpMonitor_q.put(dev)
-
- return False
- '''
-
-
-class SdbDevice:
- def __init__(self, devId, devName, devType):
- self.devId = devId
- self.devName = devName
- self.devType = devType
- self.devBuildId = ""
-
- def _printDevInfo(self):
- LOGGER.info("===== Device Infomation =====")
- LOGGER.info(" Name : " + self.devName)
- LOGGER.info(" Id : " + self.devId)
- LOGGER.info(" Type : " + self.devType)
- LOGGER.info("=============================")
-
- def getDeviceId(self):
- return self.devId
-
- def getDeviceName(self):
- return self.devName
-
- def getDeviceType(self):
- return self.devType
-
- def getDeviceBuildId(self):
- if self.devBuildId == "":
- infoFilePath = Constants.LOCAL_BUILD_INFO_PATH % self.devId
- if Constants.checkFileExists(infoFilePath) is False:
- LOGGER.error("Not Found BuildInfo.xml file in %s" % self.devId)
- LOGGER.error('Path : %s' % infoFilePath)
- return None
- try:
- xml_tree = ElementTree.parse(infoFilePath)
- xml_root = xml_tree.getroot()
-
- for buildinfo in xml_root.findall('buildinfo'):
- if buildinfo.get("name") == "buildVersion":
- self.devBuildId = buildinfo.find("value").text
- return self.devBuildId
-
- except Exception as e:
- LOGGER.warning("[ reading buildInfo XML fail, error : %s ] " % e)
- return None
- else:
- return self.devBuildId
-
-class DevBaseManager(BaseManager):
- pass
-
-DevBaseManager.register('DeviceManager', DeviceManager)
-
+++ /dev/null
-import os
-import time
-import threading
-from multiprocessing import Process, Queue, Manager
-
-from .shellplanner import *
-from .sdbmanager import SdbManager
-from .result_summary import ResultSummary
-from .logmanager import LOGGER
-
-
-def wait_time(_time):
- for loop in range(_time):
- LOGGER.debug("Wait {} seconds......".format(_time-loop))
- time.sleep(1)
-
-
-class AutoPlanExecutor(threading.Thread):
-
- def __init__(self, plan, threadCounter, isPreconSet, envManager, \
- run_timeout, devmgr):
- #Process.__init__(self)
- threading.Thread.__init__(self)
- self.suites = {}
- self.autop_executors = []
- self.all_dev_threads = []
- self.suite_q = Queue(maxsize=1)
- self.plan = plan
- self.devmgr = devmgr
- self.name = plan.getPlanName()
- self.tcCounter = threadCounter
- self.isPreconSet = isPreconSet
- self.notrun_count = 0
- self._orgSuites()
- self._prepareAutoPlan(self.isPreconSet)
- self.envManager = envManager
- self.finish_time = float(time.time()) + \
- ((int(run_timeout)) * 60)
-
- def run(self):
- self._startAutoPlan()
- LOGGER.debug("finished AutoPlanExecutor")
-
- def _orgSuites(self):
- if self.plan.getDeviceId() in self.suites:
- self.suites[self.plan.getDeviceId()] += self.plan.getSuites()[:]
- else:
- self.suites[self.plan.getDeviceId()] = self.plan.getSuites()[:]
-
- def _orgNotRunSuites(self, notRunSuites):
- suites = []
- LOGGER.debug("Finding Not Run suites")
- LOGGER.debug("Suites to find: %s" % str(notRunSuites))
- for suite in self.plan.getSuites():
- if suite.suiteName in notRunSuites:
- suites.append(suite)
- if None in self.suites:
- self.suites[None] += suites
- else:
- self.suites[None] = suites
-
- def _prepareAutoPlan(self, isPreconSet, notrun=None):
- runningDevs = self.devmgr.getSdbDeviceList()
- self.autop_executors = []
- for counter, dev in enumerate(runningDevs):
- self.plan.setDeviceId(dev.getDeviceId())
- self.suites[None].append('Finished')
- process_name = dev.getDeviceId()
- if notrun is not None:
- process_name = "%s_notRun%d" % (dev.getDeviceId(), notrun)
- autopExecutor = AutoPlanDevExecutor(self.plan, process_name, \
- dev.getDeviceId(), counter + 1, self.suite_q, \
- isPreconSet, self.devmgr)
- self.autop_executors.append(autopExecutor)
- self.all_dev_threads += self.autop_executors
-
- def _is_run_timeout(self):
- curr_time = float(time.time())
-
- if self.finish_time > curr_time:
- return False
- else:
- return True
-
- def _startAutoPlan(self):
- for worker in self.autop_executors:
- worker.start()
-
- while len(self.suites[None]) > 0:
- done_inhost = False
- wakeup_others = False
- suite = self.suites[None][0]
- if self._is_run_timeout():
- LOGGER.error('tct-shell run/rerun timeout...')
- while not self.suite_q.empty():
- self.suites[None].insert(0, (self.suite_q.get(True)))
- self._auto_test_inhost(self.suites[None])
- self.suites[None] = []
- break
-
- timeout = 0
- while self._no_worker_available():
- '''
- if self._exists_finished_worker():
- wakeup_others = True
- self._kill_all_workers()
- LOGGER.debug("No need to reboot. Waking up other devices")
- break
- '''
- LOGGER.info("Wait for the connected devices to be reconnected [%s:%s]" % \
- (str(timeout), str(Constants.NO_WORKERS_TIMEOUT)))
- time.sleep(10)
- timeout += 10
- if timeout >= Constants.NO_WORKERS_TIMEOUT:
- LOGGER.error("The reboot times for all the devices have been exceeded")
- while not self.suite_q.empty():
- self.suites[None].insert(0, (self.suite_q.get(True)))
- self._auto_test_inhost(self.suites[None])
- self.suites[None] = []
- done_inhost = True
- break
-
- if done_inhost or wakeup_others:
- break
- try:
- self.suite_q.put(suite, True, 20)
- except:
- continue
- self.suites[None].pop(0)
-
- '''
- for autopExecutor in self.autop_executors:
- SdbManager.exportDumpFiles(autopExecutor.deviceId, \
- self.plan.getResultFolderPath())
- if autopExecutor.isRebooting():
- self.envManager.kill_usbMonitor(autopExecutor.deviceId)
- autopExecutor.killThread()
- autopExecutor.join()
- '''
- for autopExecutor in self.autop_executors:
- autopExecutor.join()
- '''
- for dev in self.devmgr.getSdbDeviceList():
- SdbManager.exportDumpFiles(dev.getDeviceId(), \
- self.plan.getResultFolderPath())
- '''
-
- summary = ResultSummary([self.plan])
- '''
- notRunSuites = summary.checkResults()
-
- if len(notRunSuites) > 0:
- while not self.suite_q.empty():
- LOGGER.debug("Suite left in the queue. Clearing...")
- self.suite_q.get(True)
- LOGGER.debug("Starting Not Run suites")
- self._orgNotRunSuites(notRunSuites)
- LOGGER.debug("Not Run suites = %s" % str(self.suites[None]))
- self.notrun_count += 1
- self._prepareAutoPlan(self.isPreconSet, notrun=self.notrun_count)
- self._startAutoPlan()
- else:
- '''
- summary.genResults()
- summary.genSummary()
- self.plan.setFinished()
-
- def _auto_test_inhost(self, suites):
- self._kill_all_workers()
- self._kill_liteprocess()
- exeType = self.plan.getExecuteType()
- for suite in suites:
- if suite == 'Finished':
- continue
- if exeType.getCurrType() == ExecuteType.e_auto:
- self.autoworker = AutoPlan_AutoSuiteWorker(suite, None, \
- self.plan)
- self.autoworker.auto_test_inhost()
- elif exeType.getCurrType() == ExecuteType.e_manual:
- continue
- else:
- self.autoworker = AutoPlan_AutoSuiteWorker(suite, None, \
- self.plan)
- self.autoworker.auto_test_inhost()
-
- def _kill_liteprocess(self):
- cmd = "ps aux | grep 'python /opt/testkit/lite[0-9].[0-9]/testkit-lite'"
- result = SdbManager.hostCommandwithResult(cmd)
- if isinstance(result, (bytes, bytearray)):
- result = result.decode('utf-8')
-
- LOGGER.debug(result)
- grep_lines = result.split('\n')
-
- kill_packages = []
- for line in grep_lines:
- if line and len(line) > 1:
- proc_id = line.split()[1]
- SdbManager.hostCommand('kill -9 %s' % proc_id)
-
- res_url = line.split()[-1]
- if res_url and res_url.find('shell/result') > -1:
- spt_pack = res_url.split('/')[-1].split('.')[0]
- kill_packages.append(spt_pack)
-
- exeType = self.plan.getExecuteType()
- suites = self.plan.getSuites()
-
- for num in range(len(kill_packages)):
- pack_name = str(kill_packages.pop())
-
- for suite in suites:
- if suite.getSuiteName().find(pack_name):
- if exeType.getCurrType() == ExecuteType.e_auto:
- self.autowoker = AutoPlan_AutoSuiteWorker(suite, None, \
- self.plan)
- self.autowoker.auto_test_inhost()
- elif exeType.getCurrType() == ExecuteType.e_manual:
- continue
- else:
- self.autowoker = AutoPlan_AutoSuiteWorker(suite, None, \
- self.plan)
- self.autowoker.auto_test_inhost()
- break
-
- def _no_worker_available(self):
- executor_size = len(self.autop_executors)
- curr_killed_executor = 0
- for autopExecutor in self.autop_executors:
- if autopExecutor.isKilled():
- curr_killed_executor += 1
-
- if executor_size == curr_killed_executor:
- return True
-
- return False
-
- def _exists_finished_worker(self):
- for autopExecutor in self.autop_executors:
- if autopExecutor.isKilled():
- return True
- return False
-
- def _kill_all_workers(self):
- for autopExecutor in self.autop_executors:
- autopExecutor.killThread()
-
- def _require_kill_worker(self):
- for autopExecutor in self.autop_executors:
- if not autopExecutor.isKilled():
- autopExecutor.killThread()
-
- def getSuites(self):
- return self.suites
-
-
-class AutoPlanDevExecutor(Process):
-
- def __init__(self, plan, name, deviceId, threadCounter, suite_queue, \
- isPreconSet, devmgr):
- LOGGER.debug("Creating AutoPlanExecutor, with [device]: " + deviceId)
- Process.__init__(self)
- self.name = name
- self.deviceId = deviceId
- self.tcCounter = threadCounter
- self.threadLock = threading.Lock()
- self.suite_q = suite_queue
- self.plan = plan
- self.rebooting = Queue(1)
- self.finished = Queue(1)
- self.rebootLock = Queue()
- self.devmgr = devmgr
-
- def get_suite(self):
- try:
- suite = self.suite_q.get(True)
- except Queue.Empty:
- LOGGER.warning("AutoPlanDevExecutor.suite_queue empty exception")
- pass
-
- if suite == 'Finished':
- LOGGER.debug('suite obtained: Finished')
-
- return suite
-
- def killThread(self):
- if self.finished.empty():
- LOGGER.debug("Killing [%s]" % self.name)
- self.finished.put(1, block=False)
- else:
- LOGGER.debug("[%s] finished" % self.name)
-
- def isKilled(self):
- return not self.finished.empty()
-
- def isRebooting(self):
- return not self.rebooting.empty()
-
- def setRebooting(self, reboot):
- if reboot:
- self.rebooting.put(1, block=False)
- elif not self.rebooting.empty():
- self.rebooting.get()
-
- def run(self):
- LOGGER.debug("Starting AutoPlanDevExecutor|DevID:{},PID:{}".\
- format(self.deviceId, str(os.getpid())))
- suite = None
- is_reboot_timeout = False
- while True:
- if self.isKilled():
- LOGGER.debug("finished AutoPlanDevExecutor|DevID:{},PID:{}".\
- format(self.deviceId, str(os.getpid())))
- break
-
- if not self.devmgr.isDeviceAvailable(self.deviceId) and \
- not is_reboot_timeout:
- #reboot
- LOGGER.error("Please reboot device : %s" % self.deviceId)
- #scheduling purpose: waiting for UsbMonitor to release lock.
- try:
- self.rebootLock.get(block=True, timeout=60)
- self.setRebooting(True)
- except:
- is_reboot_timeout = True
-
- continue
-
- elif is_reboot_timeout:
- self.killThread()
- LOGGER.error("%s is reboot timeout" % self.deviceId)
- break
- else:
- if self.isRebooting():
- LOGGER.info("Rebooting complete device : %s" % \
- self.deviceId)
- SdbManager.recoveryDevice(self.plan.getTizenVersion(), \
- self.deviceId)
- self.setRebooting(False)
- self.is_reboot_timeout = False
-
- '''
- if self.devIns.check_dump_monitor_que(self.deviceId):
- LOGGER.debug("Tracking dump device : %s" % self.deviceId)
- self.killThread()
- break
- '''
-
- suite = self.get_suite()
- if suite == 'Finished':
- self.killThread()
- break
- exeType = self.plan.getExecuteType()
- if exeType.getCurrType() == ExecuteType.e_auto:
- self.autoworker = AutoPlan_AutoSuiteWorker(suite, \
- self.deviceId, self.plan)
- self.autoworker.auto_test()
- elif exeType.getCurrType() == ExecuteType.e_manual:
- self.manualworker = AutoPlan_ManualSuiteWorker(suite, \
- self.deviceId, self.plan)
- self.manualworker.auto_test()
- else:
- self.autoworker = AutoPlan_AutoSuiteWorker(suite, \
- self.deviceId, self.plan)
- self.autoworker.auto_test()
- self.manualworker = AutoPlan_ManualSuiteWorker(suite, \
- self.deviceId, self.plan)
- self.manualworker.auto_test()
- try:
- dump_files = SdbManager.exportDumpFiles(self.deviceId, \
- self.plan.getResultFolderPath() + "/dump/" + suite.getSuiteName())
- if dump_files:
- SdbManager.deleteDumpFiles(self.deviceId, dump_files)
- except Exception as ex:
- LOGGER.error(str(ex))
-
- LOGGER.debug("finished AutoPlanDevExecutor")
-
-
-class AutoPlan_AutoSuiteWorker:
- def __init__(self, suite, deviceId, plan):
- self.suite = suite
- self.deviceId = deviceId
- self.plan = plan
- self.remTmpDir = plan.getDevTctTmpPath()
- self.resultFolder = plan.getResultFolderPath()
- self.tizenVer = plan.getTizenVersion()
- self.isRerun = plan.isReRunning()
- self.stubPort = plan.getStubPort()
-
- def auto_test(self):
- suite = self.suite
- if suite.getAutoNum() is None or int(suite.getAutoNum()) == 0:
- suite.setNoAuto()
- LOGGER.warning('Suite : %s , AutoNum : 0' % (suite.getSuiteName()))
- return
-
- suiteName = suite.getSuiteName()
- suite.runPreTestScript(self.deviceId)
-
- LOGGER.info("Start to execute|suite:{},devid:{},pid:{}".\
- format(suiteName, self.deviceId, os.getpid()))
- LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
-
- LOGGER.info('Checking if the suite ' + suiteName \
- + ' is installed already.')
- if suite.sdbCheckSuite(self.deviceId, suiteName):
- LOGGER.info('The suite ' + suiteName + ' is existed. uninstalling')
- LOGGER.info('Uninstalling the existed suite ' + suiteName)
- suite.unInstallSuite(self.deviceId, self.remTmpDir)
-
- LOGGER.info('Uploading the suite ' + suiteName)
- LOGGER.info('Installing the suite ' + suiteName)
-
- suite.installSuite(self.deviceId, self.remTmpDir)
- LOGGER.info('Executing the suite ' + suiteName + ' in testkit-lite.')
- suite.executePlanAuto(self.deviceId, self.resultFolder, \
- suite.getTestCase(), self.isRerun, self.stubPort)
-
- suite.runPostTestScript(self.deviceId)
-
- LOGGER.info('removing the suite pkg file of the suite ' + suiteName)
- LOGGER.info('Uninstalling the suite ' + suiteName)
- suite.unInstallSuite(self.deviceId, self.remTmpDir)
-
- LOGGER.info("Finished to execute|suite:{},devid:{},pid:{}".\
- format(suiteName, self.deviceId, os.getpid()))
- wait_time(10)
-
- def auto_test_inhost(self):
- suite = self.suite
- if suite.getAutoNum() is None or int(suite.getAutoNum()) == 0:
- suite.setNoAuto()
- LOGGER.warning('Suite : %s , AutoNum : 0' % (suite.getSuiteName()))
- return
-
- suiteName = suite.getSuiteName()
- LOGGER.info("Start to execute auto suite:%s" % suiteName)
-
- LOGGER.info('Uploading the suite ' + suiteName)
- LOGGER.info('Installing the suite ' + suiteName)
- suite.installSuite(self.deviceId, self.remTmpDir)
- LOGGER.info('Executing the suite ' + suiteName + ' in testkit-lite.')
- suite.executePlanAuto(self.deviceId, self.resultFolder, \
- suite.getTestCase(), self.isRerun, self.stubPort)
-
- LOGGER.info('removing the suite pkg file of the suite ' + suiteName)
- LOGGER.info('Uninstalling the suite ' + suiteName)
- suite.unInstallSuite(self.deviceId, self.remTmpDir)
-
- LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
- LOGGER.info("Finished to execute auto suite:%s" % suiteName)
-
-
-class AutoPlan_ManualSuiteWorker:
- def __init__(self, suite, deviceId, plan):
- self.suite = suite
- self.deviceId = deviceId
- self.plan = plan
-
- def auto_test(self):
- deviceId = self.deviceId
- remTmpDir = self.plan.getDevTctTmpPath()
- resultFolder = self.plan.getResultFolderPath()
- isRerun = self.plan.isReRunning()
- stubPort = self.plan.getStubPor()
- suite = self.suite
-
- if suite.getManualNum() is None or int(suite.getManualNum()) == 0:
- suite.setNoManual()
- LOGGER.warning('Suite : %s , ManualNum : 0' % \
- (suite.getSuiteName()))
- return
-
- suiteName = suite.getSuiteName()
- LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
-
- LOGGER.info('Checking if the suite ' + suiteName \
- + 'is installed already.')
- if suite.sdbCheckSuite(deviceId, suiteName):
- LOGGER.info('The suite ' + suiteName + ' is existed. uninstalling')
- LOGGER.info('Uninstalling the existed suite ' + suiteName)
- suite.unInstallSuite(deviceId, remTmpDir)
-
- LOGGER.info('Uploading the suite ' + suiteName)
- LOGGER.info('Installing the suite ' + suiteName)
- suite.installSuite(deviceId, remTmpDir)
- LOGGER.info('Executing the suite ' + suiteName + ' in testkit-lite.')
- suite.executePlanManual(deviceId, resultFolder, suite.getTestCase(), \
- isRerun, stubPort)
-
- LOGGER.info('removing the suite pkg file of the suite ' + suiteName)
- LOGGER.info('Uninstalling the suite ' + suiteName)
- suite.unInstallSuite(deviceId, remTmpDir)
-
- LOGGER.info("Finished to execute manual suite: [%s]" % suiteName)
+++ /dev/null
-#!/usr/bin/python
-
-import time
-from multiprocessing import Process
-
-from .logmanager import LOGGER
-from .sdbmanager import SdbManager
-
-class DumpMonitor(Process):
-
- def __init__(self, _devid, _dump_name):
- Process.__init__(self)
- self.daemon = True
- self.name = "DumpMonitor"
- self.devid = _devid
- self.dumpName = _dump_name
- self.isFinish = False
-
- def run(self):
- LOGGER.debug("Starting DumpMonitor : %s" % self.devid)
- cmd = self._make_ls_command()
- if not cmd:
- return
-
- while True:
- if self.isFinish:
- break
- time.sleep(10)
- result = SdbManager.sdbShell(self.devid, cmd)
- if result and self.dumpName:
- for dName in self.dumpName.split(','):
- if dName and str(result).find(dName) > -1:
- self.devIns.add_dump_monitor_dev(self.devid)
- return
-
- def _make_ls_command(self):
- dump_dir_path = SdbManager.findDumpPath(self.devid)
- if dump_dir_path:
- dump_ls_cmd = "ls -al %s" % dump_dir_path
- return dump_ls_cmd
- else:
- return None
-
- def kill_dumpmonitor(self):
- self.isFinish = True
-
+++ /dev/null
-#!/usr/bin/python
-
-from multiprocessing import Queue
-from .shellguider import Guider
-from .testenvironment import TestEnvironment
-from .usbmonitor import UsbMonitor
-from .netstatmonitor import NetstatMonitor
-from .dumpmonitor import DumpMonitor
-
-from .logmanager import LOGGER
-from .constants import Constants
-
-
-class EnvironmentManager:
- def __init__(self, plans, isPreconSet, dump_name, devmgr):
- self.plans = plans
- self.dev_plans = {}
- self.env_threads = []
- self.connDevices = []
- self.isPreconSet = isPreconSet
- self.usb_monitor = None
- self.netstat_monitors = []
- self.dump_monitors = []
- self.dev_recovery_locks = {}
- self.dump_name = dump_name
- self.devmgr = devmgr
- self.orgPlans()
- self.load_devices()
- self.init_monitors()
-
- def init_monitors(self):
- if Constants.isDistMode():
- for dev in self.connDevices:
- dev_id = dev.getDeviceId()
- if dev_id is None:
- continue
- if Constants.isSdbNetwork(dev_id):
- pass
- #netstat_m = NetstatMonitor(dev_id, self.devmgr)
- #self.netstat_monitors.append(netstat_m)
- else:
- if not self.usb_monitor:
- pass
- #self.usb_monitor = UsbMonitor(self.devmgr)
- '''
- if self.dump_name:
- dump_m = DumpMonitor(dev_id, self.dump_name)
- self.dump_monitors.append(dump_m)
- '''
- else:
- pass
- '''
- for devId in self.dev_plans.keys():
- if Constants.isSdbNetwork(devId):
- netstat_m = NetstatMonitor(devId, self.devmgr)
- self.netstat_monitors.append(netstat_m)
- else:
- if not self.usb_monitor:
- self.usb_monitor = UsbMonitor(self.devmgr)
- '''
-
- def kill_monitors(self):
- if self.usb_monitor:
- self.usb_monitor.kill_usbmonitor()
-
- self.kill_netstatMonitor()
-
- for dumpM in self.dump_monitors:
- dumpM.kill_dumpmonitor()
-
- def kill_netstatMonitor(self):
- for nsMonitor in self.netstat_monitors:
- nsMonitor.kill_netMonitor()
-
- def kill_usbMonitor(self, devid):
- if self.usb_monitor:
- self.usb_monitor.device_recovered(devid)
-
- def start_usbMonitor(self):
- if self.usb_monitor:
- self.usb_monitor.start()
-
- def start_netstatMonitor(self):
- for nsMonitor in self.netstat_monitors:
- nsMonitor.start()
-
- def start_dumpMonitor(self):
- for dumpMonitor in self.dump_monitors:
- dumpMonitor.start()
-
- def load_devices(self):
- self.devmgr.loadDeviceList()
- self.connDevices = self.devmgr.getSdbDeviceList()
-
- def orgPlans(self):
- if self.plans:
- for plan in self.plans:
- if len(plan.getSuites()) < 1:
- continue
- deviceId = plan.getDeviceId()
- tizenVer = plan.getTizenVersion()
-
- if not deviceId in self.dev_plans:
- self.dev_plans[deviceId] = {}
-
- if not tizenVer in self.dev_plans[deviceId]:
- self.dev_plans[deviceId][tizenVer] = []
-
- self.dev_plans[deviceId][tizenVer].append(plan)
-
- def env_setup(self):
- err_msg_queue = Queue()
- for devId, devId_val in self.dev_plans.items():
- for tizenVer, plans in devId_val.items():
- if Constants.isDistMode():
- for dev in self.connDevices:
- tEn = TestEnvironment(tizenVer, dev.getDeviceId(), \
- self.isPreconSet, err_msg_queue, self.devmgr)
- tEn.start()
- self.env_threads.append(tEn)
- else:
- tEn = TestEnvironment(tizenVer, devId, self.isPreconSet, \
- err_msg_queue, self.devmgr)
- tEn.start()
- self.env_threads.append(tEn)
-
- for thread in self.env_threads:
- thread.join()
-
- if not err_msg_queue.empty():
- raise
-
- def guider_setup(self):
- for devId, devId_val in self.dev_plans.items():
- for tizenVer, plans in devId_val.items():
- for plan in plans:
- if Constants.isDistMode():
- guider = Guider(plan, [dev.getDeviceId() \
- for dev in self.connDevices])
- else:
- guider = Guider(plan)
-
- guider.init_items()
- if self.isPreconSet:
- guider.setup_manual_env()
- guider.setup_default_env()
-
- def check_build_ids(self):
- if Constants.isDistMode() and \
- not Constants.checkBuildIds(self.connDevices):
- LOGGER.error("All connected devices should have the same build ids for distribute/auto-plan mode.")
- LOGGER.error("Devices with different build ids connected")
- raise
- return True
-
- def setup(self):
- self.env_setup()
- self.check_build_ids()
- self.guider_setup()
-
- def start_monitor(self):
- self.start_usbMonitor()
- self.start_netstatMonitor()
- self.start_dumpMonitor()
-
- def recovery_setup(self, workers):
- for worker in workers:
- if Constants.isSdbNetwork(worker.deviceId):
- for nsMonitor in self.netstat_monitors:
- if nsMonitor.deviceId == worker.deviceId:
- nsMonitor.setup_recovery(worker.rebootLock)
- else:
- if self.usb_monitor:
- self.usb_monitor.setup_recovery(\
- worker.deviceId, worker.rebootLock)
+++ /dev/null
-
-class DevNotFoundErr(Exception):
- def __init__(self, _devid):
- self.devid = _devid
- def __str__(self):
- return repr(self.devid)
+++ /dev/null
-#!/usr/bin/python
-
-from Tkinter import *
-
-class ActionFrame(Frame):
- def __init__(self, parent):
- Frame.__init__(self, parent)
- self.parent = parent
- self.planMenus = []
- self.devMenus = []
- self.tVerMenus = []
- self.plans = []
- self.devices = []
- self.tVersions = []
- self.scenario = []
- self.checkReady = []
-
- def initUI(self):
- for plan in self.plans:
- self.addPlan()
- self.infoLabel = Label(self.parent, text = "Prepare plans: choose plan, device id and tizen version.\n--Plans that aren't ready will be ignored", width = 75, height =4)
- self.infoLabel.grid(column = 1, row = 0, columnspan=4)
- self.addButton = Button(self.parent, text='Add Plan', command=self.addPlan, width = 37, height = 2)
- self.addButton.grid(column=1, row=1, columnspan=2, sticky='w')
- self.doneButton = Button(self.parent, text='Done', command=self.done, width = 37, height=2)
- self.doneButton.grid(column=2, row=1, columnspan=2, sticky='E')
-
-
- def importData(self, plans, devices, tVersions):
- self.plans = plans
- self.devices = devices
- self.tVersions = tVersions
- self.planOptions = plans[:]
- self.devOptions = devices[:]
- self.tVerOptions = tVersions[:]
- self.set_default()
-
- def set_default(self):
- self.planOptions.insert(0, "Select plan")
- self.devOptions.insert(0, "Select device")
- self.tVerOptions.insert(0, "Select version")
-
- def check(self, internal_v, index, op_mode):
- for i in range(len(self.planMenus)):
- selectedPlan = self.planMenus[i].get()
- selectedDevice = self.devMenus[i].get()
- selectedVersion = self.tVerMenus[i].get()
- if not ("Select " in selectedPlan + selectedDevice + selectedVersion):
- self.checkReady[i].config(text="Plan #%d : Ready" %(i+1), fg="green")
- else:
- self.checkReady[i].config(text="Plan #%d"%(i+1), fg='red')
-
- def addPlan(self):
- tail = len(self.planMenus)
- self.planMenus.append(StringVar(self.parent))
- self.planMenus[tail].set(self.planOptions[0])
- self.planMenus[tail].trace_variable('w', callback=self.check)
- self.devMenus.append(StringVar(self.parent))
- self.devMenus[tail].set(self.devOptions[0])
- self.devMenus[tail].trace_variable('w', callback=self.check)
- self.tVerMenus.append(StringVar(self.parent))
- self.tVerMenus[tail].set(self.tVerOptions[0])
- self.tVerMenus[tail].trace_variable('w', callback=self.check)
- self.checkReady.append(Label(self.parent, text="Plan #%d" %(tail+1), fg='red'))
- self.checkReady[tail].config(width = 15)
- self.checkReady[tail].grid(column = 0, row = tail+2)
- w = apply(OptionMenu, (self.parent, self.planMenus[tail]) + tuple(self.planOptions))
- w.config(width = 15)
- w.grid(column = 1, row = tail+2)
- w = apply(OptionMenu, (self.parent, self.devMenus[tail]) + tuple(self.devOptions))
- w.config(width = 40)
- w.grid(column = 2, row = tail+2)
- w = apply(OptionMenu, (self.parent, self.tVerMenus[tail]) + tuple(self.tVerOptions))
- w.config(width = 10)
- w.grid(column = 3, row = tail+2)
- self.check("", "", "")
- def run(self):
- #Button(root, text='Start', command=self.onStart, width=10).pack(side=LEFT)
- #Button(root, text='Exit', command=self.onExit, width=10).pack(side=LEFT)
- self.parent.mainloop()
-
- def done(self):
- for i in range(len(self.planMenus)):
- selectedPlan = self.planMenus[i].get()
- selectedDevice = self.devMenus[i].get()
- selectedVersion = self.tVerMenus[i].get()
- if not ("Select " in selectedPlan + selectedDevice + selectedVersion):
- strDevlist = [str(dev) for dev in self.devices]
- print strDevlist
- print self.devices
- self.scenario.append([selectedPlan, self.devices[strDevlist.index(selectedDevice)], selectedVersion])
- self.parent.quit()
-
- def getScenData(self):
- return self.scenario
+++ /dev/null
-#!/usr/bin/python
-from action_frame import ActionFrame
-from Tkinter import *
-
-class MainWindow:
- def __init__(self, title='Empty Title'):
- self.root = Tk()
- self.root.title(title)
- self.root.geometry("900x500+300+300")
-
- def getActionFrame(self):
- self.actionFrame = ActionFrame(self.root)
-
- def importData(self, plans, devices, tVersions):
- self.actionFrame.importData(plans, devices, tVersions)
- self.actionFrame.initUI()
- def run(self):
- #Button(root, text='Start', command=self.onStart, width=10).pack(side=LEFT)
- #Button(root, text='Exit', command=self.onExit, width=10).pack(side=LEFT)
- self.root.mainloop()
- def getScenData(self):
- return self.actionFrame.getScenData()
-
- def onExit(self):
- self.root.quit()
-
- def onStart(self):
- print "START"
+++ /dev/null
-#!/usr/bin/python
-import os
-import re
-from .constants import Constants
-from .shellwrapper import IntentionType
-from xml.etree import ElementTree
-import xml.etree.ElementTree as etree
-from .result_summary import ResultSummary
-from .logmanager import LOGGER
-from .shellplanner import *
-
-
-def _verifyPlan(planfile, tizenVersion):
- xml_tree = ElementTree.parse(planfile)
- xml_root = xml_tree.getroot()
- executeType = xml_root.find('execute_type')
- suites = xml_root.findall('suite')
- if executeType is None:
- LOGGER.warning("[WARNING] Plan xml:" + \
- " No execute type specified in plan xml")
- elif not executeType.text in ['All', 'Auto', 'Manual']:
- LOGGER.warning("[WARNING] Plan xml: Execute type in plan xml: %s. \
- Execute type should be either All, Auto or Manual" \
- % executeType.text)
- if len(suites) < 1:
- LOGGER.warning("No suites specified in plan xml")
- return True
-
-
-def _verifySuite(suite, tizenVersion):
- try:
- suite_name = suite.get('name')
- launcher = suite.get('launcher')
- auto_tcn = suite.find('auto_tcn')
- manual_tcn = suite.find('manual_tcn')
- total_tcn = suite.find('total_tcn')
- if suite_name is None:
- LOGGER.warning("[ERROR] Plan xml: Suite name is not specified")
- return False
-
- if suite.find('pkg_name') is None:
- LOGGER.warning("[ERROR] Plan xml:" + \
- " Package name is not specified for suite: %s" % suite_name)
- return False
-
- suite_pkg_name = suite.find('pkg_name').text
- suite_zipname = os.path.basename(suite_pkg_name)
- suite_path = os.path.join(Constants.SUITES_REPOSITORY % tizenVersion, \
- suite_pkg_name)
- if not os.path.isfile(suite_path):
- LOGGER.warning("suite_path does not exist. [%s]" % suite_path)
- return False
- auto_num, manual_num, suite_launcher, suite_category, tc_exist, s_name\
- = _get_suiteInfo(suite_zipname, suite_path, None)
-
- if suite_name != s_name:
- LOGGER.warning("[ERROR] Plan xml: Suite name [%s] does not match with \
- suite package name" % suite_name)
- return False
-
- if launcher != suite_launcher:
- LOGGER.warning("[WARNING] Plan xml: \
- Suite [%s] running on a different launcher" % suite_name)
-
- if auto_tcn is None:
- LOGGER.warning("[ERROR] Plan xml: \
- Suite [%s] Auto testcase count not specified" % suite_name)
- return False
- elif auto_tcn.text != str(auto_num):
- LOGGER.warning("[WARNING] Plan xml: \
- Suite [%s] Wrong auto testcase count" % suite_name)
-
- if manual_tcn is None:
- LOGGER.warning("[ERROR] Plan xml: \
- Suite [%s] Manual testcase count not specified" % suite_name)
- return False
- elif manual_tcn.text != str(manual_num):
- LOGGER.warning("[WARNING] Plan xml: \
- Suite [%s] Wrong manual testcase count" % suite_name)
-
- if total_tcn is None:
- LOGGER.warning("[ERROR] Plan xml: \
- Suite [%s] Total testcase count not specified" % suite_name)
- return False
- elif total_tcn.text != str(manual_num + auto_num):
- LOGGER.warning("[WARNING] Plan xml: \
- Suite [%s] Wrong total testcase count" % suite_name)
-
- Constants.clean_unzip_file()
- except Exception as ex:
- LOGGER.warning(str(ex))
- return True
-
-
-def _get_suiteInfo(filesname, filepath, tc_name):
- Constants.unzip_package(filepath)
- m = re.split(Constants.REGEX_FOR_SPLIT_PKG_NAME, filesname)
- name = m[0]
- test_file = os.path.expanduser("~") + "/" + Constants.DEFAULT_PLAN_FILE + \
- "/opt/" + name + "/tests.xml"
- LOGGER.debug("Getting information from suite package: %s" % test_file)
- if not os.path.exists(test_file):
- LOGGER.warning("Can't find the test file...")
- return 0, 0, Constants.WRT_LAUNCHER_CMD, None
- return _read_xml_suiteInfo(test_file, tc_name)
-
-
-def _read_xml_suiteInfo(test_file, tc_name):
- try:
- autocnt = manualcnt = 0
- test_xml_temp = etree.parse(test_file)
- tc_exist = False
- for test_xml_temp_suite in test_xml_temp.getiterator('suite'):
- suite_name = test_xml_temp_suite.get('name')
- suite_launcher = test_xml_temp_suite.get('launcher')
- suite_category = test_xml_temp_suite.get('category')
- autocnt = manualcnt = 0
- for tset in test_xml_temp_suite.getiterator('set'):
- set_autocnt, set_manualcnt, tcCheck = \
- _read_xml_tcInfo(tset, tc_name)
- autocnt += set_autocnt
- manualcnt += set_manualcnt
- if tcCheck:
- tc_exist = True
-
- return autocnt, manualcnt, suite_launcher, suite_category, tc_exist, \
- suite_name
-
- except Exception as msg:
- LOGGER.warning("error read xml %s package : %s" % \
- (str(test_file), str(msg)))
- return 0, 0, None, None, None, None
-
-
-def _read_xml_tcInfo(tset, tc_name):
- set_autocnt = set_manualcnt = 0
- tcCheck = False
- for tcase in tset.getiterator('testcase'):
- tcId = tcase.get('id')
- exetype = tcase.get('execution_type')
- if exetype == "auto":
- set_autocnt += 1
- elif exetype == "manual":
- set_manualcnt += 1
- if tc_name == tcId:
- tcCheck = True
-
- return set_autocnt, set_manualcnt, tcCheck
-
-
-def _parsTestScenario(scen_name, file_path, stubPort, skip_package, \
- skip_count, skip_tc):
- LOGGER.debug("parsing Test Scenario : " + file_path)
- plans = []
- xml_tree = ElementTree.parse(file_path)
- xml_root = xml_tree.getroot()
- for xml_plan in xml_root.findall('plan'):
- plan_file_path = xml_plan.find("path").text
- plan_name = xml_plan.get("name")
- plan_deviceId = xml_plan.find("device").get("id")
- plan_tizenVersion = xml_plan.find("version").text
- plans.append(_parsTestPlan(plan_file_path, plan_name, plan_deviceId, \
- None, plan_tizenVersion, None, stubPort, skip_package, \
- skip_count, skip_tc, scen_name)[0])
- return plans
-
-
-# return : TctShellSuite []
-def _parsTestPlan(file_path, plan_name, deviceId, executeType, tizenVersion, \
- resultFolder, stubPort, skip_package, skip_count, skip_tc, devmgr, \
- scen_name=None, make_ne_package=None, pre_test=None, post_test=None):
- suites = []
- profile = ""
- if not _verifyPlan(file_path, tizenVersion):
- LOGGER.warning("Please check the plan xml file: %s" % file_path)
- return None
-
- LOGGER.debug("parsing Test Plan : " + plan_name)
- xml_tree = ElementTree.parse(file_path)
- xml_root = xml_tree.getroot()
- if xml_root.get('profile') is not None:
- profile = xml_root.get('profile')
-
- if not executeType:
- executeType = ExecuteType.createExecuteType(\
- xml_root.find('execute_type').text)
-
- for xml_suite in xml_root.findall('suite'):
- if not _verifySuite(xml_suite, tizenVersion):
- continue
-
- packName = xml_suite.get("name")
- if skip_package and str(skip_package).find(packName) > -1:
- LOGGER.info("[skip package : %s]" % packName)
- else:
- is_make_ne = 0
- if make_ne_package and str(make_ne_package).find(suite_name) > -1:
- issue_num = _pars_issue_num(make_ne_package[0], suite_name)
- is_make_ne = int(issue_num)
-
- suite = TctShellSuite(packName, None, \
- xml_suite.find("auto_tcn").text, \
- xml_suite.find("manual_tcn").text, \
- xml_suite.find("pkg_name").text, \
- xml_suite.get("launcher"), xml_suite.get("category"), \
- tizenVersion, skip_count, skip_tc, devmgr, \
- pre_test=pre_test, \
- post_test=post_test, \
- is_make_ne=is_make_ne)
- suites.append(suite)
-
- plan = TctShellPlan(plan_name, devmgr, deviceId, profile, executeType, \
- suites, tizenVersion, resultFolder, stubPort, scen_name)
-
- if Constants.isDistMode():
- if not plan.setup_distribute():
- raise
-
- return [plan]
-
-
-def _parsTestProfile(path_suites, deviceId, executeType, tizenV, profile, \
- resultFolder, stubPort, skip_package, skip_count, skip_tc, devmgr, \
- distribute_count, make_ne_package=None, pre_test=None, post_test=None):
- suites = []
- LOGGER.debug("Preparing Test Suite ")
- suite_profile = os.path.basename(os.path.dirname(path_suites[0]))
- for counter, suite_path in enumerate(path_suites):
- counter = counter + 1
- suite_profile = os.path.basename(os.path.dirname(suite_path))
- suite_zipname = os.path.basename(suite_path)
- suite_name = _geneSuiteName(suite_zipname, tizenV)
- auto_num, manual_num, suite_launcher, suite_category, tc_exist, s_name\
- = _get_suiteInfo(suite_zipname, suite_path, None)
-
- suite_tizenVer = tizenV
- suite_pkg_name = os.path.join(suite_profile, \
- os.path.basename(suite_path))
-
- dist_res = None
- if distribute_count:
- dist_res = _check_dist_number(counter, distribute_count)
-
- if skip_package and str(skip_package).find(suite_name) > -1:
- LOGGER.info("[skip package : %s]" % suite_name)
- elif auto_num == 0 and manual_num == 0:
- pass
- else:
- is_make_ne = 0
- if make_ne_package and str(make_ne_package).find(suite_name) > -1:
- issue_num = _pars_issue_num(make_ne_package[0], suite_name)
- is_make_ne = int(issue_num)
-
- suite = TctShellSuite(suite_name, None, auto_num, manual_num, \
- suite_pkg_name, suite_launcher, suite_category, \
- suite_tizenVer, skip_count, skip_tc, devmgr, \
- pre_test=pre_test, \
- post_test=post_test, \
- is_make_ne=is_make_ne)
-
- if not distribute_count:
- suites.append(suite)
- elif dist_res:
- suites.append(suite)
-
- Constants.clean_unzip_file()
-
- temp_plan_name = profile
- plan = TctShellPlan(temp_plan_name, devmgr, deviceId, profile, executeType, \
- suites, tizenV, resultFolder, stubPort)
-
- if Constants.isDistMode():
- if not plan.setup_distribute():
- raise
-
- return [plan]
-
-
-def _parsTestSuite(path_suites, deviceId, executeType, tizenVersion, tc_name, \
- resultFolder, stubPort, devmgr, skip_count=None, skip_tc=None, \
- pre_test=None, post_test=None, make_ne_package=None):
- #type(suites) -> list
- suites = []
- LOGGER.debug("Preparing Test Suite ")
- suite_profile = os.path.basename(os.path.dirname(path_suites[0]))
- for suite_path in path_suites:
- suite_zipname = os.path.basename(suite_path)
- suite_name = _geneSuiteName(suite_zipname, tizenVersion)
- auto_num, manual_num, suite_launcher, suite_category, tc_exist, s_name\
- = _get_suiteInfo(suite_zipname, suite_path, tc_name)
- if tc_name is not None and not tc_exist:
- LOGGER.warning("Testcase Id : [%s] does not exist in suite : [%s]" \
- % (tc_name, suite_name))
- return None
-
- suite_tizenVer = tizenVersion
- suite_pkg_name = os.path.join(suite_profile, \
- os.path.basename(suite_path))
-
- is_make_ne = 0
- if make_ne_package and str(make_ne_package).find(suite_name) > -1:
- issue_num = _pars_issue_num(make_ne_package[0], suite_name)
- is_make_ne = int(issue_num)
-
- suite = TctShellSuite(suite_name, tc_name, auto_num, manual_num, \
- suite_pkg_name, suite_launcher, suite_category, \
- suite_tizenVer, skip_count, skip_tc, devmgr, \
- pre_test=pre_test, \
- post_test=post_test, \
- is_make_ne=is_make_ne)
-
- suites.append(suite)
- Constants.clean_unzip_file()
-
- temp_plan_name = "temp_plan_name"
- plan = TctShellPlan(temp_plan_name, devmgr, deviceId, suite_profile, executeType, \
- suites, tizenVersion, resultFolder, stubPort)
-
- if Constants.isDistMode():
- if not plan.setup_distribute():
- raise
-
- return [plan]
-
-
-def _parsTestCase(path_suites, deviceId, executeType, tizenVersion, \
- testcase_id, resultFolder, stubPort, devmgr):
- LOGGER.debug("parsing Test Case : " + str(testcase_id))
-
- return _parsTestSuite(path_suites, deviceId, executeType, tizenVersion, \
- testcase_id, resultFolder, stubPort, devmgr)
-
-
-def _parsAutoPlan(planFile, plan_name, executeType, tizenVer, \
- resultFolderPath, stubPort, skip_package, skip_count, skip_tc, \
- devmgr, pre_test=None, post_test=None, make_ne_package=None):
- if not _verifyPlan(planFile, tizenVer):
- LOGGER.warning("Please check the plan xml file: %s" % planFile)
- return None
-
- LOGGER.debug("parsing Test Plan : " + planFile)
- suites = []
- profile = ""
- planList = []
- deviceLen = devmgr.getDeviceSize()
- if deviceLen < 1:
- LOGGER.error("No connected device")
- return None
-
- LOGGER.info("Plan [%s] will be distributed to %d devices" \
- % (plan_name, deviceLen))
- devices = devmgr.getSdbDeviceList()
- xml_tree = ElementTree.parse(planFile)
- xml_root = xml_tree.getroot()
- if xml_root.get('profile') is not None:
- profile = xml_root.get('profile')
-
- if not executeType:
- executeType = ExecuteType.createExecuteType(\
- xml_root.find('execute_type').text)
-
- for dev in range(deviceLen):
- planTempName = plan_name + str(dev)
- devId = devices[dev].getDeviceId()
- planList.append(TctShellPlan(planTempName, devId, profile, \
- executeType, [], tizenVer, resultFolderPath, stubPort, \
- plan_name))
-
- for xml_suite in xml_root.findall('suite'):
- if not _verifySuite(xml_suite, tizenVer):
- continue
- autoCount = int(xml_suite.find("auto_tcn").text)
- category = xml_suite.get("category")
- if category and category.find('Runtime') > -1:
- etime = autoCount * (Constants.SUITE_TEST_EXPECTED_TIME + 2)
- else:
- etime = (autoCount * 2) + Constants.SUITE_TEST_EXPECTED_TIME
-
- suite_name = xml_suite.get("name")
- if skip_package and str(skip_package).find(suite_name) > -1:
- LOGGER.error("[skip package : %s]" % suite_name)
- else:
- is_make_ne = 0
- if make_ne_package and str(make_ne_package).find(suite_name) > -1:
- issue_num = _pars_issue_num(make_ne_package[0], suite_name)
- is_make_ne = int(issue_num)
-
- suite = TctShellSuite(suite_name, None, \
- xml_suite.find("auto_tcn").text, xml_suite.find("manual_tcn").text,\
- xml_suite.find("pkg_name").text, xml_suite.get("launcher"), \
- xml_suite.get("category"), tizenVer, skip_count, skip_tc, \
- devmgr, pre_test=pre_test, post_test=post_test, is_make_ne=is_make_ne)
-
- suite.setExpectedTime(etime)
- if suite.suite_pkg_name is None:
- LOGGER.warning("suite: [%s] has missing information" \
- % suite.suiteName)
- return None
- suites.append(suite)
- suites.sort(key=lambda x: x.expectedTime, reverse=True)
- for suite in suites:
- minPlan = min(planList, key=lambda x: x.expectedTime)
- minPlan.addExpectedTime(suite.getExpectedTime())
- minPlan.addSuite(suite)
-
- for plan in planList:
- LOGGER.debug("%s has ECT: %d" % (plan.getPlanName(), \
- plan.expectedTime))
-
- return planList
-
-
-def _parsResultForRerun(wrapper, skip_package, skip_count, skip_tc, devmgr, \
- distribute_count, pre_test=None, post_test=None, make_ne_package=None):
- result = wrapper.get_result_for_rerun()
- rerun_plan_creator = ResultSummary()
- rerun_data = rerun_plan_creator.prepareRerun(result)
- if len(rerun_data) < 1:
- LOGGER.debug("No unpassed results to rerun")
- return None
-
- plans = []
- for plan_path, rerun_info in rerun_data.items():
- planFolder = plan_path
- intention_info = rerun_info[0]
- suites_path = rerun_info[1]
- plan_name = intention_info[0]
- executeType = ExecuteType.createExecuteType(intention_info[1])
- profile = intention_info[2]
- tizenVer = intention_info[3]
- deviceId = intention_info[4]
- scen_resultFolderPath = intention_info[6]
-
- if len(suites_path) < 1:
- LOGGER.debug("No unpassed results to rerun in plan: [%s]" \
- % plan_name)
- continue
-
- if devmgr.getDevice(deviceId) is None:
- if len(rerun_data) > 1:
- LOGGER.error("Required devices not connected. " + \
- "Check what devices were used for the scenario.")
-
- LOGGER.warning("WARNING: \
- Device used for the test is not connected: \
- device id: %s" % deviceId)
- LOGGER.warning("WARNING: Rerunning the test in a different device")
- if Constants.isDistMode():
- deviceId = None
- else:
- deviceId = wrapper.get_deviceId()
-
- suites = []
- resultFolderPath = wrapper.get_resultFolderPath()
- if not resultFolderPath:
- resultFolderPath = planFolder
-
- for counter, suite_path in enumerate(suites_path):
- counter = counter + 1
- suite_pkg_name = os.path.join(os.path.basename(\
- os.path.dirname(suite_path)), os.path.basename(suite_path))
- suite_zipname = os.path.basename(suite_pkg_name)
- suite_name = _geneSuiteName(suite_zipname, tizenVer)
- auto_num, manual_num, suite_launcher, suite_category, \
- tc_exist, s_name = _get_suiteInfo(suite_zipname, \
- suite_path, None)
-
- dist_res = None
- if distribute_count:
- dist_res = _check_dist_number(counter, distribute_count)
-
- if skip_package and str(skip_package).find(suite_name) > -1:
- LOGGER.error("[skip package : %s]" % suite_name)
- else:
- is_make_ne = 0
- if make_ne_package and \
- str(make_ne_package).find(suite_name) > -1:
- issue_num = _pars_issue_num(make_ne_package[0], \
- suite_name)
- is_make_ne = int(issue_num)
-
- suite = TctShellSuite(suite_name, None, auto_num, manual_num, \
- suite_pkg_name, suite_launcher, suite_category, \
- tizenVer, skip_count, skip_tc, devmgr, \
- pre_test=pre_test, \
- post_test=post_test, \
- is_make_ne=is_make_ne)
-
- if not distribute_count:
- suites.append(suite)
- elif dist_res:
- suites.append(suite)
-
- plan = TctShellPlan(plan_name, devmgr, deviceId, profile, executeType, suites,\
- tizenVer, resultFolderPath, wrapper.get_stubPort())
- plan.setScenResultFolderPath(scen_resultFolderPath)
- plan.setRerunning(True)
- plans.append(plan)
-
- if Constants.isDistMode():
- for plan in plans:
- if not plan.setup_distribute():
- raise
-
- return plans
-
-
-def _geneSuiteName(suite_zipname, _tizenV):
- suite_name = ""
- match_ext = ""
-
- if _tizenV:
- match_ext = "-{}.zip".format(_tizenV.split('_')[-1])
- find_idx = suite_zipname.find(match_ext)
- if find_idx > -1:
- suite_name = suite_zipname[0:find_idx]
- else:
- LOGGER.warning("Not found suite name")
-
- return suite_name
-
-
-MATCH_CT = 0
-def _check_dist_number(suite_num, dist_ct):
- global MATCH_CT
- total = int(dist_ct.split('-')[0])
- curr = int(dist_ct.split('-')[1])
-
- if curr > total:
- LOGGER.error("distribute command error")
- raise
-
- if MATCH_CT == 0:
- MATCH_CT = MATCH_CT + curr
- if suite_num == MATCH_CT:
- MATCH_CT = MATCH_CT + total
- return True
- else:
- return False
-
-
-def _pars_issue_num(_make_ne_package, _suite_name):
- ne_pack_list = _make_ne_package.split(',')
- for _pn in ne_pack_list:
- if _pn.find(_suite_name) > -1:
- return _pn.split(':')[1]
- return 0
-
-
-class IntentionGenerator:
- # return : bool
- @staticmethod
- def genIntentionData(wrapper, devmgr):
- skip_package = wrapper.get_skip_package()
- skip_count = wrapper.get_skip_count()
- skip_tc = wrapper.get_skip_tc()
- make_ne_package = wrapper.get_make_ne()
- pre_test = wrapper.get_pre_test()
- post_test = wrapper.get_post_test()
- distribute_count = wrapper.get_distribute_count()
-
- if wrapper.get_running_mode() == Constants.RUNNING_MODE_RERUN:
- return _parsResultForRerun(wrapper, skip_package, skip_count, \
- skip_tc, devmgr, distribute_count, \
- make_ne_package=make_ne_package)
-
- intention_type = wrapper.getIntentionType()
- deviceId = None
- if not (intention_type == IntentionType.AutoPlan or \
- Constants.isDistMode()):
- deviceId = wrapper.get_deviceId()
- else:
- deviceId = None
-
- tcId = wrapper.get_testcase_id()
- executeType = wrapper.get_execute_type()
- suites = wrapper.get_suites()
- tizenVer = wrapper.get_tizenV()
- resultFolderPath = wrapper.get_resultFolderPath()
- stubPort = wrapper.get_stubPort()
-
- if intention_type == -1:
- return None
-
- if (intention_type == IntentionType.TestPlan or \
- intention_type == IntentionType.TestProfile or \
- intention_type == IntentionType.TestSuite) and \
- not Constants.isDistMode():
- if not wrapper.is_make_summary_mode():
- if not devmgr.isDeviceAvailable(deviceId):
- LOGGER.error("Device [%s] is not connected" % deviceId)
- LOGGER.error("Required devices not connected properly")
- return None
-
- if intention_type == IntentionType.TestScenario:
- scenFile = wrapper.get_scenfile()
- scenName = wrapper.get_scen_name()
- plans = _parsTestScenario(scenName, scenFile, stubPort, \
- skip_package, skip_count, skip_tc)
- elif intention_type == IntentionType.TestPlan:
- name = wrapper.get_plan_name()
- planFile = wrapper.get_planfile()
- plans = _parsTestPlan(planFile, name, deviceId, executeType, \
- tizenVer, resultFolderPath, stubPort, skip_package, \
- skip_count, skip_tc, devmgr, make_ne_package=make_ne_package, \
- pre_test=pre_test, post_test=post_test)
- elif intention_type == IntentionType.TestCase:
- plans = _parsTestCase(suites, deviceId, executeType, tizenVer, \
- tcId, resultFolderPath, stubPort, devmgr)
- elif intention_type == IntentionType.TestSuite:
- plans = _parsTestSuite(suites, deviceId, executeType, tizenVer, \
- None, resultFolderPath, stubPort, devmgr, skip_count, \
- skip_tc, make_ne_package=make_ne_package, pre_test=pre_test, post_test=post_test)
- elif intention_type == IntentionType.AutoPlan:
- name = wrapper.get_plan_name()
- autoFile = wrapper.get_autoplanfile()
- plans = _parsAutoPlan(autoFile, name, executeType, tizenVer, \
- resultFolderPath, stubPort, skip_package, skip_count, \
- skip_tc, devmgr, make_ne_package=make_ne_package, pre_test=pre_test, post_test=post_test)
- elif intention_type == IntentionType.TestProfile:
- profile_suites = wrapper.get_profile_suites()
- if not profile_suites:
- return None
- profile = wrapper.get_profile()
- plans = _parsTestProfile(profile_suites, deviceId, executeType, \
- tizenVer, profile, resultFolderPath, stubPort, \
- skip_package, skip_count, skip_tc, devmgr, distribute_count, \
- make_ne_package=make_ne_package, pre_test=pre_test, post_test=post_test)
-
- return plans
+++ /dev/null
-import logging
-import os
-import shutil
-
-BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
-
-RESET_SEQ = "\033[0m "
-COLOR_SEQ = "\033[%dm "
-BOLD_SEQ = "\033[1m "
-
-LEVELS = {"CRITICAL": 50,
- "ERROR": 40,
- "WARNING": 30,
- "INFO": 20,
- "DEBUG": 10,
- "NOTSET": 0
- }
-
-COLORS = {"CRITICAL": YELLOW,
- "ERROR": RED,
- "WARNING": YELLOW,
- "INFO": WHITE,
- "DEBUG": CYAN,
- "NOTSET": WHITE
- }
-
-
-def formatter_message(message, use_color=True):
- if use_color:
- message = message.replace("$RESET", RESET_SEQ)\
- .replace("$BOLD", BOLD_SEQ)
- else:
- message = message.replace("$RESET", "").replace("$BOLD", "")
-
- return message
-
-
-class ColoredFormatter(logging.Formatter):
-
- def __init__(self, msg, datefmt, use_color=True):
- logging.Formatter.__init__(self, msg, datefmt)
- self.use_color = use_color
-
- def format(self, record):
- levelname = record.levelname
- record_msg = record.msg
- if self.use_color and levelname in COLORS:
- if levelname == "ERROR":
- colorsq = "\033[1;%dm "
- else:
- colorsq = COLOR_SEQ
- colored_msg = colorsq % (30 + COLORS[levelname]) \
- + record_msg + RESET_SEQ
- record.msg = colored_msg
-
- return logging.Formatter.format(self, record)
-
-class MultiHandler(logging.Handler):
-
- def __init__(self, dirname):
- super(MultiHandler, self).__init__()
- self.files = {}
- self.dirname = dirname
-
- def flush(self):
- self.acquire()
- try:
- for fp in self.files.values():
- fp.flush()
- finally:
- self.release()
-
- def _get_or_open(self, key):
- self.acquire()
- try:
- if key in self.files:
- return self.files[key]
- else:
- file_path = os.path.join(self.dirname, "%s.log" % key)
- if os.path.exists(file_path):
- os.remove(file_path)
- fp = open(file_path, "a")
- self.files[key] = fp
- return fp
- finally:
- self.release()
-
- def deformat(self, msg):
- import re
- ansi_escape = re.compile(r'\x1b[^m]*m')
-
- return ansi_escape.sub('', msg)
-
- def emit(self, record):
- try:
- fp = self._get_or_open(record.processName)
- msg = self.format(record)
- #fp.write('%s\n' % self.deformat(msg).encode("utf-8"))
- fp.write("%s\n" % str(msg))
- except (KeyboardInterrupt, SystemExit):
- raise
- except UnicodeDecodeError:
- pass
- except:
- self.handleError(record)
-
-
-class LogManager:
-
- def __init__(self, logname="mTCT", log_format=\
- '%(asctime)15s %(processName)18s #%(levelname).3s %(module) 18s:%(lineno)-4d %(message)s', \
- dirname="/opt/tools/shell/tmp/logs"):
- self._remove_logdir(dirname)
- colorformatter1 = ColoredFormatter(formatter_message(log_format), \
- "%Y-%m-%d_%H:%M:%S", False)
-
- stderr_handler = logging.StreamHandler()
- stderr_handler.setFormatter(colorformatter1)
- logging.getLogger().addHandler(stderr_handler)
-
- infoHandler = logging.FileHandler(dirname + "/info.log")
- infoHandler.setLevel(logging.INFO)
- infoHandler.setFormatter(colorformatter1)
-
- debugHandler = logging.FileHandler(dirname + "/debug.log")
- debugHandler.setLevel(logging.DEBUG)
- debugHandler.setFormatter(colorformatter1)
-
- errorHandler = logging.FileHandler(dirname + "/error.log")
- errorHandler.setLevel(logging.ERROR)
- errorHandler.setFormatter(colorformatter1)
-
- warnHandler = logging.FileHandler(dirname + "/warning.log")
- warnHandler.setLevel(logging.WARNING)
- warnHandler.setFormatter(colorformatter1)
-
- criticalHandler = logging.FileHandler(dirname + "/critical.log")
- criticalHandler.setLevel(logging.CRITICAL)
- criticalHandler.setFormatter(colorformatter1)
-
- multi_handler = MultiHandler(dirname)
- multi_handler.setFormatter(colorformatter1)
- logging.getLogger().addHandler(multi_handler)
-
- _logger = logging.getLogger(logname)
- _logger.addHandler(infoHandler)
- _logger.addHandler(debugHandler)
- _logger.addHandler(errorHandler)
- _logger.addHandler(warnHandler)
- _logger.addHandler(criticalHandler)
-
- _logger.setLevel('INFO')
- self.logger = _logger
-
- def _get_logger(self):
- return self.logger
-
- def _remove_logdir(self, dirname):
- if os.path.exists(dirname):
- shutil.rmtree(dirname)
- if not os.path.exists(dirname):
- os.makedirs(dirname, mode=0o777)
-
- if not os.access(dirname, os.W_OK):
- raise Exception("Directory %s not writeable" % dirname)
-
-
-LOGGER = LogManager()._get_logger()
+++ /dev/null
-#!/usr/bin/python
-
-import time
-
-from .sdbmanager import SdbManager
-from .logmanager import LOGGER
-from multiprocessing import Process
-
-
-class NetstatMonitor(Process):
-
- netstat_cmd = 'netstat -tan | grep %s'
- deviceId = ""
-
- def __init__(self, deviceId, devmgr):
- Process.__init__(self)
- self.daemon = True
- self.name = "Netstat_%s" % deviceId.split('.')[-1].split(':')[0]
- self.deviceId = deviceId
- self.__suspend = True
- self.devmgr = devmgr
- self.recovery_lock = None
- self.isFinish = False
-
- def run(self):
- LOGGER.debug("Starting NetstatLogger")
- state_changed = False
- wasConnected = True
- while True:
- if self.isFinish:
- break
- time.sleep(10)
- exit_code, stdout, stderr = SdbManager.sdbCommand(\
- self.netstat_cmd % self.deviceId, 3)
- outLog = stdout.read()
- netValues = self.parsingLogData(outLog)
- isConnected = self.checkConnectState(netValues)
- state_changed = isConnected is not wasConnected
-
- if state_changed:
- if isConnected:
- LOGGER.info("Device connected")
- self.device_recovered()
- else:
- LOGGER.error("Device disconnected")
- self.reLoadDeviceList()
- wasConnected = isConnected
-
- def kill_netMonitor(self):
- self.isFinish = True
-
- def getThreadStatus(self):
- return self.__suspend
-
- def restartThread(self):
- time.sleep(10)
- LOGGER.info("Starting %s device monitor" % self.deviceId)
- self.__suspend = False
-
- def reLoadDeviceList(self):
- LOGGER.debug('Netstat: reLoadDeviceList')
- if not self.devmgr.loadDeviceList():
- LOGGER.error('0 device is connected')
-
- def parsingLogData(self, outLog):
- outLog = outLog.rstrip()
- resultLog = outLog.split(' ')
- parsLog = []
- for log in resultLog:
- if len(log) != 0:
- parsLog.append(log)
-
- return parsLog
-
- def setup_recovery(self, lock):
- self.recovery_lock = lock
-
- def device_recovered(self):
- try:
- self.recovery_lock.release()
- except:
- pass
-
- def checkConnectState(self, netValues):
- for val in netValues:
- if val and val.find('ESTABLISHED') != -1:
- return True
-
- return False
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Tang, Shaofeng <shaofeng.tang@intel.com>
-
-import sys
-import os
-import re
-import platform
-import glob
-from optparse import *
-from constants import Constants
-from logmanager import LOGGER
-
-
-#show all available suites
-def _show_available_suites(option, opt_str, value, parser):
- print "Test Suites:...\n"
- os.chdir("/opt/tct/")
- for t_version in glob.glob("tizen*"):
- print "Tizen Version : %s" % t_version
- package_dir = os.path.join(os.path.abspath(t_version), 'packages')
- if not os.path.isdir(package_dir):
- continue
- os.chdir(package_dir)
- for profile in glob.glob("*"):
- if profile == 'pkg_infos':
- continue
- print " profile : %s" % profile
- os.chdir(os.path.abspath(profile))
- for files in glob.glob("*.zip"):
- print " " + files[:-4]
- os.chdir('../')
- os.chdir('../../')
- sys.exit(1)
-
-
-def _print_planfolder(option, opt_str, value, parser):
- print "Plan folder: %s" % Constants.TCT_PLAN_FOLDER
- os.system("tree %s" % Constants.TCT_PLAN_FOLDER)
- sys.exit(1)
-
-
-def varnarg(option, opt_str, value, parser):
- """ parser srg"""
- value = []
- for arg in parser.rargs:
- if re.search('^--.+', arg) or re.search('^-[\D]', arg):
- break
- value.append(arg)
-
- del parser.rargs[:len(value)]
- setattr(parser.values, option.dest, value)
-
-
-class PlanGeneratorOptions:
-
- def __init__(self):
- self._j = os.path.join
- self._e = os.path.exists
- self._d = os.path.dirname
- self._b = os.path.basename
- self._abspath = os.path.abspath
- self.testkit_dir = "/opt/testkit/lite"
- self.LOG_DIR = self.testkit_dir
- self.PID_FILE = self._j(self.LOG_DIR, "pid.log")
- if not platform.system() == "Linux":
- self.testkit_dir = self._d(self._abspath(__file__))
- sys.path += [self._j(self.testkit_dir)]
- self.testkit_dir = self._j(self.testkit_dir, "results")
- #self.clean_context()
- self.options = None
- self.options = None
- self.running_mode = None
- self.USAGE = "tct-plan-generator [options] --output <somewhere/testplan.xml>\n\
-examples: \n\
- tct-plan-generator -p mobile -o <somewhere>/testplan.xml\n\
- tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder\n\
- tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder --match '<regex>'\n\
-\n\
- generate a test plan to include all suites in the local repository: \n\
- tct-plan-generator -p mobile -o <somewhere>/testplan.xml\n\
- generate a test plan to include all suites in the special repository: \n\
- tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder\n\
- generate a test plan to include the suites in the special repository which name is matched with 'webapi*.rpm': \n\
- tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder --match 'webapi*.rpm'\n\
- generate a test plan to include the suites in the special repository which name is matched with 'webapi*.rpm', and exclude the file 'webapi-tizen-push-tests-2.1.6-1.1.armv7l.rpm': \n\
- tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder --match 'webapi*.rpm' --unmatch push\n\
-\n\
-Note: \n\
- 1) run command 'tct-plan-generator', it might not be able to locate related module, run command 'export PYTHONPATH=/usr/lib/python2.7/site-packages' to resolve this issue"
-
- def print_usage(self):
- print self.USAGE
-
- def parse_options(self, argv):
- option_list = [
- make_option("-o", "--output", dest="testplan_file", \
- action="callback", callback=varnarg, \
- help="Specify the generating testplan in a XML file."),
- make_option("-e", "--execute", dest="execute_type", \
- action="callback", callback=varnarg, \
- help="Specify the execute_type of testplan in a XML file."),
- make_option("-r", "--repository", dest="repository_folder", \
- action="callback", callback=varnarg, \
- help="Specify the path of local repository."),
- make_option("--tizen-version", dest="tizenversion", \
- action="callback", callback=varnarg, \
- help="Specify the name of tizen-version you want to run test. The tizen-version is defined in the local repository. and its path is '/opt/tct/'"),
- make_option("-m", "--match", dest="match_regex", \
- action="callback", callback=varnarg, \
- help="The regex for matching filename."),
- make_option("-p", "--profile", dest="test_profile", \
- action="callback", callback=varnarg, \
- help="The profile of the test plan."),
- make_option("-u", "--unmatch", dest="unmatch_regex", \
- action="callback", callback=varnarg, \
- help="The regex for unmatching filename."),
- make_option("--plan-list", dest="show_plan_folder", \
- action="callback", callback=_print_planfolder, \
- help="List all existed plan in the Plan folder. The plan folder is defined in the configure '/opt/tct/shell/CONF'"),
- make_option("-a", "--all-suites", dest="show_suites", \
- action="callback", callback=_show_available_suites, \
- help="Show all available test-suites"),
- ]
- # detect non-params
- if len(argv) == 1:
- argv.append("-h")
- PARSERS = OptionParser(option_list=option_list, usage=self.USAGE)
- (self.options, args) = PARSERS.parse_args()
-
- if self.options.tizenversion:
- self.check_tizen_version()
- else:
- LOGGER.error("The default tizen version could not be set.")
- sys.exit("No tizen version specified")
-
- if not self.options.match_regex:
- LOGGER.error("The default match_regex could not be set.")
- sys.exit("No match regex specified. Use -m or --match option")
-
- def check_tizen_version(self):
- tizenversion = self.options.tizenversion[0]
- VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d|^tizen_csharp_\d.\d"
- pa = re.compile(VER_PATTERN, re.I)
- ma = pa.match(tizenversion)
- if ma is None:
- LOGGER.error("A required \"/opt/tct/" + tizenversion + \
- " could not be found.")
- sys.exit("Invalid Tizen version. Tizen version must be in the form of tizen_(web|native|csharp)_#.#")
- return False
- return True
-
- def get_repository_folder(self):
- if (self.options.repository_folder is not None) and \
- (self.options.repository_folder[0] is not None):
- return self.options.repository_folder[0]
- else:
- return Constants.SUITES_REPOSITORY % self.get_tizenV()
-
- def get_match_regex(self):
- if (self.options.match_regex is not None) and \
- (self.options.match_regex[0] is not None):
- return self.options.match_regex[0]
- else:
- return Constants.DEFAULT_MATCH_REGEX
-
- def get_plan_name(self):
- if (self.options.testplan_file is not None) and \
- (self.options.testplan_file[0] is not None):
- name, ext = os.path.splitext(self.options.testplan_file[0])
- return name.split("/")[-1]
- else:
- return Constants.DEFAULT_PLAN_NAME
-
- def get_profile_name(self):
- if (self.options.test_profile is not None) and \
- (self.options.test_profile[0] is not None):
- return self.options.test_profile[0]
- else:
- return Constants.DEFAULT_PROFILE_NAME
-
- def get_execute_type(self):
- if (self.options.execute_type is not None) and \
- (self.options.execute_type[0] is not None):
- return self.options.execute_type[0]
- else:
- return Constants.DEFAULT_EXECUTE_TYPE
-
- def get_tizenV(self):
- if (self.options.tizenversion is not None) and \
- (self.options.tizenversion[0] is not None):
- return self.options.tizenversion[0]
- else:
- print "Error: Please specify Tizen version with [--tizen-version] option"
- sys.exit(1)
-
- def get_output(self):
- if (self.options.testplan_file is not None) and \
- (self.options.testplan_file[0] is not None):
- d = os.path.abspath(os.path.dirname(self.options.testplan_file[0]))
- if not os.path.exists(d):
- os.makedirs(d)
- return os.path.abspath(self.options.testplan_file[0])
- else:
- return Constants.TCT_PLAN_FOLDER + "generated_plan.xml"
-
- def get_unmatch_regex(self):
- if (self.options.unmatch_regex is not None) and \
- (self.options.unmatch_regex[0] is not None):
- return self.options.unmatch_regex[0]
- else:
- return Constants.DEFAULT_UNMATCH_REGEX
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# Authors:
-# Tang, Shaofeng <shaofeng.tang@intel.com>
-
-from constants import Constants
-from xml.etree import ElementTree
-from logmanager import LOGGER
-import xml.etree.ElementTree as etree
-import os
-import os.path
-import sys
-import glob
-import re
-
-
-class SuitePackage:
- def __init__(self, profile, file_name, launcher, category, auto_count, \
- manual_count):
- self.file = file_name
- self.profile = profile
- m = re.split(Constants.REGEX_FOR_SPLIT_PKG_NAME, file_name)
- self.name = m[0]
- self.auto_count = auto_count
- self.manual_count = manual_count
- self.total_count = auto_count + manual_count
- self.launcher = launcher
- self.category = category
-
- def to_xml(self):
- suite = ElementTree.Element('suite')
- suite.set('name', self.name)
- if self.launcher:
- suite.set('launcher', self.launcher)
-
- if self.category:
- suite.set('category', self.category)
-
- auto = ElementTree.Element('auto_tcn')
- auto.text = str(self.auto_count)
- suite.append(auto)
- manual = ElementTree.Element('manual_tcn')
- manual.text = str(self.manual_count)
- suite.append(manual)
- total = ElementTree.Element('total_tcn')
- total.text = str(self.total_count)
- suite.append(total)
- rpm_name = ElementTree.Element('pkg_name')
- rpm_name.text = self.profile + '/' + self.file
- suite.append(rpm_name)
-
- return suite
-
-
-class PlanRunner:
-
- def __init__(self):
- self.suites = {}
- self.suite_paths = []
- self.plan_name = Constants.DEFAULT_PLAN_NAME
- self.profile = Constants.DEFAULT_PROFILE_NAME
- self.execute_type = Constants.DEFAULT_EXECUTE_TYPE
-
- def load_local_repo(self, path, tizenV, match, unmatch, plan_name, \
- profile, execute_type):
- try:
- self.plan_name = plan_name
- self.profile = profile
- self.execute_type = execute_type
- raw_paths = []
- repos = ['common', profile]
- for tp in repos:
- repo = '/'.join([path, tp])
- if not os.path.isdir(repo):
- continue
-
- os.chdir(repo)
- for files in glob.glob("*" + match + "*"):
- print "Matched File name: %s" % str(os.path.abspath(files))
- if (unmatch is not None) and (re.search(unmatch, \
- str(files))):
- print "File %s is skipped with unmatch regex %s" \
- % (str(files), unmatch)
- else:
- raw_paths.append(os.path.join(repo, str(files)))
-
- if len(raw_paths) < 1:
- sys.exit("Match regex: [%s] No matching suite package found." \
- % match)
-
- self.suite_paths = self._chooseProfile(raw_paths)
- for files in self.suite_paths:
- profile = os.path.basename(os.path.dirname(files))
- auto, manual, launcher, category = \
- self.get_count_launcher_category(\
- os.path.basename(files), files)
- suite = SuitePackage(profile, os.path.basename(files), \
- launcher, category, auto, manual)
- self.suites[suite.name] = suite
- Constants.clean_unzip_file()
- except Exception, e:
- print "[ Error happen when reading the local repository," + \
- " error: %s ]\n" % e
-
- def _chooseProfile(self, path_suites):
- suite_profiles = {}
- filtered_suites = []
- suite_repo = os.path.dirname(os.path.dirname(path_suites[0]))
- for suite_path in path_suites:
- suite_zipname = os.path.basename(suite_path)
- sprofile = os.path.basename(os.path.dirname(suite_path))
- if not suite_zipname in suite_profiles:
- suite_profiles[suite_zipname] = []
-
- suite_profiles[suite_zipname].append(sprofile)
-
- for suiteName, suiteProfile in suite_profiles.items():
- suite_name = "-".join(suiteName[:-4].split("-")[:-1])
- if len(suiteProfile) == 1:
- suite_profiles[suiteName] = suiteProfile[0]
- continue
-
- print "\nMultiple profiles for [%s] \
- :\n----------------------------------------------" \
- % suite_name
-
- for profile_i in suiteProfile:
- print " - %s" % profile_i
-
- suite_profile = None
- while not suite_profile in suiteProfile:
- suite_profile = raw_input("\nChoose profile: ")
-
- suite_profiles[suiteName] = suite_profile
-
- check_profile = None
- multiProfiles = False
- for suiteName, suiteProfile in suite_profiles.items():
- if suiteProfile != 'common':
- if check_profile is not None and check_profile != suiteProfile:
- multiProfiles = True
-
- if check_profile is None:
- check_profile = suiteProfile
-
- filtered_suites.append(\
- os.path.join(suite_repo, suiteProfile, suiteName))
-
- if multiProfiles:
- LOGGER.warning("WARNING: \
- Multiple suites run with different profiles")
-
- return filtered_suites
-
- def get_count_launcher_category(self, filesname, filepath):
- Constants.unzip_package(filepath)
- m = re.split(Constants.REGEX_FOR_SPLIT_PKG_NAME, filesname)
- name = m[0]
- test_file = os.path.expanduser("~") + "/" + \
- Constants.DEFAULT_PLAN_FILE + "/opt/" + name + "/tests.xml"
- if not os.path.exists(test_file):
- print("Can't find the test file : [%s]" % test_file)
- return 0, 0, Constants.WRT_LAUNCHER_CMD, None
-
- return self.__read_test_xml(test_file)
-
- def __read_test_xml(self, test_file):
- autocnt = manualcnt = 0
- test_xml_temp = etree.parse(test_file)
-
- for test_xml_temp_suite in test_xml_temp.getiterator('suite'):
- suite_launcher = test_xml_temp_suite.get('launcher')
- suite_category = test_xml_temp_suite.get('category')
- autocnt = manualcnt = 0
- for tset in test_xml_temp_suite.getiterator('set'):
- set_autocnt, set_manualcnt = self.__get_set_casecnt(tset)
- autocnt += set_autocnt
- manualcnt += set_manualcnt
-
- return autocnt, manualcnt, suite_launcher, suite_category
-
- def __get_set_casecnt(self, tset):
- set_autocnt = set_manualcnt = 0
- for tcase in tset.getiterator('testcase'):
- exetype = tcase.get('execution_type')
- if exetype == "auto":
- set_autocnt += 1
- elif exetype == "manual":
- set_manualcnt += 1
-
- return set_autocnt, set_manualcnt
-
- def to_xml(self, xml_name):
- print "generating plan to %s" % xml_name
- root = ElementTree.Element('ns3:testplan')
- root.set('name', self.plan_name)
- root.set('profile', self.profile)
- root.set('xmlns', '')
- root.set('xmlns:ns3', 'http://www.example.org/plan/')
- element = ElementTree.Element('execute_type')
- element.text = self.execute_type
- root.append(element)
- for suite_name in self.suites:
- suite = self.suites[suite_name]
- root.append(suite.to_xml())
-
- Constants.indent(root)
- tree = ElementTree.ElementTree()
- tree._setroot(root)
- tree.write(xml_name, encoding="utf-8")
+++ /dev/null
-#!/usr/bin/python
-
-import os
-import threading
-from xml.etree import ElementTree
-
-from .logmanager import LOGGER
-from .result_summary import ResultSummary
-from .constants import Constants
-from .shellplanner import MultiRunnPlan
-
-
-class ResultManager:
-
- #MultiRunnPlan instance
- mrp = None
-
- def __init__(self):
- self.mrp = MultiRunnPlan.getInstance()
- self.mrp.attach(self)
- self.lock = threading.Lock()
- self.summary_lock = threading.Lock()
- self.plans = []
-
- def importResult(self):
- plan = None
- merge_groups = {}
- #plans = self.mrp.getPlanDict().values()[:]
- plans = list(self.mrp.getPlanDict().values())[:]
-
- for plan in plans:
- tizenVer_buildId = "%s_%s" \
- % (plan.getTizenVersion(), plan.getBuildId())
-
- #if merge_groups.has_key(tizenVer_buildId):
- if tizenVer_buildId in merge_groups:
- continue
-
- merge_group = []
- for plan in plans:
- if "%s_%s" % (plan.getTizenVersion(), plan.getBuildId()) \
- == tizenVer_buildId:
- merge_group.append(plan)
- merge_groups[tizenVer_buildId] = merge_group
-
- #folder path grouping
- #return plans that have finished.
- return merge_groups
-
- def waitForFinishedPlans(self):
- #self.plans = self.mrp.getPlanDict().values()[:]
- p_list = list(self.mrp.getPlanDict().values())
- self.plans = p_list[:]
- while bool(self.mrp.getPlanDict()):
- LOGGER.debug("waiting for lock")
- self.lock.acquire()
- LOGGER.debug("Lock acquired")
- self.checkFinished()
- LOGGER.debug("All plans finished")
- self.print_result_summaries()
-
- def update(self):
- LOGGER.debug('waiting for summary lock')
- self.summary_lock.acquire()
- LOGGER.debug('summary lock acquired')
- self.lock.release()
- LOGGER.debug("lock released")
-
- def checkFinished(self):
- LOGGER.debug("Waiting for a plan to finish --> waiting for a lock")
- self.lock.acquire()
- LOGGER.debug("Notified: Plan finished. \
- Check for auto summary merge. --> lock acquired")
- finished_groups = []
- merge_groups = self.importResult()
- for tizenVer_buildId in merge_groups:
- finished_groups.append(tizenVer_buildId)
- for plan in merge_groups[tizenVer_buildId]:
- if not plan.isFinished():
- finished_groups.remove(tizenVer_buildId)
- break
- for group in finished_groups:
- self.genSummary(merge_groups[group])
- self.mrp.removePlans(merge_groups[group])
- self.lock.release()
- LOGGER.debug("lock released")
- self.summary_lock.release()
- LOGGER.debug("summary lock released")
-
- def genSummary(self, plans):
- summary_file = None
- #browser = 'firefox'
- if Constants.RERUNING_MODE and Constants.SCENARIO_MODE:
- summary = ResultSummary(plans=plans)
- summary_file = summary.rerun_genSummaryForScen()
- summary.updateScenStatus()
- elif len(plans) > 1:
- LOGGER.debug("generate Summary for Scenario")
- summary = ResultSummary(plans=plans)
- summary.makeMergedFolder()
- summary_file = summary.genSummaryForScen()
- summary.genScenStatus()
- elif len(plans) == 1:
- summary_file = os.path.join(\
- plans[0].getResultFolderPath(), 'summary.xml')
- if summary_file is not None:
- if not os.path.isfile(summary_file):
- LOGGER.warning("Summary file [%s] does not exist" % summary_file)
- '''
- else:
- try:
- url_path = urlparse.urljoin('file:', \
- urllib.pathname2url(summary_file))
- webbrowser.get(browser).open(url_path, new=2)
- except Exception, e:
- LOGGER.error("[ Error: opening summary file with \
- %s failed, error: %s ]\n" %(browser, e))
- pass
- '''
-
- def print_result_summaries(self):
- resultFolderPaths = []
- tizenV = None
- if self.plans:
- scen_resultFolderPath = None
- for plan in self.plans:
- if tizenV is None:
- tizenV = plan.getTizenVersion()
-
- if plan.scen_resultFolderPath is None or \
- not os.path.isdir(plan.scen_resultFolderPath):
- resultFolderPath = plan.getResultFolderPath()
- summary_xml = os.path.join(resultFolderPath, 'summary.xml')
- self.print_result_summary(summary_xml)
- resultFolderPaths.append(\
- (plan.getPlanName(), resultFolderPath))
- elif plan.scen_resultFolderPath != scen_resultFolderPath:
- resultFolderPath = plan.getScenResultFolderPath()
- scen_resultFolderPath = resultFolderPath
- summary_xml = os.path.join(resultFolderPath, 'summary.xml')
- self.print_result_summary(summary_xml)
- resultFolderPaths.append(\
- (plan.getScenName(), resultFolderPath))
-
- distribute = " --distribute" if Constants.isDistMode() else ""
- rerun_command = "tct-shell --tizen-version {0} --rerun-fail %s {1}".\
- format(tizenV, distribute)
- for result in resultFolderPaths:
- LOGGER.info("[%s] Rerun command: %s" \
- % (result[0], rerun_command % result[1]))
-
- def print_result_summary(self, result_file):
- if not os.path.isfile(result_file):
- LOGGER.warning("Result_file [%s] does not exist" % result_file)
- return
- tree = ElementTree.parse(result_file)
- root = tree.getroot()
- suites = root.findall('suite')
- total_cases = 0
- pass_cases = 0
- fail_cases = 0
- block_cases = 0
- na_cases = 0
- for total_i in root.findall('suite/total_case'):
- total_cases += int(total_i.text)
- for pass_i in root.findall('suite/pass_case'):
- pass_cases += int(pass_i.text)
- for fail_i in root.findall('suite/fail_case'):
- fail_cases += int(fail_i.text)
- for block_i in root.findall('suite/block_case'):
- block_cases += int(block_i.text)
- for na_i in root.findall('suite/na_case'):
- na_cases += int(na_i.text)
-
- LOGGER.info("[Result: execute %d suites]" % len(suites))
- LOGGER.info("[ total case number: %d ]" % total_cases)
- if total_cases > 0:
- LOGGER.info("[ Pass Rate: %.2f" \
- % (float(pass_cases) * 100 / total_cases) + "% ]")
- else:
- LOGGER.info("[ Pass Rate: 0% ]")
- LOGGER.info("[ PASS case number: %d ]" % pass_cases)
- LOGGER.info("[ FAIL case number: %d ]" % fail_cases)
- LOGGER.info("[ BLOCK case number: %d ]" % block_cases)
- LOGGER.info("[ N/A case number: %d ]" % na_cases)
- for suite in suites:
- LOGGER.info(" Suite: %s" % suite.get("name"))
- suite_total_cases = suite.find('total_case').text
- suite_pass_cases = suite.find('pass_case').text
- suite_fail_cases = suite.find('fail_case').text
- suite_block_cases = suite.find('block_case').text
- suite_na_cases = suite.find('na_case').text
- suite_pass_rate = suite.find('pass_rate').text
- LOGGER.info(" |---total case number: %s " % suite_total_cases)
- LOGGER.info(" | |---Pass rate: %s " \
- % suite_pass_rate + "%")
- LOGGER.info(" | |---PASS case number: %s " \
- % suite_pass_cases)
- LOGGER.info(" | |---FAIL case number: %s " \
- % suite_fail_cases)
- LOGGER.info(" | |---BLOCK case number: %s " \
- % suite_block_cases)
- LOGGER.info(" | |---N/A case number: %s " \
- % suite_na_cases)
+++ /dev/null
-#!/usr/bin/python
-
-from xml.etree import ElementTree
-import os
-import glob
-import shutil
-import errno
-import copy
-from .constants import Constants
-from .logmanager import LOGGER
-
-DEBUG = True
-
-
-def ele_set(element, attrib, content):
- if content:
- element.set(attrib, content)
-
-
-def ele_find(ele, child):
- if ele.find(child) is not None:
- return ele.find(child)
- else:
- return ElementTree.Element(child)
-
-
-def copyfiledir(src, dst):
- try:
- shutil.copytree(src, dst)
- return dst
- except OSError as exc:
- if exc.errno == errno.ENOTDIR:
- shutil.copy(src, dst)
- return dst
- else:
- raise
-
-
-class ResultSummary:
- env = None
- summary = None
- capability = None
- suites = []
- planid = None
- unpass = None
-
- def __init__(self, plans=None, rerun_suiteFiles=None):
- self.am_suiteFiles = []
- self.result_suiteFiles = []
- self.suiteFiles = {}
- self.rerun_suiteFiles = rerun_suiteFiles
- self.am_suites = []
- self.suites = []
- self.profile = None
- self.deviceid = None
- self.planid = None
- self.plans = plans
- self.planDict = {}
- if plans:
- headplan = plans[0]
- self.head_profile = headplan.getProfile()
- self.head_deviceid = headplan.getDeviceId()
- self.scenid = headplan.getScenName()
- self.scen_resultFolder = headplan.getScenResultFolderPath()
- if len(plans) > 1:
- for plan in plans[1:]:
- plan.setScenResultFolderPath(self.scen_resultFolder)
-
- self.env = self.ResEnvironment()
- self.summary = self.ResSummary()
- self.capability = self.ResCapabilities()
-
- def genSummary(self, _resultFolder=None):
- if Constants.RERUNING_MODE:
- self.suiteFiles = self._rerun_findResultSuites_plan()
- else:
- self.suiteFiles = self._findResultSuites(_resultFolder)
-
- for planFolder, plan in self.suiteFiles.items():
- suiteResults_plan = []
- for suite_am in plan.keys():
- suiteResults_plan.append(suite_am + ".xml")
-
- currPlan = self.planDict[planFolder]
- self.profile = currPlan.getProfile()
- self.deviceid = currPlan.getDeviceId()
- self.suites = []
- self.env = self.ResEnvironment()
- self.summary = self.ResSummary()
- self.capability = self.ResCapabilities()
- self.planid = currPlan.getPlanName()
- self.parse(suiteResults_plan)
- self.summary_to_xml(os.path.join(planFolder, "summary.xml"))
- if _resultFolder is None:
- self.genPlanStatus(currPlan)
- return
-
- def genPlanStatus(self, plan):
- root = ElementTree.Element('ns3:plan_status')
- ele_set(root, 'xmlns:ns3', 'http://www.example.org/plan_status/')
- ele_set(root, 'name', plan.getPlanName())
- ele_set(root, 'profile', plan.getProfile())
- ele_set(root, 'executeType', plan.getExecuteType().getCurrType())
- ele_set(root, 'tizenVersion', plan.getTizenVersion())
- device = ElementTree.Element('device')
- ele_set(device, 'device_id', plan.getDeviceId())
- ele_set(device, 'build_id', plan.getBuildId())
- auto_tasks = ElementTree.Element('auto_tasks')
- manual_tasks = ElementTree.Element('manual_tasks')
- if plan.getExecuteType().getCurrType() == "Auto":
- for suite in plan.getSuites():
- executed = ElementTree.Element('executed')
- executed.text = suite.getSuiteName()
- auto_tasks.append(executed)
- elif plan.getExecuteType().getCurrType() == "Manual":
- for suite in plan.getSuites():
- executed = ElementTree.Element('executed')
- executed.text = suite.getSuiteName()
- manual_tasks.append(executed)
- elif plan.getExecuteType().getCurrType() == "All":
- for suite in plan.getSuites():
- executed = ElementTree.Element('executed')
- executed.text = suite.getSuiteName()
- auto_tasks.append(executed)
- manual_tasks.append(executed)
-
- root.append(device)
- root.append(auto_tasks)
- root.append(manual_tasks)
-
- Constants.indent(root)
- tree = ElementTree.ElementTree()
- tree._setroot(root)
- tree.write(os.path.join(plan.getResultFolderPath(), \
- "plan_status.xml"), encoding="UTF-8")
-
- def genScenStatus(self):
- root = ElementTree.Element('scen_status')
- ele_set(root, 'scenario_name', self.scenid)
- for plan in self.plans:
- plan_root = ElementTree.Element('plan')
- ele_set(plan_root, 'name', plan.getPlanName())
- ele_set(plan_root, 'result_folder', plan.getResultFolderPath())
- ele_set(plan_root, 'has_unpass_tc', str(plan.getUnpass()))
- device = ElementTree.Element('device')
- ele_set(device, 'device_id', plan.getDeviceId())
- ele_set(device, 'build_id', plan.getBuildId())
- plan_root.append(device)
- root.append(plan_root)
- Constants.indent(root)
- tree = ElementTree.ElementTree()
- tree._setroot(root)
- tree.write(os.path.join(self.scen_resultFolder, \
- "scenario_status.xml"), encoding="UTF-8")
- LOGGER.info("SENARIO_STATUS TO XML: writing into %s" \
- % os.path.join(self.scen_resultFolder, "scenario_status.xml"))
-
- def updateScenStatus(self):
- scenstat = os.path.join(self.scen_resultFolder, 'scenario_status.xml')
- if not os.path.isfile(scenstat):
- LOGGER.error("scenario_status.xml should be present in \
- [%s]. Not Found" % self.scen_resultFolder)
- raise
- xml_tree = ElementTree.parse(scenstat)
- root = xml_tree.getroot()
- for plan in root.findall('plan'):
- for rerun_plan in self.plans:
- if plan.get('name') == rerun_plan.getPlanName():
- ele_set(plan, 'has_unpass_tc', str(rerun_plan.getUnpass()))
-
- tree = ElementTree.ElementTree()
- tree._setroot(root)
- tree.write(scenstat, encoding="UTF-8")
- LOGGER.info("UPDATING SENARIO_STATUS TO XML: writing into %s" \
- % scenstat)
-
- def prepareRerun(self, result):
- suiteFiles = {}
- suitePkgs = {}
- scen_resultFolderPath = None
- if os.path.isdir(result):
- if os.path.isfile(os.path.join(result, "plan_status.xml")):
- suiteFiles = self.prepareRerun_Plan(result)
- elif os.path.isfile(os.path.join(result, "scenario_status.xml")):
- suiteFiles = self.prepareRerun_Scen(result)
- Constants.setScenMode(True)
- Constants.setDistMode(False)
- scen_resultFolderPath = result
- elif os.path.isfile(result):
- suiteFiles = self.prepareRerun_Suite(result)
- else:
- LOGGER.warning("%s result does not exist" % result)
- raise
-
- for planFolder, plan in suiteFiles.items():
- plan_status = os.path.join(planFolder, "plan_status.xml")
- LOGGER.debug("plan folder path = %s" % planFolder)
- if not os.path.isfile(plan_status):
- LOGGER.warning("%s does not exist" % plan_status)
- raise
- xml_tree = ElementTree.parse(plan_status)
- xml_root = xml_tree.getroot()
- plan_name = xml_root.get('name')
- executeType = xml_root.get('executeType')
- profile = xml_root.get('profile')
- if not profile:
- LOGGER.warning("Couldn`t retrieve 'profile' attribute of plan_status.xml")
- raise
- tizenVersion = xml_root.get('tizenVersion')
- device = ele_find(xml_root, 'device')
- device_id = device.get('device_id')
- build_id = device.get('build_id')
- suite_pkgs = []
- for suite in plan:
- suiteName = os.path.basename(suite)
- suite_pkg_name = None
- profiles = [profile, "common"]
- for prof in profiles:
- suite_pkg_repo = os.path.join(Constants.SUITES_REPOSITORY \
- % tizenVersion, prof)
- if not os.path.isdir(suite_pkg_repo):
- continue
- os.chdir(suite_pkg_repo)
- for suite_pkg in glob.glob("%s*.zip" % suiteName):
- suite_pkg_name = os.path.abspath(suite_pkg)
- if suite_pkg_name is not None:
- suite_pkgs.append(suite_pkg_name)
- break
- if suite_pkg_name is None:
- LOGGER.warning("[%s] suite does not exist." % (suiteName))
- yesorno = None
- while not (yesorno in ['y', 'n']):
- yesorno = input(\
- "Continue without this suite? [y/n]")
- if yesorno == 'n':
- LOGGER.warning("please check the default suite \
- repository: %s[profile]/" \
- % Constants.SUITES_REPOSITORY \
- % "[tizen_version]")
- raise
- suitePkgs[planFolder] = [[plan_name, executeType, profile, \
- tizenVersion, device_id, build_id, \
- scen_resultFolderPath], suite_pkgs]
- return suitePkgs
-
- def prepareRerun_Suite(self, result):
- suiteFiles = {}
- planFolder = os.path.dirname(result)
- suiteFiles[planFolder] = {}
- suiteFiles[planFolder][result[:-4]] = result
- return self.genRerunFile(suiteFiles)
-
- def prepareRerun_Plan(self, result):
- suiteFiles = {}
- suiteFiles[result] = {}
- os.chdir(result)
- for suite in glob.glob("*.xml"):
- if 'auto' in suite or 'manual' in suite or 'rerun' in suite \
- or 'status.xml' in suite or suite == 'summary.xml':
- continue
- suiteFile = os.path.abspath(suite)
- suiteFiles[result][suiteFile[:-4]] = suiteFile
- return self.genRerunFile(suiteFiles)
-
- def prepareRerun_Scen(self, result):
- suiteFiles = {}
- planResultFolders = []
- scen_status = os.path.join(result, "scenario_status.xml")
- xml_tree = ElementTree.parse(os.path.join(scen_status))
- xml_root = xml_tree.getroot()
- for xml_plan in xml_root.findall('plan'):
- if xml_plan.get('has_unpass_tc') == "True":
- planResultFolders.append(xml_plan.get('result_folder'))
-
- for planResult in planResultFolders:
- suiteFiles.update(self.prepareRerun_Plan(planResult))
-
- return suiteFiles
-
- def genRerunFile(self, rerun_suiteFiles):
- if not bool(rerun_suiteFiles):
- LOGGER.debug("No suite results exist...")
- raise
- filtered_suiteFiles = copy.deepcopy(rerun_suiteFiles)
- self.env = self.ResEnvironment()
- self.summary = self.ResSummary()
- self.capability = self.ResCapabilities()
- self.env.isNull = False
- self.summary.isNull = False
- self.capability.isNull = False
- for planFolder, plan in rerun_suiteFiles.items():
- for suite_am in plan.keys():
- self.suites = []
- result_file = suite_am + ".xml"
- if os.path.isfile(result_file):
- self.parse([result_file])
- if not self.rerun_to_xml(suite_am + ".rerun.xml"):
- del filtered_suiteFiles[planFolder][suite_am]
- return filtered_suiteFiles
-
- def checkResults(self):
- self.suiteFiles = self._findResultSuites()
- NotRunSuites = []
- for planFolder, plan in self.suiteFiles.items():
- currPlan = self.planDict[planFolder]
- self.profile = currPlan.getProfile()
- self.deviceid = currPlan.getDeviceId()
- for suite_path, suite_am in plan.items():
- if len(suite_am) < 1:
- NotRunSuites.append(os.path.basename(suite_path))
- LOGGER.error("No test results returned from lite: %s", \
- os.path.basename(suite_path))
-
- return NotRunSuites
-
- def genResults(self):
- self.suiteFiles = self._findResultSuites()
- NotRunSuites = []
- for planFolder, plan in self.suiteFiles.items():
- currPlan = self.planDict[planFolder]
- self.profile = currPlan.getProfile()
- self.deviceid = currPlan.getDeviceId()
- for suite_path, suite_am in plan.items():
- if len(suite_am) < 1:
- NotRunSuites.append(os.path.basename(suite_path))
- LOGGER.critical("No test results returned from lite: %s", \
- os.path.basename(suite_path))
- continue
- if '__auto_skip' in suite_am:
- suite_am.remove('__auto_skip')
- if '__manual_skip' in suite_am:
- suite_am.remove('__manual_skip')
- if len(suite_am) < 1:
- LOGGER.warning("Test results not returned from lite \
- (No manual or auto testcases): %s", \
- os.path.basename(suite_path))
- continue
-
- self.env = self.ResEnvironment()
- self.summary = self.ResSummary()
- self.capability = self.ResCapabilities()
- self.suites = []
- self.parse(suite_am)
- if Constants.RERUNING_MODE:
- dst = suite_path + "_rerun_result_tmp.xml"
- tmp_dst = Constants.getTempPath(dst)
- self.result_to_xml(tmp_dst)
- self.mergeRerunResults(suite_path + ".xml", tmp_dst)
- os.remove(tmp_dst)
- else:
- self.result_to_xml(suite_path + ".xml")
-
- currPlan.setUnpass(self.getUnpass())
- return
-
- def getUnpass(self):
- return self.unpass
-
- def parse(self, suiteFiles):
- unpass = False
- suite_count = 0
- for suiteFile in suiteFiles:
- LOGGER.debug("ABOUT TO PARSE %s" % suiteFile)
- if not Constants.checkFileExists(suiteFile):
- LOGGER.warning("[%s] not found" % suiteFile)
- continue
- if not suiteFile.split("/")[-1].find("tct-") > -1:
- if not suiteFile.split("/")[-1].find(".Tests") > -1:
- continue
- xml_tree = ElementTree.parse(suiteFile)
- xml_root = xml_tree.getroot()
- if self.env.isNull:
- self.env.parse(ele_find(xml_root, 'environment'))
- if self.env.tct_profile is None:
- self.env.tct_profile = self.profile
- if self.summary.isNull:
- self.summary.parse(ele_find(xml_root, 'summary'))
- else:
- self.summary.merge_time(ele_find(xml_root, 'summary'))
-
- suite_summary = ele_find(xml_root, 'summary')
- suite_start_at = ele_find(suite_summary, 'start_at').text
- suite_end_at = ele_find(suite_summary,'end_at').text
-
- suite = self.ResSuite(suite_start_at, suite_end_at)
- ele_suite = ele_find(xml_root, 'suite')
- suite.parse(ele_suite)
- if suite.name is None:
- suite.name = Constants.getSuiteNameFromFile(\
- os.path.basename(suiteFile))
- self.suites.append(suite)
- if suite.getUnpass():
- LOGGER.debug("[%s] has at least one unpassed testcase" \
- % str(suite.name))
- unpass = True
- suite_count += 1
- if suite_count < 1:
- LOGGER.warning("No suite results to summarize")
- return
-
- if self.capability.isNull:
- dev_cap = Constants.LOCAL_CAPABILITY_PATH % self.env.device_id
- if not os.path.isfile(dev_cap):
- LOGGER.error("Device capability does not exist for device: \
- [%s]" % self.env.device_id)
- else:
- xml_captree = ElementTree.parse(\
- Constants.LOCAL_CAPABILITY_PATH % self.env.device_id)
- xml_caproot = xml_captree.getroot()
- self.capability.parse(xml_caproot)
- self.unpass = unpass
- return
-
- def mergeresult_parse(self, src1, src2, priority="FAIL"):
- xml_tree1 = ElementTree.parse(src1)
- xml_tree2 = ElementTree.parse(src2)
- xml_root1 = xml_tree1.getroot()
- xml_root2 = xml_tree2.getroot()
- self.suites = []
- if self.env.isNull:
- self.env.parse(ele_find(xml_root1, 'environment'))
- if self.env.tct_profile is None:
- self.env.tct_profile = self.profile
-
- if self.summary.isNull:
- self.summary.parse(ele_find(xml_root1, 'summary'))
-
- for suite1 in xml_root1.findall('suite'):
- suite2 = None
- for lookformatch in xml_root2.findall('suite'):
- if lookformatch.get('name') == suite1.get('name'):
- suite2 = lookformatch
- break
-
- suite_summary = ele_find(xml_root1, 'summary')
- suite_start_at = ele_find(suite_summary, 'start_at').text
- suite_end_at = ele_find(suite_summary, 'end_at').text
-
- suite_obj = self.ResSuite(suite_start_at, suite_end_at)
-
- if suite2 is None:
- self.suites.append(suite_obj.parse(suite1))
- else:
- self.suites.append(suite_obj.mergeresult_parse(\
- suite1, suite2, priority))
-
- if self.capability.isNull:
- dev_cap = Constants.LOCAL_CAPABILITY_PATH % self.env.device_id
- if not os.path.isfile(dev_cap):
- LOGGER.warning("Device capability does not exist for device: \
- [%s]" % self.env.device_id)
- else:
- xml_captree = ElementTree.parse(\
- Constants.LOCAL_CAPABILITY_PATH % self.env.device_id)
- xml_caproot = xml_captree.getroot()
- self.capability.parse(xml_caproot)
- return self
-
- def result_to_xml(self, dest):
- self.copy_style(dest)
- decl_root = ElementTree.Element(None)
- decl1 = ElementTree.PI('xml-stylesheet', \
- 'type="text/xsl" href="./style/testresult.xsl"')
- decl1.tail = "\n"
- '''
- decl2 = ElementTree.PI('xml-stylesheet', \
- 'type="text/xsl" href="testresult.xsl"')
- decl2.tail = "\n"
- '''
- decl_root.append(decl1)
- #decl_root.append(decl2)
- root = ElementTree.Element('test_definition')
- root.append(self.env.to_xml())
- root.append(self.summary.to_xml())
- for suite in self.suites:
- root.append(suite.result_to_xml())
- Constants.indent(root)
- decl_root.append(root)
- tree = ElementTree.ElementTree()
- tree._setroot(decl_root)
- LOGGER.debug("ABOUT TO WRITE RESULTS INTO %s\n" % dest)
- tree.write(dest, encoding="UTF-8")
- LOGGER.info("RESULTS TO XML: writing into %s\n" % dest)
-
- def rerun_to_xml(self, dest):
- root = ElementTree.Element('test_definition')
- for suite in self.suites:
- root.append(suite.result_to_xml(fail_only=True))
- hasUnpass = False
- for suite in root.findall('suite'):
- if list(suite) != []:
- hasUnpass = True
- if not hasUnpass:
- return False
- Constants.indent(root)
- tree = ElementTree.ElementTree()
- tree._setroot(root)
- LOGGER.debug("ABOUT TO WRITE RERUN INTO %s\n" % dest)
- tree.write(dest, encoding="UTF-8")
- LOGGER.info("RERUN TO XML: writing into %s\n" % dest)
- return True
-
- def summary_to_xml(self, dest):
- self.copy_style(dest)
- decl_root = ElementTree.Element(None)
- decl1 = ElementTree.PI('xml-stylesheet', \
- 'type="text/xsl" href="./style/summary.xsl"')
- decl1.tail = "\n"
- decl_root.append(decl1)
- root = ElementTree.Element('result_summary')
- ele_set(root, 'plan_name', self.planid)
- root.append(self.env.to_xml())
- root.append(self.summary.to_xml())
- root.append(self.capability.to_xml())
- for suite in self.suites:
- root.append(suite.summary_to_xml())
- Constants.indent(root)
- decl_root.append(root)
- tree = ElementTree.ElementTree()
- tree._setroot(decl_root)
- LOGGER.debug("ABOUT TO WRITE SUMMARY INTO %s\n" % dest)
- tree.write(dest, encoding="UTF-8")
- LOGGER.info("SUMMARY TO XML: writing into %s\n" % dest)
-
- def _findResultSuites(self, _resultFolder=None):
- if Constants.RERUNING_MODE:
- auto_suffix = Constants.RERUN_AUTO_RESULT_SUFFIX
- manual_suffix = Constants.RERUN_MANUAL_RESULT_SUFFIX
- else:
- auto_suffix = Constants.AUTO_RESULT_SUFFIX
- manual_suffix = Constants.MANUAL_RESULT_SUFFIX
- suiteFiles = {}
- self.planDict = {}
- for plan in self.plans:
- plan_resultFolder = None
- if _resultFolder is None:
- plan_resultFolder = plan.getResultFolderPath()
- else:
- plan_resultFolder = _resultFolder
-
- suiteFiles[plan_resultFolder] = {}
- self.planDict[plan_resultFolder] = plan
- for suite in plan.getSuites():
- mergedsuite = os.path.join(plan_resultFolder, suite.suiteName)
- suiteFiles[plan_resultFolder][mergedsuite] = []
- autosuite = mergedsuite + auto_suffix
- manualsuite = mergedsuite + manual_suffix
- if suite.getNoAuto():
- suiteFiles[plan_resultFolder][mergedsuite]\
- .append('__auto_skip')
- if suite.getNoManual():
- suiteFiles[plan_resultFolder][mergedsuite]\
- .append('__manual_skip')
- if os.path.isfile(autosuite):
- suiteFiles[plan_resultFolder][mergedsuite]\
- .append(autosuite)
- if os.path.isfile(manualsuite):
- suiteFiles[plan_resultFolder][mergedsuite]\
- .append(manualsuite)
- return suiteFiles
-
- def _rerun_findResultSuites_plan(self):
- suiteFiles = {}
- plan_resultFolder = self.plans[0].getResultFolderPath()
- suiteFiles[plan_resultFolder] = {}
- os.chdir(plan_resultFolder)
- for suiteFile in glob.glob("*.xml"):
- if 'auto.xml' in suiteFile or 'manual.xml' in suiteFile \
- or 'rerun.xml' in suiteFile or 'status.xml' \
- in suiteFile or suiteFile == 'summary.xml':
- continue
- suiteFiles[plan_resultFolder][suiteFile[:-4]] = []
- return suiteFiles
-
- def _rerun_findResultSuites_scen(self):
- suiteFiles = {}
- scen_resultFolder = self.scen_resultFolder
- suiteFiles[scen_resultFolder] = {}
- os.chdir(scen_resultFolder)
- for suiteFile in glob.glob("*.xml"):
- if 'auto.xml' in suiteFile or 'manual.xml' in suiteFile \
- or 'rerun.xml' in suiteFile or 'status.xml' \
- in suiteFile or suiteFile == 'summary.xml':
- continue
- suiteFiles[scen_resultFolder][suiteFile[:-4]] = []
- return suiteFiles
-
- def _not_in_use_rerun_findResultSuites_scen(self, scen_status):
- suiteFiles = {}
- xml_scenstat = ElementTree.parse(scen_status)
- root = xml_scenstat.getroot()
- for plan in root.findall('plan'):
- plan_resultFolder = plan.get('result_folder')
- suiteFiles[plan_resultFolder] = []
- os.chdir(plan_resultFolder)
- for suiteFile in glob.glob("*.xml"):
- if 'auto.xml' in suiteFile or 'manual.xml' in suiteFile \
- or 'rerun.xml' in suiteFile or 'status.xml' \
- in suiteFile or suiteFile == 'summary.xml':
- continue
- suiteFiles[plan_resultFolder].append(suiteFile)
- return suiteFiles
-
- #return folderPath
- def makeMergedFolder(self):
- #create mergeFolder
- if Constants.RERUNING_MODE and Constants.SCENARIO_MODE:
- if not os.path.isdir(self.scen_resultFolder):
- LOGGER.warning("RERUN: cannot find original result folder : \
- [%s]" % self.scen_resultFolder)
- else:
- os.mkdir(self.scen_resultFolder, mode=0o777)
- return
-
- def suiteCopyFiles(self):
- self.suites = []
- self.suiteFiles = self._findResultSuites()
- suiteResults_scen = []
- for planFolder, plan in self.suiteFiles.items():
- for suite_am in plan.keys():
- resultFile = suite_am + ".xml"
- if not os.path.isfile(resultFile):
- continue
- dest = os.path.join(self.scen_resultFolder, \
- os.path.basename(resultFile))
- if os.path.isfile(dest):
- self.mergeSuiteResults(dest, resultFile)
- continue
- copyfiledir(resultFile, dest)
- suiteResults_scen.append(dest)
- return suiteResults_scen
-
- def _rerunReplaceResults(self, suiteFiles):
- updated_check = []
- for planFolder, plan in suiteFiles.items():
- for suite_am in plan.keys():
- resultFile = suite_am + ".xml"
- if not os.path.isfile(resultFile):
- continue
- dest = os.path.join(self.scen_resultFolder, \
- os.path.basename(resultFile))
- if os.path.isfile(dest):
- if suite_am in updated_check:
- self.mergeSuiteResults(dest, resultFile)
- else:
- self.mergeRerunResults(dest, resultFile)
- updated_check.append(suite_am)
- else:
- LOGGER.warning("The original result xml does not exist \
- in the scenario file. File: [%s]" % dest)
-
- def genSummaryForScen(self):
- self.deviceid = self.head_deviceid
- self.profile = self.head_profile
- self.planid = self.scenid
- suiteFiles = self.suiteCopyFiles()
- self.suites = []
- self.parse(suiteFiles)
- dest = os.path.join(self.scen_resultFolder, 'summary.xml')
- self.summary_to_xml(dest)
- return dest
-
- def rerun_genSummaryForScen(self):
- self._rerunReplaceResults(self._findResultSuites())
- suiteFiles = self._rerun_findResultSuites_scen()
- for scenFolder, scen in suiteFiles.items():
- suiteResults_scen = []
- for suite_am in scen.keys():
- suiteResults_scen.append(suite_am + ".xml")
- self.suites = []
- self.parse(suiteResults_scen)
- dest = os.path.join(self.scen_resultFolder, 'summary.xml')
- self.summary_to_xml(dest)
- return dest
-
- def mergeRerunResults(self, src1, src2):
- self.mergeSuiteResults(src1, src2, priority="PASS")
-
- def mergeSuiteResults(self, src1, src2, priority="FAIL"):
- self.suites = []
- self.env = self.ResEnvironment()
- self.summary = self.ResSummary()
- self.capability = self.ResCapabilities()
- self.mergeresult_parse(src1, src2, priority)
- self.result_to_xml(src1)
- return
-
- def copy_style(self, dest):
- styleFolder = os.path.join(os.path.dirname(dest), 'style')
- if not os.path.isdir(styleFolder):
- copyfiledir(Constants.STYLE_FOLDER, styleFolder)
-
- def fetch_logs(self, dest):
- return
-
- class ResEnvironment:
- def __init__(self):
- self.other = None
- self.build_id = None
- self.tct_version = None
- self.tct_profile = None
- self.device_id = None
- self.device_model = None
- self.device_name = None
- self.host = None
- self.manufacturer = None
- self.resolution = None
- self.screen_size = None
- self.isNull = True
-
- def parse(self, env):
- self.build_id = env.get('build_id')
- #should be added to Constants ..............
- self.tct_profile = env.get('tct_profile')
- self.tct_version = Constants.get_tct_binaryV()
- self.device_id = env.get('device_id')
- self.device_model = env.get('device_model')
- self.device_name = env.get('device_name')
- self.host = env.get('host')
- self.manufacturer = env.get('manufacturer')
- self.resolution = env.get('resolution')
- self.screen_size = env.get('screen_size')
- self.other = ele_find(env, 'other')
- self.isNull = False
-
- def to_xml(self):
- env = ElementTree.Element('environment')
- ele_set(env, 'build_id', self.build_id)
- ele_set(env, 'tct_version', self.tct_version)
- ele_set(env, 'tct_profile', self.tct_profile)
- ele_set(env, 'device_id', self.device_id)
- if self.device_model is None:
- ele_set(env, 'device_model', "None")
- else:
- ele_set(env, 'device_model', self.device_model)
- ele_set(env, 'device_name', self.device_name)
- ele_set(env, 'host', self.host)
- ele_set(env, 'manufacturer', self.manufacturer)
- ele_set(env, 'resolution', self.resolution)
- ele_set(env, 'screen_size', self.screen_size)
- other = ElementTree.Element('other')
- env.append(other)
- #other needs to be added.....
- return env
-
- class ResSummary:
- def __init__(self):
- self.isNull = True
- self.test_plan_name = None
- self.start_at = None
- self.end_at = None
-
- def parse(self, summary):
- self.test_plan_name = summary.get('test_plan_name')
- self.start_at = ele_find(summary, 'start_at').text
- self.end_at = ele_find(summary, 'end_at').text
- self.isNull = False
-
- def merge_time(self, summary):
- start_at2 = ele_find(summary, 'start_at').text
- end_at2 = ele_find(summary, 'end_at').text
- if self.start_at and start_at2:
- self.start_at = min(self.start_at, start_at2)
- if self.end_at and end_at2:
- self.end_at = max(self.end_at, end_at2)
-
- def to_xml(self):
- summary = ElementTree.Element('summary')
- ele_set(summary, 'test_plan_name', self.test_plan_name)
- start_at = ElementTree.Element('start_at')
- if self.start_at:
- start_at.text = self.start_at
- summary.append(start_at)
- end_at = ElementTree.Element('end_at')
- if self.end_at:
- end_at.text = self.end_at
- summary.append(end_at)
- return summary
-
- class ResCapabilities:
-
- def __init__(self):
- self.isNull = True
- self.capList = []
-
- def parse(self, caps):
- for xml_cap in caps.findall('capability'):
- cap = self.ResCapability()
- cap.parse(xml_cap)
- self.capList.append(cap)
- self.isNull = False
-
- def to_xml(self):
- caps = ElementTree.Element('capabilities')
- for cap in self.capList:
- caps.append(cap.to_xml())
- return caps
-
- class ResCapability:
- def __init__(self):
- self.name = None
- self.support = None
- self.typ = None
-
- def parse(self, cap):
- self.name = cap.get('name')
- self.support = cap.get('support')
- self.typ = cap.get('type')
-
- def to_xml(self):
- cap = ElementTree.Element('capability')
- ele_set(cap, 'name', self.name)
- ele_set(cap, 'support', self.support)
- ele_set(cap, 'type', self.typ)
- return cap
-
- class ResSuite:
-
- def __init__(self, start_at="", end_at=""):
- self.name = None
- self.category = None
- self.launcher = None
- self.total_case = None
- self.pass_case = None
- self.pass_rate = None
- self.fail_case = None
- self.fail_rate = None
- self.block_case = None
- self.block_rate = None
- self.na_case = None
- self.na_rate = None
- self.suite_set = []
- self.unpass = None
- self.start_at = start_at
- self.end_at = end_at
-
- def getUnpass(self):
- return self.unpass
-
- def mergeresult_parse(self, suite1, suite2, priority="FAIL"):
- self.name = suite1.get('name')
- self.category = suite1.get('category')
- self.launcher = suite1.get('launcher')
- for suite_set1 in suite1.findall('set'):
- suite_set2 = None
- for lookformatch in suite2.findall('set'):
- if lookformatch.get('name') == suite_set1.get('name'):
- suite_set2 = lookformatch
- break
-
- if suite_set2 is None:
- self.suite_set.append(self.Set().parse(suite_set1))
- else:
- self.suite_set.append(self.Set().mergeresult_parse(\
- suite_set1, suite_set2, priority))
-
- return self
-
- def parse(self, suite):
- unpass = False
- self.name = suite.get('name')
- self.category = suite.get('category')
- self.launcher = suite.get('launcher')
- for suite_set in suite.findall('set'):
- setparser = self.Set()
- self.suite_set.append(setparser.parse(suite_set))
- if setparser.getUnpass():
- unpass = True
- self.unpass = unpass
- total_cnt = 0
- pass_cnt = 0
- fail_cnt = 0
- block_cnt = 0
- na_cnt = 0
- for suite_set in suite.findall('set'):
- for tc in suite_set.findall('testcase'):
- result = tc.get('result')
- total_cnt += 1
- if result == "PASS":
- pass_cnt += 1
- elif result == "FAIL":
- fail_cnt += 1
- elif result == "BLOCK":
- block_cnt += 1
- elif result == "N/A":
- na_cnt += 1
- self.total_case = str(total_cnt)
- if total_cnt == 0:
- if self.name is not None:
- LOGGER.warning("No testcases in the suite: [%s]" \
- % self.name)
- #prevent division by zero
- total_cnt = 1
- self.pass_case = str(pass_cnt)
- self.pass_rate = "%.2f" % (float(pass_cnt) / \
- float(total_cnt) * 100)
- self.fail_case = str(fail_cnt)
- self.fail_rate = "%.2f" % (float(fail_cnt) / \
- float(total_cnt) * 100)
- self.block_case = str(block_cnt)
- self.block_rate = "%.2f" % (float(block_cnt) / float(total_cnt) \
- * 100)
- self.na_case = str(na_cnt)
- self.na_rate = "%.2f" % (float(na_cnt) / float(total_cnt) * 100)
-
- return self
-
- def result_to_xml(self, fail_only=False):
- suite = ElementTree.Element('suite')
- ele_set(suite, 'category', self.category)
- ele_set(suite, 'launcher', self.launcher)
- ele_set(suite, 'name', self.name)
- for suite_set in self.suite_set:
- checkset = suite_set.to_xml(fail_only)
- if checkset.find('testcase') is not None:
- suite.append(suite_set.to_xml(fail_only))
- return suite
-
- def summary_to_xml(self):
- suite = ElementTree.Element('suite')
- ele_set(suite, 'name', self.name)
-
- start_at_case = ElementTree.Element('start_at')
- if self.start_at:
- start_at_case.text = self.start_at
-
- end_at_case = ElementTree.Element('end_at')
- if self.end_at:
- end_at_case.text = self.end_at
-
- total_case = ElementTree.Element('total_case')
- if self.total_case:
- total_case.text = self.total_case
-
- pass_case = ElementTree.Element('pass_case')
- if self.pass_case:
- pass_case.text = self.pass_case
- pass_rate = ElementTree.Element('pass_rate')
- if self.pass_rate:
- pass_rate.text = self.pass_rate
- fail_case = ElementTree.Element('fail_case')
- if self.fail_case:
- fail_case.text = self.fail_case
- fail_rate = ElementTree.Element('fail_rate')
- if self.fail_rate:
- fail_rate.text = self.fail_rate
- block_case = ElementTree.Element('block_case')
- if self.block_case:
- block_case.text = self.block_case
- block_rate = ElementTree.Element('block_rate')
- if self.block_rate:
- block_rate.text = self.block_rate
- na_case = ElementTree.Element('na_case')
- if self.na_case:
- na_case.text = self.na_case
- na_rate = ElementTree.Element('na_rate')
- if self.na_rate:
- na_rate.text = self.na_rate
-
- suite.append(start_at_case)
- suite.append(end_at_case)
- suite.append(total_case)
- suite.append(pass_case)
- suite.append(pass_rate)
- suite.append(fail_case)
- suite.append(fail_rate)
- suite.append(block_case)
- suite.append(block_rate)
- suite.append(na_case)
- suite.append(na_rate)
- return suite
-
- class Set:
- def __init__(self):
- self.name = None
- self.set_debug_msg = None
- self.testcase = []
- self.capabilities = []
- self.unpass = None
-
- def getUnpass(self):
- return self.unpass
-
- def parse(self, suite_set):
- unpass = False
- self.name = suite_set.get('name')
- self.set_debug_msg = suite_set.get('set_debug_msg')
- capabilities = ele_find(suite_set, 'capabilities')
- for cap in capabilities.findall('capability'):
- self.capabilities.append(self.Capability().parse(cap))
- for testcase in suite_set.findall('testcase'):
- tcparser = self.Testcase()
- self.testcase.append(tcparser.parse(testcase))
- if tcparser.getUnpass():
- unpass = True
- self.unpass = unpass
- return self
-
- def mergeresult_parse(self, suite_set1, \
- suite_set2, priority="FALSE"):
- self.name = suite_set1.get('name')
- self.set_debug_msg = suite_set1.get('set_debug_msg')
- capabilities = suite_set1.find('capabilities')
- capabilities = ele_find(suite_set1, 'capabilities')
- for cap in capabilities.findall('capability'):
- self.capabilities.append(self.Capability().parse(cap))
- for testcase1 in suite_set1.findall('testcase'):
- testcase2 = None
- for lookformatch in suite_set2.findall('testcase'):
- if lookformatch.get('id') == testcase1.get('id'):
- testcase2 = lookformatch
- break
- if testcase2 is None:
- self.testcase.append(self.Testcase().parse(testcase1))
- else:
- self.testcase.append(\
- self.Testcase().mergeresult_parse(\
- testcase1, testcase2, priority))
- return self
-
- def to_xml(self, fail_only):
- suite_set = ElementTree.Element('set')
- ele_set(suite_set, 'name', self.name)
- ele_set(suite_set, 'set_debug_msg', self.set_debug_msg)
- capabilities = ElementTree.Element('capabilities')
- for cap in self.capabilities:
- capabilities.append(cap.to_xml())
- if len(self.capabilities) > 0:
- suite_set.append(capabilities)
- for testcase in self.testcase:
- tc = testcase.to_xml(fail_only)
- if tc is not None:
- suite_set.append(tc)
- return suite_set
-
- class Capability:
- def __init__(self):
- self.name = None
-
- def parse(self, cap):
- self.name = cap.get('name')
- return self
-
- def to_xml(self):
- cap = ElementTree.Element('capability')
- ele_set(cap, 'name', self.name)
- return cap
-
- class Testcase:
- def __init__(self):
- self.Id = None
- self.component = None
- self.execution_type = None
- self.priority = None
- self.purpose = None
- self.result = None
- self.test_script_entry = None
- self.actual_result = None
- self.start = None
- self.end = None
- self.stdout = None
- self.stderr = None
- self.unpass = None
- self.onload_delay = None
-
- def getUnpass(self):
- return self.unpass
-
- def parse(self, tc):
- self.Id = tc.get('id')
- self.component = tc.get('component')
- self.execution_type = tc.get('execution_type')
- self.priority = tc.get('priority')
- self.purpose = tc.get('purpose')
- self.result = tc.get('result')
- self.onload_delay = tc.get('onload_delay')
- self.test_script_entry = ele_find(\
- ele_find(tc, 'description'),\
- 'test_script_entry').text
- self.actual_result = ele_find(\
- ele_find(tc, 'result_info'), \
- 'actual_result').text
- self.start = ele_find(ele_find(tc, 'result_info'),\
- 'start').text
- self.end = ele_find(\
- ele_find(tc, 'result_info'), 'end').text
- self.stdout = ele_find(ele_find(tc, 'result_info'),\
- 'stdout').text
- self.stderr = ele_find(ele_find(tc, 'result_info'),\
- 'stderr').text
- if self.result != "PASS":
- self.unpass = True
- return self
-
- def mergeresult_parse(self, tc1, tc2, priority="FAIL"):
- self.Id = tc1.get('id')
- self.component = tc1.get('component')
- self.execution_type = tc1.get('execution_type')
- self.priority = tc1.get('priority')
- self.purpose = tc1.get('purpose')
- self.onload_delay = tc1.get('onload_delay')
- result1 = tc1.get('result')
- result2 = tc2.get('result')
- if priority == "FAIL":
- if result1 == "FAIL":
- tc = tc1
- elif result2 == "FAIL":
- tc = tc2
- elif result1 == "BLOCK":
- tc = tc1
- elif result2 == "BLOCK":
- tc = tc2
- elif result1 == "N/A":
- tc = tc1
- elif result2 == "N/A":
- tc = tc2
- else:
- tc = tc1
- if priority == "PASS":
- tc = tc2
- self.result = tc.get('result')
- self.test_script_entry = ele_find(\
- ele_find(tc, 'description'),\
- 'test_script_entry').text
- self.actual_result = ele_find(\
- ele_find(tc, 'result_info'), \
- 'actual_result').text
- self.start = ele_find(ele_find(tc, 'result_info'), \
- 'start').text
- self.end = ele_find(ele_find(tc, 'result_info'), \
- 'end').text
- self.stdout = ele_find(ele_find(tc, 'result_info'), \
- 'stdout').text
- self.stderr = ele_find(ele_find(tc, 'result_info'), \
- 'stderr').text
- return self
-
- def to_xml(self, fail_only):
- if fail_only and self.result == "PASS":
- return
- tc = ElementTree.Element('testcase')
- ele_set(tc, 'component', self.component)
- ele_set(tc, 'execution_type', self.execution_type)
- ele_set(tc, 'id', self.Id)
- ele_set(tc, 'priority', self.priority)
- ele_set(tc, 'purpose', self.purpose)
- ele_set(tc, 'onload_delay', self.onload_delay)
- if not fail_only:
- ele_set(tc, 'result', self.result)
- description = ElementTree.Element('description')
- tse = ElementTree.Element('test_script_entry')
- if self.test_script_entry:
- tse.text = self.test_script_entry
- description.append(tse)
- tc.append(description)
- if fail_only:
- return tc
- result_info = ElementTree.Element('result_info')
- actual_result = ElementTree.Element('actual_result')
- if self.actual_result:
- actual_result.text = self.actual_result
- start = ElementTree.Element('start')
- if self.start:
- start.text = self.start
- end = ElementTree.Element('end')
- if self.end:
- end.text = self.end
- stdout = ElementTree.Element('stdout')
- if self.stdout:
- stdout.text = self.stdout
- stderr = ElementTree.Element('stderr')
- if self.stderr:
- stderr.text = self.stderr
- result_info.append(actual_result)
- result_info.append(start)
- result_info.append(end)
- result_info.append(stdout)
- result_info.append(stderr)
- tc.append(result_info)
- return tc
+++ /dev/null
-#!/usr/bin/python
-
-import os
-import re
-import sys, traceback
-import glob
-from constants import Constants
-from xml.etree import ElementTree
-import xml.etree.ElementTree as etree
-from Tkinter import *
-import tkMessageBox
-from optparse import *
-from devicemanager import DeviceManager
-from logmanager import LOGGER
-
-def vanarg(option, opt_str, value, parser):
- value = []
- for arg in parser.rargs:
- if re.search('^--.+', arg) or re.search('^-[\D]', arg):
- break
- value.append(arg)
- del parser.rargs[:len(value)]
- setattr(parser.values, option.dest, value)
-
-def printPlans_Devices(option, opt_str, value, parser):
- printPlanList()
- printDeviceList()
- sys.exit(1)
-
-def printPlanList():
- print "\nAvaiable Plans:...\n"
- folder = Constants.TCT_PLAN_FOLDER
- os.chdir(folder)
- for files in glob.glob("*.xml"):
- print files[:-4]
-
-def printDeviceList():
- print "\nConnected Devices:...\n"
- dmi = DeviceManager.getInstance()
- dmi.loadDeviceList()
- devices = dmi.getSdbDeviceList()
- for dev in devices:
- dev._printDevInfo()
- if len(devices) < 1:
- print "No Connected Devices"
-
-class ScenarioGeneratorOptions:
- def __init__(self):
- self._j = os.path.join
- self._e = os.path.exists
- self._d = os.path.dirname
- self._b = os.path.basename
- self._abspath = os.path.abspath
- self.options = None
- self.running_mode = None
- self.USAGE = ""
-
- def parse_options(self, argv):
- option_list = [
- make_option("--folderpath", "-f", dest = "plansrcfolder", \
- action="callback", callback=vanarg, \
- help="Specify the plan source directory"),
- make_option("-o", "--output", dest="testscen_file", \
- action="callback", callback=vanarg, \
- help="Specify the generating testscen in a XML file."),
- make_option("-d", "--default", dest="default", \
- action="store_true", help="Default setting"),
- make_option("-p", "--plan", dest="plan", action="callback", \
- callback=vanarg, help="Make list of sets that match a \
- plan with a device and tizen version : \
- [plan_file],[device],[tizenversion]"),
- make_option("--list", dest="lst", action="callback", \
- callback=printPlans_Devices, help="List all existing \
- plans and connected devices")
- ]
- if len(argv) == 1:
- argv.append("-h")
- PARSERS = OptionParser(option_list=option_list, usage=self.USAGE)
-
- (self.options, args) = PARSERS.parse_args()
-
- if self.options.default is not None:
- if self.options.plansrcfolder is not None or \
- self.options.testscen_file is not None or \
- self.options.plan is not None:
- sys.exit("options: conflict")
-
- def get_scen_name(self):
- if (self.options.testscen_file is not None) and \
- (self.options.testscen_file[0] is not None):
- name, ext = os.path.splitext(self.options.testscen_file[0])
- return name.split("/")[-1]
- else:
- return Constants.DEFAULT_SCEN_NAME
-
- def get_plansrc_folder(self):
- if (self.options.plansrcfolder is not None) and \
- (self.options.plansrcfolder[0] is not None):
- return self.options.plansrcfolder[0]
- else:
- return Constants.TCT_PLAN_FOLDER
-
- def get_output(self):
- if (self.options.testscen_file is not None) and \
- (self.options.testscen_file[0] is not None):
- d = os.path.abspath(os.path.dirname(self.options.testscen_file[0]))
- if not os.path.exists(d):
- os.makedirs(d)
- return os.path.abspath(self.options.testscen_file[0])
- else:
- d = os.path.abspath(Constants.TCT_SCEN_FOLDER)
- if not os.path.exists(d):
- os.makedirs(d)
- return Constants.TCT_SCEN_FOLDER + "generated_scen.xml"
-
- def get_planlist_args(self):
- if self.options.plan is not None:
- plans = []
- dmi = DeviceManager.getInstance()
- dmi.loadDeviceList()
- for plan in self.options.plan:
- if len(plan.split(',')) != 3:
- sys.exit("[--plan]: Wrong format. See --help for correct \
- format")
- plan_name = plan.split(',')[0]
- dev_id = plan.split(',')[1]
- tizenVer = plan.split(',')[2]
- dev = dmi.getDevice(dev_id)
- if dev is None:
- sys.exit("Device: [%s] is not connected" % dev_id)
- if not os.path.isfile(os.path.join(self.get_plansrc_folder(),\
- "%s.xml" % plan_name)):
- sys.exit("Plan: [%s] does not exist in the plan source \
- folder : [%s]" % (plan_name, \
- self.get_plansrc_folder()))
- self.check_tizen_version(tizenVer)
- plans.append([plan_name, [dev.devName, dev.devId, \
- dev.devType], tizenVer])
- return plans
-
- def check_tizen_version(self, tizenversion):
- VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d|^tizen_csharp_\d.\d"
- pa = re.compile(VER_PATTERN, re.I)
- ma = pa.match(tizenversion)
- if ma is None:
- LOGGER.error("A required \"/opt/tct/" + tizenversion + "\" could \
- not be found.")
- sys.exit("Invalid Tizen version. Tizen version must be in the form\
- of tizen_(web|native|csharp)_#.#")
-
- def getPlanList(self):
- folder = self.get_plansrc_folder()
- os.chdir(folder)
- planList = []
- for files in glob.glob("*.xml"):
- planList.append(files[:-4])
- return planList
-
- def getDeviceList(self):
- deviceList = []
- dmi = DeviceManager.getInstance()
- dmi.loadDeviceList()
- devices = dmi.getSdbDeviceList()
- for dev in devices:
- deviceList.append([dev.devName, dev.devId, dev.devType])
- if len(deviceList) < 1:
- print "No Device Attached"
- sys.exit("Exit: No Connected Devices")
- return deviceList
+++ /dev/null
-#!/usr/bin/python
-
-from constants import Constants
-from xml.etree import ElementTree
-from tctshell.gui.main_window import MainWindow
-import os,os.path
-import sys
-from logmanager import LOGGER
-
-class ScenPlan:
-
- def __init__(self, folder, name, device, version):
- self.name = name
- self.device = device
- self.version = version
- self.folder = folder
-
- def to_xml(self):
- plan = ElementTree.Element('plan')
- plan.set('name', self.name)
- device = ElementTree.Element('device')
- device.set('name', self.device[0])
- device.set('id', self.device[1])
- device.set('type', self.device[2])
- plan.append(device)
- version = ElementTree.Element('version')
- version.text = self.version
- plan.append(version)
- path = ElementTree.Element('path')
- name = "#".join(self.name.split("#")[:-1])
- path.text = os.path.join(self.folder, "%s.xml" %name)
- plan.append(path)
- return plan
-
-class ScenarioRunner:
-
- def __init__(self):
- self.plans = {}
- self.scen_name = Constants.DEFAULT_SCEN_NAME
-
- def load_local_repo(self, planlist_args, path, scen_name, plan_list, dev_list):
- self.scen_name = scen_name
- count = 0
- if planlist_args is None:
- scenario = self.getPlanInfo(plan_list, dev_list)
- else:
- scenario = planlist_args
- for plans in scenario:
- count += 1
- plan = ScenPlan(path, plans[0], plans[1], plans[2])
- plan.name += "#%d" % count
- self.plans[plan.name] = plan
-
- def getPlanInfo(self, planList, deviceList):
- mw = MainWindow("Scenario Generator")
- mw.getActionFrame()
- mw.importData(planList, deviceList, os.listdir("/opt/tct/"))
- mw.run()
- scenData = mw.getScenData()
- if len(scenData) < 1:
- LOGGER.error("No correct scenario data given.\nExiting...")
- raise
- return mw.getScenData()
-
- def to_xml(self, xml_name):
- root = ElementTree.Element('ns3:testscenario')
- root.set('name', self.scen_name)
- root.set('xmlns', '')
- root.set('xmlns:ns3', 'http://www.example.org/plan/')
-
- for plan_name in self.plans:
- plan = self.plans[plan_name]
- root.append(plan.to_xml())
- Constants.indent(root)
- tree = ElementTree.ElementTree()
- tree._setroot(root)
- if os.path.basename(xml_name) == "generated_scen.xml":
- i = 0
- while os.path.isfile(xml_name):
- i += 1
- if xml_name[-5] == "]":
- xml_name = "[".join(xml_name.split("[")[:-1])+"[%d].xml" % i
- else:
- xml_name = xml_name[:-4]+"[%d].xml" % i
- LOGGER.info("generating scenario to %s" % xml_name)
- tree.write(xml_name, xml_declaration=True, encoding="utf-8")
-
+++ /dev/null
-#!/usr/bin/python
-
-import subprocess
-import time
-import os
-import sys
-from .constants import Constants
-from .logmanager import LOGGER
-from .exception import DevNotFoundErr
-
-
-class SdbManager:
-
- @staticmethod
- def hostLiteCommand(command, failct=None):
- LOGGER.info(command)
- proc = subprocess.Popen(command, \
- shell=True, \
- bufsize=0, \
- stdin=subprocess.PIPE, \
- stdout=subprocess.PIPE, \
- stderr=subprocess.PIPE)
-
- curr_fail = 0
- while True:
- exit_code = proc.poll()
- if exit_code is not None:
- break
-
- output = proc.stdout.readline()
- if output:
- output = output.strip().decode('utf-8')
- LOGGER.info(output)
- if output.find("all tasks for testkit lite are accomplished, goodbye") > -1:
- return True
- elif output.find("error: protocol fault: no status") > -1:
- LOGGER.error(output)
- return False
- elif output.find("error: target offline") > -1:
- LOGGER.error(output)
- return False
- elif output.find("error: target not found") > -1:
- LOGGER.error(output)
- return False
- elif output.find("error: get too many errors, stop current set") > -1:
- LOGGER.error(output)
- return False
- elif output.find("test app no response, hang or not launched") > -1:
- LOGGER.error(output)
- elif output.find("get server status timeout, please check device") > -1:
- LOGGER.error(output)
- return False
- elif output.find("failed to install widget") > -1:
- LOGGER.error(output)
-
- if failct and int(failct) > 0:
- if output.lower().find('execute case:') > -1 and \
- (output.lower().find('fail') > -1 or \
- output.lower().find('block') > -1):
- curr_fail += 1
- if int(failct) == curr_fail:
- return False
- return True
-
- @staticmethod
- def hostRecLiteCommand(command):
- LOGGER.info(command)
- proc = subprocess.Popen(command, shell=True, \
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- while True:
- exit_code = proc.poll()
- if exit_code is not None:
- break
- output = proc.stdout.readline()
- if output:
- output = output.strip().decode('utf-8')
- LOGGER.info(output)
- if output.find("all tasks for testkit lite are accomplished, goodbye") > -1:
- return True
- return True
-
- @staticmethod
- def hostCommand(command, timeout=90):
- LOGGER.info(command)
- outs = None
- errs = None
- proc = None
- try:
- proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, \
- stderr=subprocess.PIPE)
- outs, errs = proc.communicate(timeout=timeout)
- except subprocess.TimeoutExpired:
- exc = sys.exc_info()
- raise exc[1].with_traceback(exc[2])
- except Exception:
- exc = sys.exc_info()
- raise exc[1].with_traceback(exc[2])
-
- if outs:
- outs = outs.decode("utf-8")
- if errs:
- errs = errs.decode("utf-8")
-
- if outs:
- LOGGER.info(outs)
- if SdbManager.is_target_offline(outs):
- raise DevNotFoundErr("None")
-
- if errs:
- LOGGER.error(errs)
- if SdbManager.is_target_offline(errs):
- raise DevNotFoundErr("None")
-
- return True
-
- @staticmethod
- def hostCommandwithResult(command, timeout=90):
- LOGGER.info(command)
- try:
- proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, \
- stderr=subprocess.PIPE)
- outs, errs = proc.communicate(timeout=timeout)
- except subprocess.TimeoutExpired:
- exc = sys.exc_info()
- raise exc[1].with_traceback(exc[2])
- except Exception:
- exc = sys.exc_info()
- raise exc[1].with_traceback(exc[2])
-
- if outs:
- outs = outs.decode(encoding="utf-8")
- if errs:
- errs = errs.decode("utf-8")
-
- return outs
-
- @staticmethod
- def sdbCommand(command, timeout=90):
- LOGGER.info(command)
-
- outs = None
- errs = None
- proc = None
- try:
- proc = subprocess.Popen(command, \
- shell=True, \
- bufsize=0, \
- stdin=subprocess.PIPE, \
- stdout=subprocess.PIPE, \
- stderr=subprocess.PIPE)
- outs, errs = proc.communicate(timeout=timeout)
- except subprocess.TimeoutExpired:
- exc = sys.exc_info()
- raise exc[1].with_traceback(exc[2])
- except Exception:
- exc = sys.exc_info()
- raise exc[1].with_traceback(exc[2])
-
- if outs:
- outs = outs.decode("utf-8")
- if errs:
- errs = errs.decode("utf-8")
-
- return outs, errs
-
- @staticmethod
- def _checkDevIdExists(_devid):
- if len(_devid) < 0:
- LOGGER.error("The '%s' device Id exists error" % _devid)
- return False
- return True
-
- @staticmethod
- def sdbPush(_devid, local, remote):
- FAIL_LOG = "sdb -s %s push failed" % _devid
- if SdbManager._checkDevIdExists(_devid) is False:
- raise DevNotFoundErr(_devid)
- if Constants.checkFileExists(local) is False:
- LOGGER.warning("File exists error:%s" % local)
- return False
-
- push_cmd = Constants.SDB_PUSH % _devid + " " + local + " " + remote
- outLog, errLog = SdbManager.sdbCommand(push_cmd)
-
- if errLog:
- LOGGER.error(FAIL_LOG)
- LOGGER.error(str(errLog))
- if SdbManager.is_target_offline(errLog):
- raise DevNotFoundErr(_devid)
- return False
- if outLog:
- LOGGER.info(str(outLog))
- return True
-
- @staticmethod
- def sdbPull(_devid, remote, local):
- FAIL_LOG = "sdb -s %s pull failed" % _devid
- if SdbManager._checkDevIdExists(_devid) is False:
- raise DevNotFoundErr(_devid)
-
- rmtFileCheck_cmd = Constants.SDB_SHELL % _devid + " " \
- + Constants.FILE_FOUND_SCRIPT % remote
- outLog, errLog = SdbManager.sdbCommand(rmtFileCheck_cmd)
-
- if errLog:
- LOGGER.error(FAIL_LOG)
- LOGGER.error(str(errLog))
- if SdbManager.is_target_offline(errLog):
- raise DevNotFoundErr(_devid)
- return False
- if outLog:
- LOGGER.info(str(outLog))
-
- pull_cmd = Constants.SDB_PULL % _devid + " " + remote + " " + local
- outLog, errLog = SdbManager.sdbCommand(pull_cmd)
-
- if errLog:
- LOGGER.error(FAIL_LOG)
- LOGGER.error(str(errLog))
- return False
- if outLog:
- LOGGER.info(str(outLog))
-
- if Constants.checkFileExists(local) is False:
- return False
- return True
-
- @staticmethod
- def sdbShell(_devid, cmd, timeout=90):
- FAIL_LOG = "sdb -s %s shell failed" % _devid
- if SdbManager._checkDevIdExists(_devid) is False:
- raise DevNotFoundErr(_devid)
-
- shell_cmd = Constants.SDB_SHELL % _devid + " " + cmd
- outLog, errLog = SdbManager.sdbCommand(shell_cmd, timeout)
-
- if errLog:
- LOGGER.error(FAIL_LOG)
- LOGGER.error(str(errLog))
- if SdbManager.is_target_offline(errLog):
- raise DevNotFoundErr(_devid)
- return None
- if outLog:
- LOGGER.info(str(outLog))
- return outLog
-
- @staticmethod
- def sdbRootOn(_devid):
- FAIL_LOG = "sdb -s %s root on failed" % _devid
- if SdbManager._checkDevIdExists(_devid) is False:
- raise DevNotFoundErr(_devid)
- root_cmd = Constants.SDB_ROOT_ON % _devid
- outLog, errLog = SdbManager.sdbCommand(root_cmd, 20)
-
- if errLog:
- LOGGER.error(FAIL_LOG)
- LOGGER.error(str(errLog))
- if SdbManager.is_target_offline(errLog):
- raise DevNotFoundErr(_devid)
- return False
- if outLog:
- LOGGER.info(str(outLog))
-
- checkLog = SdbManager.sdbShell(_devid, 'whoami')
- if checkLog and checkLog.find('root') != -1:
- LOGGER.info('root on')
- else:
- LOGGER.error(FAIL_LOG)
-
- @staticmethod
- def sdbDevices():
- FAIL_LOG = "sdb devices failed"
- dev_cmd = Constants.SDB_DEVICES
- outLog, errLog = SdbManager.sdbCommand(dev_cmd, 5)
-
- if errLog:
- LOGGER.error(FAIL_LOG)
- LOGGER.error(str(errLog))
- return None
- if outLog:
- LOGGER.info(str(outLog))
- return outLog
-
- @staticmethod
- def getCapabilityBack(deviceId, tizenVer):
- remote = Constants.getDEVICE_CAPABILITY_PATH(tizenVer)
- local = Constants.LOCAL_CAPABILITY_PATH % deviceId
- return SdbManager.sdbPull(deviceId, remote, local)
-
- @staticmethod
- def recoveryDevice(_tizenV, _deviceid):
- if _tizenV:
- tinycmd = "python " + Constants.DEVICE_HEALTH_CMD % _tizenV + \
- " --check --proc=tinyweb --deviceid=" + _deviceid
- stubcmd = "python " + Constants.DEVICE_HEALTH_CMD % _tizenV + \
- " --check --proc=testkit-stub --deviceid=" + _deviceid
- outLog, errLog = SdbManager.sdbCommand(tinycmd)
- if errLog: LOGGER.error(str(errLog))
- if outLog: LOGGER.info(str(outLog))
-
- outLog, errLog = SdbManager.sdbCommand(stubcmd)
- if errLog: LOGGER.error(str(errLog))
- if outLog: LOGGER.info(str(outLog))
-
- @staticmethod
- def checkDirExist(_devid, _dirname):
- lscmd = "ls -al " + _dirname
- outLog = SdbManager.sdbShell(_devid, lscmd)
- if outLog and outLog.find("No such file or directory") > -1:
- return False
- elif outLog is None:
- return False
- return True
-
- @staticmethod
- def findDumpPath(_devid):
- find_cmd = "sdb -s %s shell cat /etc/tizen-platform.conf | grep TZ_SYS_CRASH_ROOT" % _devid
- outLog, errLog = SdbManager.sdbCommand(find_cmd)
-
- if not outLog:
- return None
-
- result = outLog.split('\n')
- LOGGER.debug(str(result))
- if len(result) < 2:
- LOGGER.error("Cannot parsing Crash dump path")
- return None
- else:
- crash_root = result[0].split('=')[1].strip()
- dump = result[1].split('=')[1].replace('${TZ_SYS_CRASH_ROOT}', '').strip()
- return crash_root + dump
-
- @staticmethod
- def resetDumpFiles(_devid):
- dumpPath = SdbManager.findDumpPath(_devid)
- if dumpPath is None:
- return False
- if SdbManager.checkDirExist(_devid, dumpPath):
- rmcmd = "rm -f " + dumpPath + "/*"
- SdbManager.sdbShell(_devid, rmcmd)
-
- @staticmethod
- def deleteDumpFiles(_devid, dump_files):
- dumpPath = SdbManager.findDumpPath(_devid)
- if dumpPath is None:
- return False
- if SdbManager.checkDirExist(_devid, dumpPath):
- for file in dump_files:
- rmcmd = "rm -f " + dumpPath + "/" + file
- SdbManager.sdbShell(_devid, rmcmd)
-
- @staticmethod
- def exportDumpFiles(_devid, _resultDir):
- dumpPath = SdbManager.findDumpPath(_devid)
- if dumpPath is None:
- return False
- isExist = SdbManager.checkDirExist(_devid, dumpPath)
- if isExist:
- if not os.path.exists(_resultDir):
- os.makedirs(_resultDir)
- chk_crash_mgr_cmd = "ps -ef | grep -v grep | grep crash-manager"
- while True:
- outs = SdbManager.sdbShell(_devid, chk_crash_mgr_cmd)
- if outs is None:
- break
- else:
- wait_time = 10
- for loop in range(wait_time):
- LOGGER.info("Waiting for crash-manager {0}...".\
- format(wait_time - loop))
- time.sleep(1)
-
- remote = dumpPath
- res = SdbManager.sdbPull(_devid, remote, _resultDir)
- if res:
- dump_files = []
- for file in os.listdir(_resultDir):
- dump_files.append(file)
- return dump_files
- else:
- LOGGER.error("Not Found crash dump directory : %s" % dumpPath)
-
- @staticmethod
- def is_target_offline(log):
- if log:
- if str(log).find('target not found') > -1 or \
- str(log).find('target offline') > -1:
- return True
- else:
- return False
- return False
+++ /dev/null
-#!/usr/bin/python
-
-import os
-import configparser
-import string
-import json
-
-from .logmanager import LOGGER
-from .sdbmanager import SdbManager
-from .constants import Constants
-from xml.etree import ElementTree
-
-class Guider:
- _conf_prompts = []
- deviceIds = []
-
- def __init__(self, plan, deviceIds=None):
- if deviceIds is None:
- self.deviceIds = [plan.getDeviceId()]
- else:
- self.deviceIds = deviceIds
- self.deviceId = self.deviceIds[0]
- self.tizenVer = plan.getTizenVersion()
- self.stubPort = plan.getStubPort()
- self.manual_items = {}
- self.conf_items = {}
- self.suites = {}
-
- for suite in plan.getSuites():
- self.suites[suite.getSuiteName()] = suite
-
- self.conf_file = Constants.PRE_CONF_HOST_INI % self.deviceId
-
- def init_items(self):
- self._fill_items()
- self._read_conf()
- self.read(self.conf_file)
-
- def read(self, filename):
- LOGGER.debug("reading %s file" % filename)
- try:
- fp = open(filename)
- except IOError:
- LOGGER.warning("open file fail...")
-
- self._read(fp, filename)
- fp.close()
-
- def _read(self, fp, fpname):
- lineno = 0
- comment = None;
- prompts = []
- while True:
- line = fp.readline()
- if not line:
- break
- lineno = lineno + 1
- # comment or blank line?
- if line.strip() == '':
- continue
- if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR":
- # no leading whitespace
- continue
- if line[0] in '#;':
- comment = line;
- continue
- if line[0] in '[':
- comment = None;
- continue
- if line.find('='):
- linelist = line.split('=')
- prompts.append((linelist[0], comment))
- self._conf_prompts = prompts
-
- def _read_conf(self):
- parser = configparser.ConfigParser()
- parser.read(self.conf_file)
- for section in parser.sections():
- if not section:
- continue
- opts = {}
- for n, v in parser.items(section):
- if n:
- opts[n] = v
- self.conf_items[section] = opts
-
- def _fill_items(self):
- command = "cat " + Constants.PRE_CONF_HOST_XML % self.deviceId
- result = SdbManager.hostCommandwithResult(command)
- if result is None :
- LOGGER.warning("Obtain tct_testconfig content error...")
- self._exit(0)
-
- xml_tree = ElementTree.fromstring(result)
-
- for set in ElementTree.Element.findall(xml_tree, "suite/set"):
- module_name = ElementTree.Element.get(set, "name", None)
- if module_name:
- descs = []
- for desc in ElementTree.Element.findall(set, "testcase/description/steps/step/step_desc"):
- if desc is not None:
- descs.append(desc.text)
- self.manual_items[module_name] = descs
-
- def is_update_config(self, pkg_name):
- #if self.conf_items.has_key(pkg_name):
- if pkg_name in self.conf_items:
- return True
- return False
-
- def get_confs(self, pkg_name):
- return self.conf_items.get(pkg_name)
-
- def _update_portenv(self):
- #read json
- for devId in self.deviceIds:
- if os.path.isfile(Constants.PORT_CONF_HOST_JSON % devId) :
- fread = open(Constants.PORT_CONF_HOST_JSON % devId, "r")
- port_data = json.loads(fread.read())
- fread.close()
-
- port_data[0]['STUB_PORT'] = self.stubPort
- fwrite = open(Constants.PORT_CONF_HOST_JSON % devId,"w")
- json.dump(port_data, fwrite,indent = 4)
- fwrite.close()
- else :
- LOGGER.warning("Not Found %s config file" % Constants.PORT_CONF_HOST_JSON % devId)
- raise
-
- def setup_manual_env(self):
- self._show_manual_setup()
- self._show_overall_infos()
- self._update_json()
- self._push_preconfigure()
- if self.tizenVer.find("native") > -1:
- self._update_txt()
- self._push_tc_config()
-
- def setup_default_env(self):
- self._update_portenv()
- self._push_portconfigure()
-
- def _push_preconfigure(self):
- for devId in self.deviceIds:
- local = Constants.PRE_CONF_HOST_JSON % devId
- remote = Constants.getTCT_PRE_CONF_DEVICE_JSON(self.tizenVer)
- SdbManager.sdbPush(devId, local, remote)
-
- def _push_portconfigure(self):
- for devId in self.deviceIds:
- local = Constants.PORT_CONF_HOST_JSON % devId
- remote = Constants.getTCT_PORT_CONF_DEVICE_JSON(self.tizenVer)
- SdbManager.sdbPush(devId, local, remote)
-
- def _push_tc_config(self):
- for devId in self.deviceIds:
- local = Constants.NAT_CONF_HOST_TXT % devId
- remote = Constants.NAT_CONF_DEVICE_TXT
- SdbManager.sdbPush(devId, local, remote)
-
- def _filter_suits(self, items):
- keys = set()
- if self.suites and items:
- suit_keys = set(self.suites.keys())
- item_keys = set(items.keys())
- keys = keys|(suit_keys & item_keys)
- return list(keys)
-
- def _show_manual_setup(self):
- keys = self._filter_suits(self.manual_items)
- if not keys:
- LOGGER.debug("No any pre-configure to be configured.")
- return
-
- LOGGER.info("\nHi,guys, before the start, there are some pre-configures must be provided,"
- "and you just should input (Y)es or simply press Enter if your test environment "
- "has met the request, otherwise, please input (N)o and the program will exit.")
-
- LOGGER.info("Device Id : %s " % str(self.deviceIds))
-
- for module in keys:
- descs = self.manual_items.get(module)
- if descs:
- LOGGER.info("")
- LOGGER.info("Module: %s" % module)
- LOGGER.info("")
- i = 1
- for desc in descs:
- LOGGER.info('(%r) %s' % (descs.index(desc) + 1, desc))
- i += i
- result = True
- while result:
- answer = input("\nHave you set the device as descriped above? [Yes/No]: ")
- if answer and (answer.lower() == "no" or answer.lower() == "n"):
- LOGGER.warning("\nYour environment can't meet the test's request. Exit...")
- self._exit(0)
- if answer and (answer.lower() == "yes" or answer.lower() == "y"):
- result = False
- LOGGER.info("")
-
- def _show_overall_infos(self):
- keys = self._filter_suits(self.conf_items)
- if not keys:
- LOGGER.debug("No conf params are needed here.")
- return
-
- LOGGER.info("Overall needed configure is as below, please confirm:\n")
- index = 1
- for k,p in self._conf_prompts:
- for pkg in keys:
- v = self._get_value(pkg, k)
- if v is not None:
- LOGGER.info ('{i}. {p}'.format(i = index, p = p))
- LOGGER.info('{0: <30}{v}'.format(k + ":", v = v))
- index += 1
- LOGGER.info("\nIf needed, please update %s file. " % (Constants.PRE_CONF_HOST_INI % str(self.deviceIds)))
- result = True
- while result:
- next_step = input("Continue to run test? [Yes/No]: ")
- if next_step and (next_step.lower() == "n" or next_step.lower() == "no"):
- self._exit(0)
- if next_step and (next_step.lower() == "yes" or next_step.lower() == "y"):
- result = False
- LOGGER.info("OK! All is well. Let's go ahead...")
-
- def _exit(self, code=None):
- LOGGER.info("Bye-bye ^_^")
- if code is None:
- code = 0
- raise
-
- def _get_value(self, section, opt):
- #if self.conf_items.has_key(section):
- if section in self.conf_items:
- vs = self.conf_items.get(section)
- #if vs and vs.has_key(opt.lower()):
- if vs and opt.lower() in vs:
- return vs.get(opt.lower())
- return None
-
- def _update_json(self):
- for devId in self.deviceIds:
- self._read_conf()
- list = []
- dic = {}
- for value in self.conf_items.values():
- for k,v in value.items():
- dic[k.upper()] = v
- list.append(dic)
- fp = open(Constants.PRE_CONF_HOST_JSON % devId,"w")
- json.dump(list, fp,indent = 4)
-
- def _update_txt(self):
- for devId in self.deviceIds:
- self._read_conf()
- dic = {}
-
- tc_conf_file = open(Constants.NAT_CONF_HOST_TXT % devId, "w")
- for value in self.conf_items.values():
- for k,v in value.items():
- dic[str.upper(k)] = v
-
- for k, v in dic.items():
- tc_conf_file.write(k+"="+v+"\n")
-
- tc_conf_file.close()
-
+++ /dev/null
-#!/usr/bin/python
-
-import shutil
-import os
-import datetime
-
-from multiprocessing import Lock
-
-from .constants import Constants
-from .sdbmanager import SdbManager
-from .logmanager import LOGGER
-from .exception import DevNotFoundErr
-
-
-class MultiRunnPlan(object):
- INSTANCE = None
- runningPlans = {}
- _observers = []
-
- def __init__(self):
- self._observers = []
- if MultiRunnPlan.INSTANCE is not None:
- raise Exception('A TestSingleton instance already exists')
-
- @classmethod
- def getInstance(cls):
- if cls.INSTANCE is None:
- cls.INSTANCE = MultiRunnPlan()
- return cls.INSTANCE
-
- def attach(self, observer):
- if not observer in self._observers:
- self._observers.append(observer)
- else:
- LOGGER.debug("The observer already exists")
-
- def detach(self, observer):
- if observer in self._observers:
- self._observers.remove(observer)
- else:
- LOGGER.debug("[DEBUG] The observer does not exist")
-
- def notify(self):
- LOGGER.debug(" MultiRunnPlan Notify ")
- for observer in self._observers:
- observer.update()
-
- #param string plan id
- #param TctShellPlan plan
- def addPlan(self, planid, plan):
- if planid:
- self.runningPlans[planid] = plan
- else:
- self.runningPlans['test'] = plan
-
- #return int
- def getPlansSize(self):
- return len(self.runningPlans)
-
- def removePlans(self, plans):
- for plan in plans:
- self.runningPlans.pop(plan.name, None)
-
- def clearPlans(self):
- self.runningPlans.clear()
-
- #return dictionary
- def getPlanDict(self):
- return self.runningPlans
-
- #Param TctShellPlan
- #return bool
- def isSelectedDevAvailable(self, plan):
- currDevId = plan.getDeviceId()
- runnDevs = self.getRunnDevice()
- for rDev in runnDevs:
- if rDev == currDevId:
- LOGGER.debug("%s currently occupied with other plans." \
- % currDevId)
- return False
-
- LOGGER.debug("%s is now available" % currDevId)
- return True
-
- #return String[]
- def getRunnDevice(self):
- runDev = []
- for rplan in self.runningPlans.values():
- if rplan.isRunning() == True:
- runDev.append(rplan.getDeviceId())
- return runDev
-
- def printRunnPlan(self):
- for rplan in self.runningPlans.values():
- LOGGER.debug("Name : %s , isStart : %s" \
- % (rplan.getPlanName(), rplan.isRunning()))
-
- def setCurrPlanRunning(self, plan):
- currPlanName = plan.getPlanName()
- for rPlan in self.runningPlans.values():
- if rPlan.getPlanName() == currPlanName:
- rPlan.setRunning(True)
- return True
- return False
-
-
-class TctShellPlan:
- resultFolderPath = ""
- isRun = False
- isFinish = False
- isRerun = False
-
- #PARAM name = Full_web_mobile#1(primary key)
- #PARAM deviceid = '0000d81b00006200'
- #PARAM profile = 'mobile' or 'wearable' or 'tv'
- #PARAM executeType = ExecuteType class
- #PARAM suites = TctShellSuite []
- #PARAM tizenVer = 'tizen_web_2.4'
- #PARAM resultFolderPath = '/opt/tct/tizen_web_2.4/shell/result/'
- #PARAM stubPort = 8000
- def __init__(self, name, devmgr, deviceId, profile, executeType, suites, \
- tizenVer, resultFolderPath, stubPort=8000, scen_name=None):
- self.suites = []
- self.name = name
- self.devmgr = devmgr
- self.deviceId = deviceId
- self.buildId = None
- self.profile = profile
- self.executeType = executeType
- self.unpass = None
- self.scen_name = scen_name
- for suite in suites:
- LOGGER.info("List: suite's name = %s" % str(suite.getSuiteName()))
- self.suites.append(suite)
- self.tizenVer = tizenVer
- self.resultFolderPath = resultFolderPath
- self.expectedTime = 0
- self.scen_resultFolderPath = None
- self.stubPort = stubPort
- self.planLock = Lock()
- if self.resultFolderPath is None:
- folderName = self.name + "_" + \
- datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S.%f')
- self.resultFolderPath = Constants.RESULT_FOLDER \
- % (self.tizenVer, folderName)
-
- def acquire(self):
- self.planLock.acquire(True)
-
- def release(self):
- self.planLock.release()
-
- def addExpectedTime(self, etime):
- self.expectedTime += etime
-
- def addSuite(self, suite):
- self.suites.append(suite)
-
- def getPlanName(self):
- return self.name
-
- def getProfile(self):
- return self.profile
-
- def getSuites(self):
- return self.suites
-
- def getDeviceId(self):
- return self.deviceId
-
- def setDeviceId(self, deviceId):
- self.acquire()
- if self.deviceId is None:
- LOGGER.debug("plan [%s] now has device ID [%s]" \
- % (self.getPlanName(), deviceId))
- self.deviceId = deviceId
- self.release()
-
- def getBuildId(self):
- if not self.buildId:
- dev = self.devmgr.getDevice(self.deviceId)
- if dev:
- self.buildId = dev.getDeviceBuildId()
-
- return self.buildId
-
- def isRunning(self):
- return self.isRun
-
- def setRunning(self, run):
- self.isRun = run
-
- def isFinished(self):
- return self.isFinish
-
- def isReRunning(self):
- return self.isRerun
-
- def setRerunning(self, rerun):
- self.isRerun = rerun
-
- def getExecuteType(self):
- return self.executeType
-
- def getStubPort(self):
- return self.stubPort
-
- def getTizenVersion(self):
- return self.tizenVer
-
- def setFinished(self):
- self.isFinish = True
- MRP_i = MultiRunnPlan.getInstance()
- MRP_i.notify()
-
- def getUnpass(self):
- return self.unpass
-
- def setUnpass(self, unpass):
- if self.unpass is None or self.unpass == False:
- self.unpass = unpass
-
- def getResultFolderPath(self):
- '''
- self.acquire()
- if self.resultFolderPath is None:
- LOGGER.error("make result dir path============")
- folderName = self.name + "_" + \
- datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S.%f')
- self.resultFolderPath = Constants.RESULT_FOLDER \
- % (self.tizenVer, self.getBuildId(), folderName)
- self.release()
- '''
- return self.resultFolderPath
-
- #info get Tmp Folder path in device
- #return String
- def getDevTctTmpPath(self):
- return Constants.getDEVICE_SUITE_TARGET(self.tizenVer) + "tmp/"
-
- def getScenName(self):
- return self.scen_name
-
- def setScenResultFolderPath(self, path):
- self.scen_resultFolderPath = path
-
- def getScenResultFolderPath(self):
- self.acquire()
- if not self.scen_resultFolderPath and self.getScenName():
- folderName = "scenario_" + self.getScenName() + '_' \
- + datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S.%f')
- self.scen_resultFolderPath = Constants.RESULT_FOLDER \
- % (self.tizenVer, self.getBuildId(), folderName)
- self.release()
- return self.scen_resultFolderPath
-
- def setup_distribute(self):
- self.devmgr.loadDeviceList()
- runningDevs = self.devmgr.getSdbDeviceList()
- if len(runningDevs) < 1:
- LOGGER.error("No device connected for distribute mode")
- return False
- LOGGER.info("Plan [%s] will be distributed to %d devices: %s" \
- % (self.name, len(runningDevs), \
- str([dev.devId for dev in runningDevs])))
- self.deviceId = None
- self.sortSuites()
- return True
-
- def sortSuites(self):
- sorted_suites = []
- suites = self.getSuites()
- connection_suite = None
- for suite in suites:
- suite_name = suite.getSuiteName()
- if suite_name == 'tct-connection-native-utc':
- connection_suite = suite
- continue
-
- autoCount = int(suite.getAutoNum())
- category = suite.category
- if category and category.find('Runtime') > -1:
- etime = autoCount * (Constants.SUITE_TEST_EXPECTED_TIME + 2)
- else:
- etime = (autoCount * 2) + Constants.SUITE_TEST_EXPECTED_TIME
-
- suite.setExpectedTime(etime)
- sorted_suites.append(suite)
- sorted_suites.sort(key=lambda x: x.expectedTime, reverse=True)
- if connection_suite:
- sorted_suites.append(connection_suite)
-
- self.suites = sorted_suites
-
-
-class TctShellSuite:
- #PARAM suiteName = 'tct-capability-tests'
- #PARAM tcName = 'caps_displayresolution'
- #PARAM auto_num = 12
- #PARAM manual_num = 15
- #PARAM suite_pkg_name = 'common/tct-capability-tests-2.4.zip'
- #PARAM launcher = 'WRTLauncher'
- #PARAM category = 'Compliance'
- #PARAM tizenV = 'tizen_web_2.4'
- def __init__(self, suiteName, tcName, auto_num, manual_num, \
- suite_pkg_name, launcher, category, tizenV, skip_count, skip_tc, \
- devmgr, pre_test, post_test, is_make_ne=0):
- self.suiteName = suiteName
- self.tcName = tcName
- self.auto_num = auto_num
- self.manual_num = manual_num
- self.suite_pkg_name = suite_pkg_name
- self.launcher = launcher
- #category can be None
- self.category = category
- self.tizenV = tizenV
- self.expectedTime = 0
- self.runErrorStatus = False
- self.noAuto = False
- self.noManual = False
- self.skip_count = skip_count
- self.skip_tc = skip_tc
- self.devmgr = devmgr
- self.pre_test = pre_test
- self.post_test = post_test
- self.is_make_ne = is_make_ne
-
- def _liteCommand(self, deviceId, resultFolder, extype, \
- tcName, isRerun, stubPort, isSkip=None, reverse_tests=None):
- lcmd = ""
- if self.tizenV and \
- (self.tizenV.find("web") > -1 or self.tizenV.find("csharp") > -1):
- lcmd += Constants.LITE_CMD2 + " "
- else:
- lcmd += Constants.LITE_CMD1 + " "
-
- # -- priority
- if Constants.PRIORITY_VALUE:
- lcmd += Constants.PRIORITY
-
- lcmd += Constants.LITE_DEVICE_PARAM + " "
-
- if isSkip:
- lcmd += 'None' + " "
- elif self.is_make_ne != 0:
- lcmd += 'NE:{}_{}'.format(str(self.is_make_ne), \
- str(deviceId)) + " "
- else:
- lcmd += str(deviceId) + " "
-
- if isRerun:
- lcmd += Constants.LOCAL_PRE
- lcmd += os.path.join(resultFolder, \
- self.suiteName + Constants.RERUN_SUFFIX) + " "
- elif reverse_tests is not None:
- lcmd += Constants.LOCAL_PRE
- lcmd += reverse_tests + " "
- else:
- if self.tizenV.find('csharp') > -1 or self.tizenV.find('web') > -1 or deviceId is None:
- lcmd += Constants.LOCAL_PRE
- lcmd += (Constants.LOCAL_SHELL_TEMP_PATH % deviceId)
- lcmd += "opt/" + self.suiteName + "/"
- lcmd += Constants.DEVICE_SUITE_DEF + " "
- else:
- lcmd += Constants.DEVICE_PRE
- lcmd += Constants.getDEVICE_SUITE_FOLDER(self.tizenV)
- lcmd += self.suiteName + "/"
- lcmd += Constants.DEVICE_SUITE_DEF + " "
-
- lcmd += extype.toLiteParam() + " "
- lcmd += Constants.LITE_NON_ACTIVE_PARAM + " "
-
- if tcName is not None:
- lcmd += Constants.TESTCASE_ID + " "
- lcmd += tcName + " "
-
- lcmd += "--tizen-version" + " "
- lcmd += self.tizenV + " "
-
- lcmd += "--stub-port" + " "
- lcmd += str(stubPort) + " "
-
- if self.skip_tc:
- lcmd += "--skip-tc "
- for tc in self.skip_tc:
- lcmd += str(tc)
- lcmd += " "
-
- if self.tizenV and (self.tizenV.find("web") > -1 or self.tizenV.find('csharp') > -1):
- lcmd += Constants.EXT_TYPE_PARAM + " "
- lcmd += Constants.COMM_TYPE_PARAM + " "
- lcmd += Constants.ENV_TYPE_PARAM + " "
- else:
- lcmd += Constants.LITE_E_PARAM + " "
-
- if deviceId:
- lcmd += Constants.LITE_CAPABILITY_PARAM + " "
- lcmd += Constants.LOCAL_CAPABILITY_PATH % deviceId + " "
-
- lcmd += Constants.LITE_OUTPUT_PARAM
- lcmd += os.path.join(resultFolder, self.suiteName)
-
- if isRerun:
- if extype.getCurrType() == ExecuteType.e_manual:
- lcmd += Constants.RERUN_MANUAL_RESULT_SUFFIX + " "
- else:
- lcmd += Constants.RERUN_AUTO_RESULT_SUFFIX + " "
-
- lcmd += " --rerun"
- else:
- if extype.getCurrType() == ExecuteType.e_manual:
- lcmd += Constants.MANUAL_RESULT_SUFFIX + " "
- else:
- lcmd += Constants.AUTO_RESULT_SUFFIX + " "
-
- return lcmd
-
- def executePlanAuto(self, deviceId, resultFolder, tcName, isRerun, \
- stubport):
- self.executePlaninLite(deviceId, resultFolder, ExecuteType('Auto'), \
- tcName, isRerun, stubport)
-
- def executePlanManual(self, deviceId, resultFolder, tcName, isRerun, \
- stubport):
- self.executePlaninLite(deviceId, resultFolder, ExecuteType('Manual'), \
- tcName, isRerun, stubport)
-
- def executePlaninLite(self, deviceId, resultFolder, exeType, tcName, \
- isRerun, stubport):
- exCmd = self._liteCommand(deviceId, resultFolder, exeType, tcName, \
- isRerun, stubport)
-
- isPass = True
- if deviceId:
- isPass = SdbManager.hostLiteCommand(exCmd, self.skip_count)
- else:
- SdbManager.hostRecLiteCommand(exCmd)
- return None
-
- if isPass is False:
- cmd = ""
- if self.tizenV.find("native") > -1 or self.tizenV.find("2.4") > -1:
- tests = Constants.getDEVICE_TESTS_FILE(self.tizenV) % self.suiteName
- cmd = "ps aux | grep 'python /opt/testkit/lite[0-9].[0-9]/testkit-lite -f device:%s'" % tests
- else:
- tests = Constants.LOCAL_SHELL_TEMP_PATH % deviceId + "opt/" + self.suiteName + "/tests.xml"
- cmd = "ps aux | grep 'python /opt/testkit/lite[0-9].[0-9]/testkit-lite -f %s'" % tests
-
- result = str(SdbManager.hostCommandwithResult(cmd))
- grep_lines = result.split('\n')
- for line in grep_lines:
- if line and len(line) > 0 and line.find(self.suiteName) > -1:
- proc_id = line.split()[1]
- SdbManager.hostCommand('kill -9 %s' % proc_id)
- if self.tizenV and (self.tizenV.find("web") > -1 or self.tizenV.find("csharp") > -1):
- exCmd = self._liteCommand(deviceId, resultFolder, exeType, tcName, \
- isRerun, stubport, True)
- SdbManager.hostRecLiteCommand(exCmd)
- else:
- reverse_tests = self._naitve_installSuiteinHost()
- exCmd = self._liteCommand(deviceId, resultFolder, exeType, tcName, \
- isRerun, stubport, True, reverse_tests)
- SdbManager.hostRecLiteCommand(exCmd)
- LOGGER.error("[skip package : %s]" % self.suiteName)
- break
-
- def _native_installSuiteinHost(self):
- hostTmpFolder = Constants.LOCAL_SHELL_TEMP_PATH % None
- localSuitePath = Constants.SUITES_REPOSITORY \
- % self.tizenV + self.suite_pkg_name
- self._installSuiteinHost(None, localSuitePath, hostTmpFolder)
- tmp_suite = hostTmpFolder + "opt/" + self.suiteName + "/tests.xml"
- return tmp_suite
-
- def getSuitePackageName(self):
- return self.suite_pkg_name
-
- def getSuiteName(self):
- return self.suiteName
-
- def getSuiteZipName(self):
- suiteFile = self.suite_pkg_name.split('/')
- return suiteFile[1]
-
- def getSuiteFullPath(self):
- return os.path.join(Constants.SUITES_REPOSITORY \
- % self.tizenV, self.suite_pkg_name)
-
- def checkExistSuiteFile(self):
- return os.path.isfile(self.getSuiteFullPath())
-
- def _fileCopy(self, src, destDir):
- if not Constants.checkFileExists(src):
- LOGGER.warning("The '%s' file exists error" % src)
-
- if not os.path.exists(destDir):
- os.makedirs(destDir, mode=0o777)
-
- shutil.copy(src, destDir)
-
- def getTestCase(self):
- return self.tcName
-
- def getAutoNum(self):
- return self.auto_num
-
- def getManualNum(self):
- return self.manual_num
-
- def getExpectedTime(self):
- return self.expectedTime
-
- def setExpectedTime(self, etime):
- self.expectedTime = etime
-
- def setRunErrorStatus(self, status):
- self.runErrorStatus = status
-
- def getNoAuto(self):
- return self.noAuto
-
- def getNoManual(self):
- return self.noManual
-
- def setNoAuto(self):
- self.noAuto = True
-
- def setNoManual(self):
- self.noManual = True
-
- def _sdb_recov(self, _devid):
- LOGGER.error(_devid + " sdb disconnect")
- self.devmgr.deleteFaultDevice(_devid)
-
- def _installSuiteinHost(self, _devid, localSuitePath, hostTmpFolder):
- if not os.path.exists(hostTmpFolder + "opt/" + self.suiteName \
- + "/" + Constants.INSTALL_ZIP_W3):
- # copy suite zip file
- self._fileCopy(localSuitePath, hostTmpFolder)
-
- # unzip suite zip file
- unzip_cmd = Constants.UNZIP + " " + hostTmpFolder \
- + self.getSuiteZipName() + " -d " + hostTmpFolder
- SdbManager.hostCommand(unzip_cmd, 300)
-
- if _devid:
- try:
- inst_cmd = "python " + hostTmpFolder + "opt/" + self.suiteName \
- + "/" + Constants.INSTALL_ZIP_W3 + " -i -s " + _devid
- SdbManager.hostCommand(inst_cmd, 300)
- except DevNotFoundErr:
- self._sdb_recov(_devid)
- return False
- except Exception:
- return False
-
- return True
-
- def _installSuiteinTarget(self, _devid, localSuitePath, remoteTmpFolder):
- try:
- if not SdbManager.sdbPush(_devid, localSuitePath, remoteTmpFolder):
- return False
-
- unzip_cmd = Constants.UNZIP + " " + remoteTmpFolder \
- + self.getSuiteZipName() + " -d " \
- + remoteTmpFolder.replace("tmp/", "")
-
- inst_cmd = remoteTmpFolder.replace("/tmp", "") + "opt/" \
- + self.suiteName + "/" + Constants.INSTALL_ZIP_24
-
- SdbManager.sdbShell(_devid, unzip_cmd, 300)
- SdbManager.sdbShell(_devid, inst_cmd, 300)
- except DevNotFoundErr:
- self._sdb_recov(_devid)
- return False
- except Exception:
- return False
-
- return True
-
- def installSuite(self, deviceId, remoteTmpFolder):
- localSuitePath = Constants.SUITES_REPOSITORY \
- % self.tizenV + self.suite_pkg_name
- instResult = True
-
- if self.tizenV.find("csharp") > -1 or \
- self.tizenV.find("web") > -1 or deviceId is None:
- hostTmpFolder = Constants.LOCAL_SHELL_TEMP_PATH % deviceId
- instResult = self._installSuiteinHost(\
- deviceId, localSuitePath, hostTmpFolder)
- else:
- instResult = self._installSuiteinTarget(\
- deviceId, localSuitePath, remoteTmpFolder)
-
- return instResult
-
- def _unInstallSuiteInHost(self, _devid, hostTmpFolder):
- suiteZipPath = hostTmpFolder + self.getSuiteZipName()
- removeSuitezip = "rm -f " + suiteZipPath
- SdbManager.hostCommand(removeSuitezip)
-
- localSuitePath = Constants.SUITES_REPOSITORY % self.tizenV + self.suite_pkg_name
- self._fileCopy(localSuitePath, hostTmpFolder)
-
- unzip_cmd = Constants.UNZIP + " " + hostTmpFolder \
- + self.getSuiteZipName() + " -d " + hostTmpFolder
- SdbManager.hostCommand(unzip_cmd)
-
- if _devid:
- try:
- unInstSuite = "python " + hostTmpFolder + "opt/" \
- + self.suiteName + "/" + Constants.UNINSTALL_ZIP_W3 \
- + " -s " + _devid
- SdbManager.hostCommand(unInstSuite,300)
- except DevNotFoundErr:
- self._sdb_recov(_devid)
- return False
- except Exception:
- return False
-
- def _unInstallSuiteInTarget(self, _devid, remoteFolder):
- try:
- removeSuite = "rm -f " + remoteFolder + self.getSuiteZipName()
- unInstSuite = remoteFolder.replace("/tmp", "") + "opt/" \
- + self.suiteName + "/" + Constants.UNINSTALL_ZIP_24
-
- SdbManager.sdbShell(_devid, removeSuite, 300)
- SdbManager.sdbShell(_devid, unInstSuite, 300)
- except DevNotFoundErr:
- self._sdb_recov(_devid)
- return False
- except Exception:
- return False
-
- def runPreTestScript(self, _devid):
- if self.pre_test:
- LOGGER.debug("run pre-test script: {}".format(self.pre_test))
- SdbManager.hostRecLiteCommand('bash {} {} {}'.format(self.pre_test, _devid, self.suiteName))
-
-
- def runPostTestScript(self, _devid):
- if self.post_test:
- LOGGER.debug("run post-test script: {}".format(self.post_test))
- SdbManager.hostRecLiteCommand('bash {} {} {}'.format(self.post_test, _devid, self.suiteName))
-
- def unInstallSuite(self, deviceId, remoteFolder):
- if self.tizenV.find("csharp") > -1 or self.tizenV.find("web") > -1 or deviceId is None:
- hostTmpFolder = Constants.LOCAL_SHELL_TEMP_PATH % deviceId
- self._unInstallSuiteInHost(deviceId, hostTmpFolder)
- else:
- self._unInstallSuiteInTarget(deviceId, remoteFolder)
-
- def sdbCheckSuite(self, _devid, suiteName):
- LOGGER.info("Entering checkSuiteExisted(String suiteName : %s)" \
- % suiteName)
- try:
- if self.tizenV and float(self.tizenV.split('_')[-1]) >= 3.0:
- rep_suiteName = suiteName.replace("tct-", "")
- host_check_cmd = "su - owner -c \"app_launcher -l | grep %s\"" \
- % rep_suiteName
- output = SdbManager.sdbShell(_devid, host_check_cmd)
- if output and output.find(rep_suiteName) > -1:
- return True
- else:
- return False
- else:
- check_cmd = "wrt-launcher -l | grep " + suiteName
- resultMsg = SdbManager.sdbShell(_devid, check_cmd)
- if resultMsg and len(resultMsg) > 0:
- return True
- else:
- return False
- except DevNotFoundErr:
- self._sdb_recov(_devid)
- return False
- except Exception:
- return False
-
-
-class ExecuteType:
- e_all = "All"
- e_auto = "Auto"
- e_manual = "Manual"
-
- currType = ""
-
- def __init__(self, extype):
- self.currType = extype
-
- @classmethod
- def createExecuteType(self, extype):
- executeType = None
- if self.e_all.lower() == extype.lower():
- executeType = ExecuteType(self.e_all)
- elif self.e_auto.lower() == extype.lower():
- executeType = ExecuteType(self.e_auto)
- elif self.e_manual.lower() == extype.lower():
- executeType = ExecuteType(self.e_manual)
-
- return executeType
-
- #return String
- def toLiteParam(self):
- if self.currType == self.e_auto:
- return " -A"
- elif self.currType == self.e_manual:
- return " -M"
- else:
- return ""
-
- #return String
- def getCurrType(self):
- return self.currType
+++ /dev/null
-#!/usr/bin/python
-
-import threading
-import time
-from .shellplanner import *
-from .result_summary import ResultSummary
-from .logmanager import LOGGER
-from .sdbmanager import SdbManager
-
-
-class PlanExecutor(threading.Thread):
- plan = None
- autoworker = None
- maualworker = None
- thCounter = ""
-
- #Param TctshellPlan
- def __init__(self, plan, threadCounter, isPreconSet, devmgr):
- LOGGER.debug("Creating PlanExecutor, with [plan]: " \
- + plan.getPlanName())
- self.plan = plan
- threading.Thread.__init__(self)
- self.name = plan.getPlanName()
- self.tcCounter = threadCounter
- self.threadLock = threading.Lock()
- self.isPreconSet = isPreconSet
- self.devmgr = devmgr
-
- def run(self):
- time.sleep(1)
- LOGGER.debug("Starting PlanExecutor")
-
- self.threadLock.acquire()
- self.checkWorkerStatus()
- LOGGER.debug("setStartTest()")
- self.setStartTest()
- self.threadLock.release()
-
- exeType = self.plan.getExecuteType()
- if exeType.getCurrType() == ExecuteType.e_auto:
- self.autoworker = AutoSuiteWorker(self.plan, self.devmgr)
- self.autoworker.auto_test()
-
- elif exeType.getCurrType() == ExecuteType.e_manual:
- self.manualworker = ManualSuiteWorker(self.plan)
- self.manualworker.manual_test()
-
- else:
- self.autoworker = AutoSuiteWorker(self.plan, self.devmgr)
- self.autoworker.auto_test()
-
- self.manualworker = ManualSuiteWorker(self.plan)
- self.manualworker.manual_test()
-
- SdbManager.exportDumpFiles(self.plan.getDeviceId(), \
- self.plan.getResultFolderPath() + "/dump/")
-
- summary = ResultSummary(plans=[self.plan])
- summary.genResults()
- summary.genSummary()
- self.setFinishedTest()
-
- def checkWorkerStatus(self):
- multiPlanIns = MultiRunnPlan.getInstance()
- while True:
- if multiPlanIns.isSelectedDevAvailable(self.plan):
- break
- else:
- time.sleep(5)
-
- def setStartTest(self):
- multiPlanIns = MultiRunnPlan.getInstance()
- multiPlanIns.setCurrPlanRunning(self.plan)
-
- def setFinishedTest(self):
- self.plan.setRunning(False)
- self.plan.setFinished()
-
-
-class AutoSuiteWorker:
- plan = None
-
- def __init__(self, plan, devmgr):
- self.plan = plan
- self.deviceId = self.plan.getDeviceId()
- self.devmgr = devmgr
-
- def auto_test(self):
- deviceId = self.deviceId
- suites = self.plan.getSuites()
- remTmpDir = self.plan.getDevTctTmpPath()
- resultFolder = self.plan.getResultFolderPath()
- isRerun = self.plan.isReRunning()
- stubPort = self.plan.getStubPort()
-
- for counter, suite in enumerate(suites):
- if not self._checkDeviceStatus():
- self._auto_test_inhost(suites[counter:])
- break
-
- if suite.getAutoNum() is None or int(suite.getAutoNum()) == 0:
- suite.setNoAuto()
- LOGGER.warning('Suite : %s , AutoNum : 0' \
- % (suite.getSuiteName()))
- continue
-
- if suite.checkExistSuiteFile() == False:
- LOGGER.error("The %s file Exist error" \
- % suite.getSuiteFullPath())
- continue
- suiteName = suite.getSuiteName()
- LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
-
- LOGGER.info('Checking if the suite ' + suiteName \
- + 'is installed already.')
- if suite.sdbCheckSuite(deviceId, suiteName):
- LOGGER.info('The suite ' + suiteName \
- + ' is existed. uninstalling')
- LOGGER.info('Uninstalling the existed suite ' + suiteName)
- suite.unInstallSuite(deviceId, remTmpDir)
-
- LOGGER.info('Uploading the suite ' + suiteName)
- LOGGER.info('Installing the suite ' + suiteName)
- suite.installSuite(deviceId, remTmpDir)
- LOGGER.info('Executing the suite ' + suiteName \
- + ' in testkit-lite.')
- suite.executePlanAuto(deviceId, resultFolder, \
- suite.getTestCase(), isRerun, stubPort)
-
- LOGGER.info('removing the suite pkg file of the suite ' \
- + suiteName)
- LOGGER.info('Uninstalling the suite ' + suiteName)
- suite.unInstallSuite(deviceId, remTmpDir)
-
- LOGGER.info("Finished to execute all auto test-cases")
-
- def _auto_test_inhost(self, suites):
- deviceId = None
- remTmpDir = self.plan.getDevTctTmpPath()
- resultFolder = self.plan.getResultFolderPath()
- isRerun = self.plan.isReRunning()
- stubPort = self.plan.getStubPort()
-
- for suite in suites:
- if suite.getAutoNum() is None or int(suite.getAutoNum()) == 0:
- suite.setNoAuto()
- LOGGER.warning('Suite : %s , AutoNum : 0' \
- % (suite.getSuiteName()))
- continue
-
- suiteName = suite.getSuiteName()
- LOGGER.info('Uploading the suite ' + suiteName)
- LOGGER.info('Installing the suite ' + suiteName)
- suite.installSuite(deviceId, remTmpDir)
- LOGGER.info('Executing the suite ' + suiteName \
- + ' in testkit-lite.')
- suite.executePlanAuto(deviceId, resultFolder, \
- suite.getTestCase(), isRerun, stubPort)
-
- LOGGER.info('removing the suite pkg file of the suite ' \
- + suiteName)
- LOGGER.info('Uninstalling the suite ' + suiteName)
- suite.unInstallSuite(deviceId, remTmpDir)
-
- LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
- LOGGER.info("Finished to execute auto suite: [%s]" % suiteName)
-
- def _checkDeviceStatus(self):
- time_waited = 0
- reboot_tried = False
- while True:
- if not self.devmgr.isDeviceAvailable(self.deviceId):
- if time_waited >= Constants.NO_WORKERS_TIMEOUT:
- LOGGER.error("Rebooting timeout device : %s" \
- % self.deviceId)
- return False
- if reboot_tried:
- waiting_time = 10
- else:
- waiting_time = Constants.RECOVERY_TIME
- LOGGER.error("Please reboot device : %s" % self.deviceId)
- time.sleep(waiting_time)
- time_waited += waiting_time
- reboot_tried = True
- else:
- break
- return True
-
-
-class ManualSuiteWorker:
- plan = None
-
- def __init__(self, plan):
- self.plan = plan
-
- def manual_test(self):
- deviceId = self.plan.getDeviceId()
- suites = self.plan.getSuites()
- resultFolder = self.plan.getResultFolderPath()
- remTmpDir = self.plan.getDevTctTmpPath()
- isRerun = self.plan.isReRunning()
- stubPort = self.plan.getStubPort()
- for suite in suites:
- if suite.getManualNum() is None or int(suite.getManualNum()) == 0:
- suite.setNoManual()
- LOGGER.warning('Suite : %s , ManualNum : 0' \
- % (suite.getSuiteName()))
- continue
- if suite.checkExistSuiteFile() == False:
- LOGGER.error("The %s file Exist error" % self.getSuiteFullPath)
- continue
- suiteName = suite.getSuiteName()
- LOGGER.debug("current suite Manual count : %s " \
- % suite.getManualNum())
-
- LOGGER.info('Checking if the suite ' + suiteName \
- + 'is installed already.')
- if suite.sdbCheckSuite(deviceId, suiteName):
- LOGGER.info('The suite ' + suiteName \
- + ' is existed. uninstalling')
- LOGGER.info('Uninstalling the existed suite ' + suiteName)
- suite.unInstallSuite(deviceId, remTmpDir)
-
- LOGGER.info('Uploading the suite ' + suiteName)
- LOGGER.info('Installing the suite ' + suiteName)
-
- suite.installSuite(deviceId, remTmpDir)
- LOGGER.info('Executing the suite ' + suiteName \
- + ' in testkit-lite.')
- suite.executePlanManual(deviceId, resultFolder, \
- suite.getTestCase(), isRerun, stubPort)
-
- LOGGER.info('removing the suite pkg file of the suite ' \
- + suiteName)
- LOGGER.info('Uninstalling the suite ' + suiteName)
- suite.unInstallSuite(deviceId, remTmpDir)
-
- LOGGER.info("Finished to execute all manual test-cases")
+++ /dev/null
-#!/usr/bin/python
-
-import os
-import sys
-import glob
-from optparse import *
-from .constants import Constants
-import xml.etree.ElementTree as etree
-from .shellplanner import ExecuteType
-from .devicemanager import DeviceManager
-from .logmanager import LOGGER
-
-
-#show all available suites
-def show_available_suites(option, opt_str, value, parser):
- LOGGER.info("Test Suites:...\n")
- repos = Constants.ALL_PROFILES
- repos.append('common')
- repos.append('common-iot')
- os.chdir(Constants.TCT_HOME)
- versions = sorted(glob.glob("tizen_*"))
- for ver in versions:
- LOGGER.info("version : %s" % ver)
- for tp in repos:
- LOGGER.info(" profile : %s" % tp)
- if not os.path.isdir(Constants.SUITES_REPOSITORY % (ver) + tp):
- continue
- os.chdir(Constants.SUITES_REPOSITORY % (ver) + tp)
- zips = sorted(glob.glob("*.zip"))
- for files in zips:
- #without ".zip"
- LOGGER.info(" %s" % files[:-4])
- sys.exit(1)
-
-
-def show_result_files():
- os.chdir(Constants.TCT_HOME)
- LOGGER.info("\n *Result Folder Absolute Path*")
- versions = sorted(glob.glob("tizen_*"))
- for ver in versions:
- if not os.path.isdir("/opt/tct/%s/shell/result/" % ver):
- continue
- os.chdir("/opt/tct/%s/shell/result/" % ver)
- buildids = sorted(glob.glob("*"))
- for buildid in buildids:
- if buildid == "latest" or buildid == "Untitled Folder":
- continue
- os.chdir(Constants.RESULT_REPO % (ver, buildid))
- results = sorted(glob.glob("*"))
- for result in results:
- os.chdir(Constants.RESULT_REPO % (ver, buildid))
- if not os.path.isdir(os.path.abspath(result)):
- continue
- LOGGER.info(" %s" % os.path.abspath(result))
-
- LOGGER.info('')
- sys.exit(1)
-
-
-def print_planfolder(option, opt_str, value, parser):
- LOGGER.info("Shell plan folder path : \'%s\'" % Constants.TCT_PLAN_FOLDER)
- ret = os.system("tree %s" % Constants.TCT_PLAN_FOLDER)
- if ret:
- LOGGER.error("The program \'tree\' is currently not installed. \
-You can install it by typing : apt-get install tree")
- sys.exit(1)
-
-
-def print_resultfolder(option, opt_str, value, parser):
- os.chdir(Constants.TCT_HOME)
- for tizenV in glob.glob("tizen_*"):
- resultFolder = (Constants.RESULT_REPO % (tizenV, ""))[:-1]
- if os.path.isdir(resultFolder):
- ret = os.system("tree -L 3 %s" % resultFolder)
- if ret:
- LOGGER.error("The program \'tree\' is currently not installed. \
-You can install it by typing : apt-get install tree")
-
- show_result_files()
- sys.exit(1)
-
-
-def invoke_sdb_devices(option, opt_str, value, parser):
- os.system(Constants.SDB_DEVICES)
- sys.exit(1)
-
-
-# version option
-def print_version(option, opt_str, value, parser):
- LOGGER.info("TCTSHELL Version : %s " % Constants.TCT_VERSION)
- sys.exit(0)
-
-
-def varnarg(option, opt_str, value, parser):
- """ parser srg"""
- value = []
- import re
- for arg in parser.rargs:
- if re.search('^--.+', arg) or re.search('^-[\D]', arg):
- break
- value.append(arg)
-
- del parser.rargs[:len(value)]
- setattr(parser.values, option.dest, value)
-
-
-class IntentionType:
- TestScenario = 0
- TestPlan = 1
- TestSuite = 2
- TestCase = 3
- AutoPlan = 4
- DistPlan = 5
- TestProfile = 6
-
-
-class ShellWrapper:
- def __init__(self, devmgr):
- self.devmgr = devmgr
- self.running_mode = None
- self.options = None
- self.USAGE = "\n\
- run examples: \n\
- tct-shell --scenario <smoewhere>/scenario.xml\n\
- tct-shell --testplan <somewhere>/testplan.xml\n\
- tct-shell --test package1 package2 ... packageN\n\
- tct-shell --test package1 --id caps_screenSizeNormal\n\
- tct-shell --rerun-fail '<somewhere>/result_folder/\n\
- \n\
- show examples: \n\
- tct-shell --help\n\
- tct-shell --plan-list\n\
- tct-shell --result-list\n\
- tct-shell --device-lite\n\
- tct-shell --all-suites\n\
- \n\
- Note: \n\
- 1) Proxy settings should be disabled when execute webapi packages\n\
- 2) run command 'tct-shell', it might not be able to locate related module, \n\
- run command 'export PYTHONPATH=/usr/lib/python2.7/site-packages' to resolve this issue"
-
- def print_usage(self):
- print (self.USAGE)
-
- def parse_options(self, argv):
- option_list = [
- make_option("--scenario", "-s", dest="scenario_file", \
- action="callback", callback=varnarg, \
- help="Specify the scenario.xml as the test plan."),
- make_option("--testplan", "-p", dest="testplan_file", \
- action="callback", callback=varnarg, \
- help="Specify the testplan.xml as the test plan."),
- make_option("--profile", "-f", dest="profile", action="callback", \
- callback=varnarg, help="Specify testing profile. [mobile,wearable,tv]"),
- make_option("--test", "-t", dest="suites", action="callback", \
- callback=varnarg, help="Specify testing suites. If more than one suite is provided, list them all and separate them with whitespace"),
- make_option("--id", dest="testcase_id", action="callback", \
- callback=varnarg, help="Specify the ID of a test case to run"),
- make_option("--rerun-fail", dest="fail_result_xml", \
- action="callback", callback=varnarg,
- help="Rerun all failed test cases, according to the specified XML."),
- make_option("--distribute", dest="dist_mode",action="callback", callback=varnarg, \
- help="Specify the testplan.xml for distributing a plan to multiple devices"),
- make_option("--all", "-A", dest="all_tc", action="store_true", \
- help="All test cases will be executed."),
- make_option("--manual", "-M", dest="only_manual", \
- action="store_true", help="Only manual test cases will be executed"),
- make_option("--tizen-version", dest="tizenversion", \
- action="callback", callback=varnarg, \
- help="Specify the name of tizen-version. The tizen-version is defined in the local repository. and its path is '/opt/tct/'"),
- make_option("--stub-port", dest="stubport", action="callback", \
- callback=varnarg, help="Specify a port number. Network port used by the testkit-stub"),
- make_option("--deviceid", "-d", dest="deviceid", \
- action="callback", callback=varnarg, \
- help="Set sdb device serial information."),
- make_option("--dbutedevid", dest="dbutedevid", action="callback", callback=varnarg, help="Set sdb device serial information for distribute mode"),
- make_option("--disable", dest="disable_preconfigure", action="store_false", default=True, help="disable the function of pre_configure"),
- make_option("--output", "-o", dest="resultfile", \
- action="callback", callback=varnarg,
- help="Specify the output file for result XML. If more than one test xml file provided, results will be merged into this outputfile"),
- make_option("--timeout", dest="run_timeout", action="callback", \
- callback=varnarg, help="Set the end time of test (unit : minute"),
- make_option("--skip-package", dest="skip_package", action="callback", \
- callback=varnarg, help="Specify the package names for exclude from the test"),
- make_option("--make-ne", dest="make_ne", action="callback", \
- callback=varnarg, help="Spectify the package names for make NE of results"),
- make_option("--skip-count", dest="skip_count", action="callback", \
- callback=varnarg, help="Specify the fail/block/na count. The test is terminated when the same skip-count value and fail/block/na count on the result"),
- make_option("--skip-tc", dest="skip_tc", action="callback", \
- callback=varnarg, help="Specify the testcase id for exclude from the test"),
- make_option("--version", dest="version_info", action="callback", \
- callback=print_version, help="Show version information"),
- make_option("--all-suites", dest="show_suites", \
- action="callback", callback=show_available_suites,
- help="Show all available test-suites in the local repository \'/opt/tct/\'"),
- make_option("--plan-list", dest="show_plan_folder", \
- action="callback", callback=print_planfolder,
- help="List all existed plans in the Plan directory. The plan directory is defined in the configuration file named CONFIG, and its path is :'/opt/tools/shell/CONFIG'"),
- make_option("--result-list", dest="show_all_result", \
- action="callback", callback=print_resultfolder,
- help="List all history results in the result directory. and its path is :'/opt/tct/{tizen-version}/shell/result/'"),
- make_option("--device-list", dest="show_all_device", \
- action="callback", callback=invoke_sdb_devices, \
- help="List all connected devices. just same with 'sdb devices'"),
- make_option("--log", "-l", dest="loglevel", action="callback", callback=varnarg,
- help="Set Log level. Logs that are less severe than the level will be ignored. Log levels (in descending severity order): [CRITICAL, ERROR, WARNING, NOTSET, INFO, DEBUG]"),
- make_option("--make-summary", dest="makesummary",\
- action="callback", callback=varnarg, help="Specify the result folder. When the test is not abnomally terminated. you can create summary file use to this option"),
- make_option("--tracking-dump", dest="trackingdump", action="callback", callback=varnarg,
- help="Specify the file(dump) names expected (for distribute run mode). After tracking the file(dump) generated by test and exits the tct-shell tool"),
- make_option("--pre-test", dest="pre_test", action="callback", \
- callback=varnarg, help="Before running suite, run a given script before installing testsuite."),
- make_option("--post-test", dest="post_test", action="callback", \
- callback=varnarg, help="After running suite, run a given script before uninstalling testsuite.")
- ]
-
- # detect non-params
- if len(argv) == 1:
- argv.append("--help")
-
- PARSERS = OptionParser(option_list=option_list, usage=self.USAGE)
- (self.options, args) = PARSERS.parse_args()
-
- #set log level (has to be done first to dislay logs)
- if self.check_log_level():
- if self.options.loglevel is None:
- LOGGER.setLevel(Constants.LOG_LEVELS[Constants.DEFAULT_LOG_LEVEL])
- else:
- LOGGER.setLevel(Constants.LOG_LEVELS[self.options.loglevel[0]])
-
- if self.is_dist_mode():
- conflicts = ["--distribute"]
- if self.options.deviceid is not None:
- conflicts.append("--deviceid")
- self.conflict_exit(conflicts)
- Constants.setDistMode(True)
-
- if self.is_testplan_mode():
- conflicts = ["--testplan"]
- if self.options.scenario_file is not None:
- conflicts.append("--scenario")
- if self.options.fail_result_xml is not None:
- conflicts.append("--rerun-fail")
- if self.options.profile is not None:
- conflicts.append("--profile")
- if self.options.suites is not None:
- conflicts.append("--test")
- if self.options.testcase_id is not None:
- conflicts.append("--id")
- self.conflict_exit(conflicts)
- self.running_mode = Constants.RUNNING_MODE_PLAN
-
- elif self.is_scenario_mode():
- conflicts = ["--scenario"]
- if self.options.dist_mode is not None:
- conflicts.append("--distribute")
- if self.options.fail_result_xml is not None:
- conflicts.append("--rerun-fail")
- if self.options.profile is not None:
- conflicts.append("--profile")
- if self.options.suites is not None:
- conflicts.append("--test")
- if self.options.testcase_id is not None:
- conflicts.append("--id")
- if self.options.deviceid is not None:
- conflicts.append("--deviceid")
- if self.options.makesummary is not None:
- conflicts.append("--make-summary")
- self.conflict_exit(conflicts)
- self.running_mode = Constants.RUNNING_MODE_SCEN
- Constants.setScenMode(True)
-
- elif self.is_fail_rerun_mode():
- conflicts = ["--rerun-fail"]
- if self.options.profile is not None:
- conflicts.append("--profile")
- if self.options.suites is not None:
- conflicts.append("--test")
- if self.options.testcase_id is not None:
- conflicts.append("--id")
- if self.options.makesummary is not None:
- conflicts.append("--make-summary")
- self.conflict_exit(conflicts)
- self.running_mode = Constants.RUNNING_MODE_RERUN
- Constants.setRerunMode(True)
- elif self.is_profile_mode():
- conflicts = ["--profile"]
- if self.options.suites is not None:
- conflicts.append("--test")
- if self.options.testcase_id is not None:
- conflicts.append("--id")
- self.conflict_exit(conflicts)
- self.running_mode = Constants.RUNNING_MODE_PROFILE
- elif self.is_suite_mode():
- conflicts = ["--test"]
- if self.options.profile is not None:
- conflicts.append("--profile")
- self.running_mode = Constants.RUNNING_MODE_SUITES
-
- if self.options.all_tc and self.options.only_manual:
- conflicts = ["--all", "--manual"]
- self.conflict_exit(conflicts)
-
- self.check_args_number()
- self.check_args_exist()
-
- if not self.options.tizenversion and not self.is_scenario_mode() and not self.is_fail_rerun_mode():
- LOGGER.error("The default tizen version could not be set.")
- conflicts = ["--tizen-version"]
- conflicts.append(None)
- self.conflict_exit(conflicts)
-
- def conflict_exit(self, conflicts):
- if conflicts == None or len(conflicts) <= 1:
- return
-
- os.system("tct-shell -h")
- LOGGER.error("\ntct-shell: Conflicted options: %s" % conflicts)
- raise
-
- def check_args_exist(self):
- opt = ""
- if self.running_mode == Constants.RUNNING_MODE_PLAN and len(self.options.testplan_file) > 0:
- if not Constants.checkFileExists(self.options.testplan_file[0]):
- opt = "--testplan"
- elif self.running_mode == Constants.RUNNING_MODE_SCEN and len(self.options.scenario_file) > 0:
- if not Constants.checkFileExists(self.options.scenario_file[0]):
- opt = "--scenario"
- elif self.running_mode == Constants.RUNNING_MODE_RERUN and len(self.options.fail_result_xml) > 0:
- if not Constants.checkFileExists(self.options.fail_result_xml[0]):
- opt = "--rerun-fail"
-
- if self.options.tizenversion and len(self.options.tizenversion) > 0:
- if not self.check_tizen_version():
- opt = "--tizen-version"
-
- if self.options.stubport and len(self.options.stubport) > 0:
- if not self.check_stub_port():
- opt = "--stub-port"
-
- if self.options.run_timeout and len(self.options.run_timeout) > 0:
- if not self.check_run_timeout():
- opt = "--timeout"
-
- if self.options.skip_package and len(self.options.skip_package) > 0:
- if not self.check_skip_package():
- opt = "--skip-package"
-
- if self.options.skip_count and len(self.options.skip_count) > 0:
- if not self.check_skip_count():
- opt = "--skip-count"
-
- if self.options.skip_tc and len(self.options.skip_tc) > 0:
- if not self.check_skip_tc():
- opt = "--skip-tc"
-
- if self.options.makesummary and len(self.options.makesummary) > 0:
- if not self.check_makesummary():
- opt = "--make-summary"
-
- if self.options.trackingdump and len(self.options.trackingdump) > 0:
- if not self.check_tracking_dump():
- opt = "--tracking-dump"
- if self.options.make_ne and len(self.options.make_ne) > 0:
- if not self.check_make_ne():
- opt = "--make-ne"
- if self.options.pre_test and len(self.options.pre_test) > 0:
- if not self.check_pre_test():
- opt = "--pre-test"
- if self.options.post_test and len(self.options.post_test) > 0:
- if not self.check_post_test():
- opt = "--post-test"
-
- if len(opt) > 0:
- os.system("tct-shell -h")
- LOGGER.error("\ntct-shell: error: \"%s\" option requires a proper argument" % opt)
- raise
-
- def check_args_number(self):
- opt = ""
- if self.running_mode == Constants.RUNNING_MODE_PLAN and len(self.options.testplan_file) < 1:
- opt = "--testplan"
- elif self.running_mode == Constants.RUNNING_MODE_SCEN and len(self.options.scenario_file) < 1:
- opt = "--scenario"
- elif self.running_mode == Constants.RUNNING_MODE_RERUN and len(self.options.fail_result_xml) < 1:
- opt = "--rerun-fail"
- elif self.running_mode == Constants.RUNNING_MODE_PROFILE and len(self.options.profile) < 1:
- opt = "--profile"
- elif self.running_mode == Constants.RUNNING_MODE_SUITES and len(self.options.suites) < 1:
- opt = "--test"
- elif self.options.deviceid is not None and len(self.options.deviceid) < 1:
- opt = "--deviceid"
- elif self.options.testcase_id is not None and len(self.options.testcase_id) < 1:
- opt = "--id"
- elif self.options.tizenversion is not None and len(self.options.tizenversion) < 1:
- opt = "--tizen-version"
- elif self.options.stubport is not None and len(self.options.stubport) < 1:
- opt = "--stub-port"
- elif self.options.run_timeout is not None and len(self.options.run_timeout) < 1:
- opt = "--timeout"
- elif self.options.skip_package is not None and len(self.options.skip_package) < 1:
- opt = "--skip-package"
- elif self.options.skip_count is not None and len(self.options.skip_count) < 1:
- opt = "--skip-count"
- elif self.options.skip_tc is not None and len(self.options.skip_tc) < 1:
- opt = "--skip-tc"
- elif self.options.makesummary is not None and len(self.options.makesummary) < 1:
- opt = "--make-summary"
- elif self.options.trackingdump is not None and len(self.options.trackingdump) < 1:
- opt = "--tracking-dump"
- elif self.options.make_ne is not None and len(self.options.make_ne) < 1:
- opt = "--make-ne"
-
- if len(opt) > 0:
- os.system("tct-shell -h")
- LOGGER.error("\ntct-shell: error: \"%s\" option requires an argument" % opt)
- raise
-
- def check_log_level(self):
- if self.options.loglevel is not None:
- if len(self.options.loglevel) < 1:
- os.system("tct-shell -h")
- LOGGER.error("\ntct-shell: error: \"--log\" option requires an argument")
- raise
- else:
- if not self.options.loglevel[0].upper() in ['NOTSET', 'CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG']:
- os.system("tct-shell -h")
- LOGGER.error("\ntct-shell: error: \"--log\" option requires a proper argument.")
- raise
-
- return True
-
- def check_tizen_version(self):
- tizenversion = self.options.tizenversion[0]
- if not Constants.checkFileExists(Constants.TCT_HOME + tizenversion):
- LOGGER.error("A required \'/opt/tct/" + tizenversion + "\' could not be found.")
- return False
- else:
- Constants.set_default_tizenV(tizenversion)
- return True
-
- def check_stub_port(self):
- port = self.options.stubport[0]
- portLen = len(port)
- return port.isdigit() and (portLen > 3 and portLen < 6)
-
- def check_run_timeout(self):
- timeout = self.options.run_timeout[0]
- timeoutLen = len(timeout)
- return timeout.isdigit() and timeoutLen > 0
-
- def check_skip_package(self):
- packages = self.options.skip_package[0]
- packLen = len(packages)
- return packLen > 0
-
- def check_skip_count(self):
- count = self.options.skip_count[0]
- countLen = len(count)
- return count.isdigit() and countLen > 0
-
- def check_skip_tc(self):
- tc = self.options.skip_tc[0]
- tcLen = len(tc)
- return tcLen > 0
-
- def check_tracking_dump(self):
- dump_names = self.options.trackingdump[0]
- dump_names_len = len(dump_names)
- return dump_names_len > 0
-
- def check_makesummary(self):
- return os.path.exists(self.options.makesummary[0])
-
- def check_make_ne(self):
- packages = self.options.make_ne[0]
- packLen = len(packages)
- return packLen > 0
-
- def check_pre_test(self):
- script = self.options.pre_test[0]
- return os.path.isfile(script)
-
- def check_post_test(self):
- script = self.options.post_test[0]
- return os.path.isfile(script)
-
- def getIntentionType(self):
- if self.options.scenario_file is not None:
- return IntentionType.TestScenario
- elif self.options.testplan_file is not None:
- return IntentionType.TestPlan
- elif self.options.testcase_id is not None:
- return IntentionType.TestCase
- elif self.options.suites is not None:
- return IntentionType.TestSuite
- elif self.options.profile is not None:
- return IntentionType.TestProfile
- return -1
-
- def get_scenfile(self):
- return self.options.scenario_file[0]
-
- def get_planfile(self):
- if self.is_testplan_mode():
- return self.options.testplan_file[0]
-
- def get_profile(self):
- return self.options.profile[0]
-
- def get_result_for_rerun(self):
- return self.options.fail_result_xml[0]
-
- def get_plan_name(self):
- plan_name = ""
- if self.is_testplan_mode():
- plan_name = os.path.basename(self.get_planfile())[:-4]
- return plan_name
-
- def get_scen_name(self):
- if self.is_scenario_mode():
- return os.path.basename(self.get_scenfile())[:-4]
-
- def get_stubPort(self):
- if self.options.stubport is None:
- return '8000'
- else:
- return self.options.stubport[0]
-
- def get_run_timeout(self):
- if self.options.run_timeout is None:
- return 1440 #24 hour
- else:
- return self.options.run_timeout[0]
-
- def get_makesummarydir(self):
- return self.options.makesummary[0]
-
- def get_resultFolderPath(self):
- if (self.options.resultfile is not None) and (self.options.resultfile[0] is not None):
- return self.options.resultfile[0]
-
- def get_deviceId(self):
- self.devmgr.loadDeviceList()
- devices = self.devmgr.getSdbDeviceList()
- if self.options.deviceid:
- for dev in devices:
- if dev.devId == self.options.deviceid[0]:
- return self.options.deviceid[0]
- LOGGER.error("Error! [%s] device is not connected" % self.options.deviceid[0])
- raise
- elif not self.is_scenario_mode() and not self.is_make_summary_mode():
- if len(devices) < 1:
- LOGGER.error("No device is connected")
- raise Exception('Device connection is required')
- if len(devices) == 1:
- LOGGER.info("Executing in device : %s" % devices[0].getDeviceId())
- return devices[0].getDeviceId()
- elif len(devices) > 1:
- LOGGER.info("Connected Devices: ...\n")
- for dev in devices:
- dev._printDevInfo()
- devId = input("Choose device id : ")
- while not devId in [dev.getDeviceId() for dev in devices]:
- devId = input("Invalid device id!\n\nChoose device id : \n")
- LOGGER.info("Executing in device : %s" % devId)
- return devId
-
- def get_profile_name(self):
- plan_file = None
- profile_name = None
- if self.is_testplan_mode():
- plan_file = self.get_planfile()
- if plan_file:
- tree = etree.parse(plan_file)
- root = tree.getroot()
- if root.get('profile') is not None:
- profile_name = root.get('profile')
- return profile_name
-
- def get_execute_type(self):
- exe_t = None
- if self.options.all_tc:
- exe_t = ExecuteType.createExecuteType("All")
- elif self.options.only_manual:
- exe_t = ExecuteType.createExecuteType("Manual")
- else:
- exe_t = ExecuteType.createExecuteType("Auto")
- return exe_t
-
- def get_tizenV(self):
- if (self.options.tizenversion is not None) and (self.options.tizenversion[0] is not None):
- return self.options.tizenversion[0]
-
- def _chooseProfile(self, path_suites):
- suite_profiles = {}
- for suite_path in path_suites:
- suite_zipname = os.path.basename(suite_path)
- sprofile = os.path.basename(os.path.dirname(suite_path))
- if not suite_zipname in suite_profiles:
- suite_profiles[suite_zipname] = []
- suite_profiles[suite_zipname].append(sprofile)
- for suiteName, suiteProfile in suite_profiles.items():
- suite_name = "-".join(suiteName[:-4].split("-")[:-1])
- if len(suiteProfile) == 1:
- suite_profiles[suiteName] = suiteProfile[0]
- continue
- LOGGER.info("Multiple profiles for [%s] :" % suite_name)
- for profile_i in suiteProfile:
- LOGGER.info(" - %s" % profile_i)
- suite_profile = None
- while not suite_profile in suiteProfile:
- suite_profile = input("\nChoose profile: ")
- suite_profiles[suiteName] = suite_profile
- return suite_profiles
-
- def get_suites(self):
- suites = []
- filtered_suites = []
- suite_repo = Constants.SUITES_REPOSITORY % self.get_tizenV()
- if self.options.suites:
- for suite_name in self.options.suites:
- for profiles in os.listdir(suite_repo):
- if profiles == "pkg_infos":
- continue
- for package in glob.glob(suite_repo + profiles + "/*.zip"):
- if package.find(suite_name) > -1:
- suites.append(package)
- if (len(suites) < 1):
- LOGGER.error("Error! [%s] suite does not exists" % suite_name)
-
- suite_profiles = self._chooseProfile(suites)
- check_profile = None
- multiProfiles = False
- for suiteName, suiteProfile in suite_profiles.items():
- if suiteProfile != 'common':
- if check_profile is not None and check_profile != suiteProfile:
- multiProfiles = True
- if check_profile is None:
- check_profile = suiteProfile
- filtered_suites.append(os.path.join(suite_repo, suiteProfile, suiteName))
- if multiProfiles:
- LOGGER.warning("WARNING: Multiple suites run with different profiles")
- return filtered_suites
-
- def get_profile_suites(self):
- suites = []
- suite_repo = Constants.SUITES_REPOSITORY % self.get_tizenV()
- sel_profile = self.get_profile()
- for profiles in os.listdir(suite_repo):
- if profiles == "pkg_infos":
- continue
- if profiles in sel_profile or profiles == "common":
- for package in sorted(glob.glob(suite_repo + profiles + "/*.zip")):
- suites.append(os.path.join(suite_repo, profiles, package))
-
- if len(suites) == 0:
- LOGGER.error('Not found test suites')
- return None
-
- return suites
-
- def get_testcase_id(self):
- tc_id = ""
- if self.options.testcase_id is not None:
- #tc_id = " --id %s" % self.options.testcase_id[0] + " --debug"
- tc_id = self.options.testcase_id[0]
- return tc_id
-
- def get_inst_suites(self):
- suites = []
- if self.options.instsuites:
- for suite_str in self.options.instsuites:
- suite_str_array = suite_str.split(" ")
- for suite_name in suite_str_array:
- suites.append(suite_name)
- return suites
-
- def get_uninst_suites(self):
- suites = []
- if self.options.uninstsuites:
- for suite_str in self.options.uninstsuites:
- suite_str_array = suite_str.split(" ")
- for suite_name in suite_str_array:
- suites.append(suite_name)
- return suites
-
- def get_running_mode(self):
- return self.running_mode
-
- def get_skip_package(self):
- if self.options.skip_package is not None:
- return self.options.skip_package
-
- def get_skip_count(self):
- if (self.options.skip_count is not None) and (self.options.skip_count[0] is not None):
- return self.options.skip_count[0]
-
- def get_skip_tc(self):
- if self.options.skip_tc is not None:
- return self.options.skip_tc
-
- def get_tracking_dump(self):
- if (self.options.trackingdump is not None) and (self.options.trackingdump[0] is not None):
- return self.options.trackingdump[0]
-
- def get_make_ne(self):
- if self.options.make_ne is not None:
- return self.options.make_ne
-
- def get_pre_test(self):
- if self.options.pre_test is not None:
- return self.options.pre_test[0]
-
- def get_post_test(self):
- if self.options.post_test is not None:
- return self.options.post_test[0]
-
- def is_testplan_mode(self):
- return self.options.testplan_file is not None
-
- def is_scenario_mode(self):
- return self.options.scenario_file is not None
-
- def is_profile_mode(self):
- return self.options.profile
-
- def is_single_mode(self):
- return self.options.testcase_id is not None
-
- def is_enable_preconf_func(self):
- return self.options.disable_preconfigure
-
- def is_update_portconf_func(self):
- return self.options.stubport is not None
-
- def is_suite_mode(self):
- return self.options.suites is not None
-
- def is_fail_rerun_mode(self):
- return self.options.fail_result_xml is not None
-
- def is_make_summary_mode(self):
- return self.options.makesummary is not None
-
- def is_dist_mode(self):
- return self.options.dist_mode is not None
-
- def get_output_param(self):
- return "-o %s" % self.get_output_file_name()
-
- def fetch_logs(self, executors):
- logs = {}
- for executor in executors:
- if executor.name == 'ResultManager':
- continue
- plan = executor.plan
- scenFolder = plan.getScenResultFolderPath()
- planFolder = plan.getResultFolderPath()
- if not scenFolder in logs:
- logs[scenFolder] = {}
- if not planFolder in logs[scenFolder]:
- logs[scenFolder][planFolder] = []
- logs[scenFolder][planFolder].append(\
- os.path.join(Constants.TCT_LOG_FOLDER, 'MainProcess.log'))
- logs[scenFolder][planFolder].append(\
- os.path.join(Constants.TCT_LOG_FOLDER, 'critical.log'))
- logs[scenFolder][planFolder].append(\
- os.path.join(Constants.TCT_LOG_FOLDER, 'debug.log'))
- logs[scenFolder][planFolder].append(\
- os.path.join(Constants.TCT_LOG_FOLDER, 'error.log'))
- logs[scenFolder][planFolder].append(\
- os.path.join(Constants.TCT_LOG_FOLDER, 'info.log'))
- logs[scenFolder][planFolder].append(\
- os.path.join(Constants.TCT_LOG_FOLDER, 'warning.log'))
-
- if hasattr(executor, 'all_dev_threads'):
- for autoPlanExecutor in executor.all_dev_threads:
- logs[scenFolder][planFolder].append(\
- os.path.join(Constants.TCT_LOG_FOLDER, '%s.log' % \
- autoPlanExecutor.name))
-
- logs[scenFolder][planFolder].append(\
- os.path.join(Constants.TCT_LOG_FOLDER, 'E_%s.log' % \
- autoPlanExecutor.name))
-
- for scenFolder, plan_logs in logs.items():
- for planFolder, thread_logs in plan_logs.items():
- for src_logs in thread_logs:
- Constants.move_log_file(src_logs, planFolder)
- if scenFolder is not None and os.path.isdir(scenFolder):
- Constants.move_log_file(src_logs, scenFolder)
- #Constants.move_log_file(os.path.join(Constants.TCT_LOG_FOLDER, 'ResultManager.log'), planFolder)
- #Constants.move_log_file(os.path.join(Constants.TCT_LOG_FOLDER, 'MainThread.log'), planFolder)
- if scenFolder is not None and os.path.isdir(scenFolder):
- pass
- #Constants.move_log_file(os.path.join(Constants.TCT_LOG_FOLDER, 'ResultManager.log'), scenFolder)
- #Constants.move_log_file(os.path.join(Constants.TCT_LOG_FOLDER, 'MainThread.log'), scenFolder)
-
-
- def getDbuteDevIds(self):
- return self.options.dbutedevid
-
- def get_distribute_count(self):
- if self.options.dist_mode and len(self.options.dist_mode) > 0:
- return self.options.dist_mode[0]
+++ /dev/null
-#!/usr/bin/python
-import os
-import configparser
-from multiprocessing import Process
-
-from .devicemanager import DeviceManager
-from .sdbmanager import SdbManager
-from .logmanager import LOGGER
-from .constants import Constants
-
-
-class TestEnvironment(Process):
-
- tizenVer = None
- deviceId = None
-
- def __init__(self, tizenVer, deviceId, isPreconSet, queue, devmgr):
- Process.__init__(self)
- self.tizenVer = tizenVer
- self.deviceId = deviceId
- self.name = "E_{}".format(deviceId)
- self.isPreconSet = isPreconSet
- self.queue = queue
- self.devmgr = devmgr
-
- def run(self):
- if not self.isPreconSet:
- SdbManager.sdbRootOn(self.deviceId)
- self._isDeviceReady()
- if self.isPreconSet:
- self._reset_health_res_indevice()
-
- if not self._isHealthCheckPassed():
- self.queue.put('Fail_Healthcheck')
- return
-
- if not self._isPreconfigPassed():
- self.queue.put('Fail_Preconfig')
- return
-
- if not self._extractDeviceCapability():
- self.queue.put('Fail_ExtractDeviceCapability')
- return
-
- #SdbManager.resetDumpFiles(self.deviceId)
-
- def _isDeviceReady(self):
- if self.deviceId:
- return self.devmgr.isDeviceAvailable(self.deviceId)
- else:
- if self.devmgr.getDeviceSize() == 1:
- return True
- else:
- LOGGER.error("No device is connected, \
- please check or try to reconnect it again")
- return False
-
- def _reset_health_res_indevice(self):
- tctDir = Constants.getDEVICE_SUITE_TARGET(self.tizenVer)
-
- delsuitedir_cmd = "rm -rf " + tctDir + "opt/*"
- deltmpdir_cmd = "rm -rf " + tctDir + "tmp/*"
-
- SdbManager.sdbShell(self.deviceId, delsuitedir_cmd)
- SdbManager.sdbShell(self.deviceId, deltmpdir_cmd)
-
- def _read_health_check_ini(self):
- parser = configparser.ConfigParser()
- if not os.path.exists(\
- Constants.HEALTH_CHECK_FILE_PATH % self.tizenVer):
- LOGGER.warning("Can`t find the healthcheck.ini file...")
- return
-
- parser.read(Constants.HEALTH_CHECK_FILE_PATH % self.tizenVer)
- for section in parser.sections():
- if not section:
- continue
- values = []
- for n, v in parser.items(section):
- values.append(v.split(","))
- return values
-
- def _isHealthCheckPassed(self):
- healtlist = self._read_health_check_ini()
- if not healtlist:
- return False
- for l in healtlist:
- if self.tizenVer.find("native") > -1 and l[1].find("tinyweb") > -1:
- continue
-
- getcap = ""
- if self.tizenVer.find("native") > -1 and l[1].find("getCap") > -1:
- getcap = "ngetCap"
- else:
- getcap = l[1].strip()
-
- command = "python " + \
- (Constants.DEVICE_HEALTH_CMD % self.tizenVer) \
- + " " + "--deviceid " + self.deviceId \
- + " --check" + " --procid=" + getcap
- try:
- outLog, errLog = SdbManager.sdbCommand(command, 180)
- except Exception as ex:
- LOGGER.error(str(ex))
- return False
- '''
- if exit_code is None:
- LOGGER.error("The device configuration \
- is not right [Health Check : %s]." % l)
- return False
- '''
- LOGGER.info(str(outLog))
- if str(outLog).find('#ERROR#') > -1 or \
- str(outLog).find('#WARNING#') > -1:
- LOGGER.error(l[0].strip() + ": fail")
- return False
- else:
- LOGGER.info(l[0].strip() + ": pass")
- LOGGER.info("Return From isHealthCheckPassed, return value : True")
- return True
-
- def _extractDeviceCapability(self):
- capa_file = Constants.LOCAL_CAPABILITY_PATH % self.deviceId
- LOGGER.debug('capability path : %s' % capa_file)
- if os.path.exists(capa_file):
- os.remove(capa_file)
-
- if not SdbManager.getCapabilityBack(self.deviceId, self.tizenVer):
- LOGGER.error('Fail to extract the capability.xml from device : ' \
- + Constants.getDEVICE_CAPABILITY_PATH(self.tizenVer))
- return False
-
- return True
-
- def _isPreconfigPassed(self):
- SdbManager.sdbPull(self.deviceId, \
- Constants.getPRE_CONF_DEVICE_INI(self.tizenVer), \
- Constants.PRE_CONF_HOST_INI % self.deviceId)
- if Constants.checkFileExists(\
- Constants.PRE_CONF_HOST_INI % self.deviceId) is False:
- LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
- % Constants.PRE_CONF_HOST_INI % self.deviceId)
- return False
-
- SdbManager.sdbPull(self.deviceId, \
- Constants.getPRE_CONF_DEVICE_JSON(self.tizenVer), \
- Constants.PRE_CONF_HOST_JSON % self.deviceId)
- if Constants.checkFileExists(\
- Constants.PRE_CONF_HOST_JSON % self.deviceId) is False:
- LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
- % Constants.PRE_CONF_HOST_JSON % self.deviceId)
- return False
-
- SdbManager.sdbPull(self.deviceId, \
- Constants.getPRE_CONF_DEVICE_XML(self.tizenVer), \
- Constants.PRE_CONF_HOST_XML % self.deviceId)
- if Constants.checkFileExists(\
- Constants.PRE_CONF_HOST_XML % self.deviceId) is False:
- LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
- % Constants.PRE_CONF_HOST_XML % self.deviceId)
- return False
-
- SdbManager.sdbPull(self.deviceId, \
- Constants.getPORT_CONF_DEVICE_JSON(self.tizenVer), \
- Constants.PORT_CONF_HOST_JSON % self.deviceId)
- if Constants.checkFileExists(\
- Constants.PORT_CONF_HOST_JSON % self.deviceId) is False:
- LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
- % Constants.PORT_CONF_HOST_JSON % self.deviceId)
- return False
-
- SdbManager.sdbPull(self.deviceId, \
- Constants.getDEVICE_BUILD_INFO_PATH(self.tizenVer), \
- Constants.LOCAL_BUILD_INFO_PATH % self.deviceId)
- if Constants.checkFileExists(Constants.LOCAL_BUILD_INFO_PATH % \
- self.deviceId) is False:
- LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
- % Constants.LOCAL_BUILD_INFO_PATH % self.deviceId)
- return False
-
- if self.tizenVer and self.tizenVer.find("native") > -1:
- SdbManager.sdbPull(self.deviceId, \
- Constants.getNAT_CONF_DEVICE_TXT(self.tizenVer), \
- Constants.NAT_CONF_HOST_TXT % self.deviceId)
- if Constants.checkFileExists(Constants.NAT_CONF_HOST_TXT \
- % self.deviceId) is False:
- LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
- % Constants.LOCAL_BUILD_INFO_PATH % self.deviceId)
- return False
-
- LOGGER.info("Return from isPreconfigPassed, return value : True")
- return True
+++ /dev/null
-#!/usr/bin/python
-import os
-import timeit
-from time import sleep
-tctshell_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-os.chdir(tctshell_path)
-
-plan_file = '/opt/tools/shell/plan/S_mobile_plan.xml'
-plan_file2 = '/opt/tools/shell/plan/2.4_mobileF.xml'
-
-start_plan = timeit.default_timer()
-os.system("./tct-shell -p %s --tizen-version tizen_web_2.4 -l DEBUG --disable" %plan_file2)
-stop_plan = timeit.default_timer()
-
-start_distribute = timeit.default_timer()
-os.system("./tct-shell --distribute %s --tizen-version tizen_web_2.4 -l DEBUG --disable" %plan_file2)
-stop_distribute = timeit.default_timer()
-
-start_autoplan = timeit.default_timer()
-#os.system('./tct-shell --autoplan %s --tizen-version tizen_web_2.4 -l DEBUG --disable' %plan_file2)
-stop_autoplan = timeit.default_timer()
-
-
-plan_time = stop_plan - start_plan
-autoplan_time = stop_autoplan - start_autoplan
-distribute_time = stop_distribute - start_distribute
-
-print "-"*50
-
-print "\nTest Plan Mode: %d\nAuto Plan Mode: %d\nDistribute Plan Mode: %d\n" %(plan_time, autoplan_time, distribute_time)
-
-print "-"*50
-
-
+++ /dev/null
-#!/usr/bin/python
-
-import os, sys
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from logmanager import LOGGER
-from devicemanager import DeviceManager
-
-class TestConstants:
-
- DEVICE_IDS = ['0000d81400006200', '0000d81b00006200', '00004e310000324d']
- CONN_DEVICE_ID = None
- TEST_TEMP_FOLDER = "/tempFiles/"
- TEST_SUITE_FILE = "tct-capability-tests-2.4.zip"
-
- @staticmethod
- def checkConnectedDevice():
- devIns = DeviceManager._getInstance()
- devIns._loadDeviceList()
-
- for devid in TestConstants.DEVICE_IDS:
- if devIns._isDeviceAvailable(devid) == True:
- TestConstants.CONN_DEVICE_ID = devid
- break
-
- if TestConstants.CONN_DEVICE_ID is None:
- sys.exit("not connect device")
- else:
- LOGGER.info("connected " + TestConstants.CONN_DEVICE_ID)
-
- @staticmethod
- def checkTestResourceFile():
- suiteFilePath = TestConstants.getAbsPath(TestConstants.TEST_TEMP_FOLDER \
- + TestConstants.TEST_SUITE_FILE)
- if os.path.exists(suiteFilePath):
- LOGGER.info("checked %s file" % suiteFilePath)
- else:
- LOGGER.error("The '%s' file exists error" % suiteFilePath)
-
- @staticmethod
- def getAbsPath(fileName):
- return os.path.dirname(os.path.abspath( __file__ )) + fileName
+++ /dev/null
-#!/usr/bin/python
-
-import os, sys
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from devicemanager import *
-
-class TestDeviceManager:
-
- def __init__(self):
-
-
-
+++ /dev/null
-import os, sys
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-import threading
-from logmanager import LOGGER
-
-class TestLogManager:
- def __init__(self):
- LOGGER.setLevel('DEBUG')
- self.thread1 = threading.Thread(target=self.thread_test, name="Sample_Thread_1")
- self.thread2 = threading.Thread(target=self.thread_test, name="Sample_Thread_1")
- self.thread3 = threading.Thread(target=self.thread_test, name="Sample_Thread_2")
-
- def thread_test(self):
- LOGGER.debug("thread starting")
- for i in range(10):
- LOGGER.debug("Counting from 0 to 9: %d" %i)
-
- def start_test(self):
- LOGGER.debug("Starting Main Test")
- self.thread1.start()
- self.thread1.join()
- self.thread2.start()
- self.thread3.start()
-
-if __name__ == "__main__":
- testLog = TestLogManager()
- testLog.start_test()
+++ /dev/null
-#!/usr/bin/python
-
-import os, sys
-import time
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from netstatmonitor import *
-
-class TestNetstatLogger:
-
- def __init__(self):
- print ''
-
-
-if __name__ == "__main__":
- print "====================== START TestNetstatLogger ========================"
- netins = NetstatMonitor('10.113.74.133:26101')
- netins.start()
- time.sleep(2)
- netins.waitThread()
- time.sleep(2)
- netins.restartThread()
- print "====================== FINISH TestNetstatLogger ========================"
+++ /dev/null
-#!/usr/bin/python
-import sys
-import os
-from Tkinter import *
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from gui.progress import Demo
-
-prog = Demo(Tk())
-prog.mainloop()
+++ /dev/null
-#!/usr/bin/python
-
-import os, sys
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from usbmonitor import UsbMonitor
-from devicemanager import DeviceManager
-
-class Testusbmonitor:
-
- def __init__(self):
- self.usbins = None
- self.devins = DeviceManager.getInstance()
- print ''
-
- def testThread(self):
- self.usbins = UsbMonitor()
- self.usbins.start()
-
- def killThread(self):
- self.usbins.finishThread()
-
-if __name__ == "__main__":
- ins = Testusbmonitor()
- ins.testThread()
- raw_input()
- ins.killThread()
+++ /dev/null
-#!/usr/bin/python
-
-import os
-import glob
-
-plan_name = 'plan_rerun_test'
-scen_name = 'scen_rerun_test'
-tizenVer = 'tizen_web_2.4'
-
-tctshell_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-os.chdir(tctshell_path)
-print tctshell_path
-rerun_only = None
-while not rerun_only in ['y', 'n']:
- rerun_only = raw_input("rerun_only? ")
-
-if rerun_only == 'n':
- os.system('./tct-plan-generator -m tct-capability-tests --tizen-version %s -o /opt/tools/shell/plan/%s.xml' %(tizenVer, plan_name))
-
- os.system('./tct-scen-generator -p %s,0000d81400006200,%s %s,0000d81b00006200,%s -o /opt/tools/shell/scen/%s.xml' %(plan_name, tizenVer, plan_name, tizenVer, scen_name))
-
- os.system('./tct-shell -s /opt/tools/shell/scen/%s.xml -l DEBUG' %scen_name)
-
- raw_input("Start rerun?")
-
-os.chdir('/opt/tct/%s/shell/result/Tizen-2.4.0_Mobile-TM1_20151015.2026' %tizenVer)
-
-for result in glob.glob("*%s*" %scen_name):
- _result = os.path.abspath(result)
- os.chdir(tctshell_path)
- os.system('./tct-shell --rerun-fail %s -l DEBUG' %_result)
- break
+++ /dev/null
-
-F_mobile_plan: /opt/tools/shell/plan/F_mobile_plan.xml
-
-auto_plan: 3113 seconds
-
-distribute_plan: 2850 seconds
-
-distribute_plan: 2648 seconds
-
--------------------------------------------------------
-
-2.4_mobileF: /opt/tct/tizen_web_2.4/manager/plan/2.4_mobileF.xml
-
-
-Test Plan Mode: 6757
-
-Distribute Plan Mode (3 devices) : 2384
-
--------------------------------------------------------
+++ /dev/null
-import os, sys
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from result_summary import ResultSummary
-from shellplanner import TctShellPlan, TctShellSuite, ExecuteType
-from logmanager import LOGGER
-
-LOGGER.setLevel("DEBUG")
-
-
-s1 = TctShellSuite('tct-3dtransforms-css3-tests' , '', '', '', '', '', '' ,'')
-s2 = TctShellSuite('tct-capability-tests' , '', '', '', '', '', '' ,'')
-s3 = TctShellSuite('tct-fonts-css3-tests' , '', '', '', '', '', '' ,'')
-s4 = TctShellSuite('tct-security-tcs-tests' , '', '', '', '', '', '' ,'')
-
-exe_t = ExecuteType.createExecuteType('Auto')
-
-p = TctShellPlan('tmp_name', '0000d85b00006200', 'prof', exe_t, [s1, s2, s3, s4], 'tizen_web_2.4', '/opt/tct/tizen_web_2.4/shell/result/Tizen-2.4.0_Mobile-TM1_20151015.2026/rerun_test_1#1_2016-02-12_21:13:23.364388')
-
-
-rs = ResultSummary([p])
-
-rs.genSummary()
-
-print p.getUnpass()
+++ /dev/null
-#!/usr/bin/python
-
-import os, sys
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from sdbmanager import SdbManager
-from logmanager import LOGGER
-from test_constants import TestConstants
-
-class TestSdbManager:
-
- def __init__(self):
- TestConstants.checkConnectedDevice()
- TestConstants.checkTestResourceFile()
-
- self.deviceId = TestConstants.CONN_DEVICE_ID
- self.suiteFilePath = TestConstants.getAbsPath(TestConstants.TEST_TEMP_FOLDER + \
- TestConstants.TEST_SUITE_FILE)
- self.suiteFile = TestConstants.TEST_SUITE_FILE
-
- def testSdbPush(self):
- local = self.suiteFilePath
- remote = '/opt/usr/media/tct/tmp/'
-
- SdbManager.sdbShell(self.deviceId, "rm -rf " + remote + self.suiteFile)
- SdbManager.sdbPush(self.deviceId, local, remote)
-
- def testSdbPull(self):
- self.testSdbPush()
-
- local = self.suiteFilePath + "-test"
- SdbManager.hostCommand("rm -rf " + local)
-
- remote = '/opt/usr/media/tct/tmp/' + self.suiteFile
- SdbManager.sdbPull(self.deviceId, remote, local)
-
- def testSdbShell(self):
- SdbManager.sdbShell(self.deviceId, 'ls -l')
-
- def testSdbRootOn(self):
- SdbManager.sdbRootOn(self.deviceId)
-
-if __name__ == "__main__":
- print "==================== START TestSDManager ====================="
- ins = TestSdbManager()
- ins.testSdbPush()
- ins.testSdbPull()
- ins.testSdbShell()
- ins. testSdbRootOn()
- print "==================== FINISH TestSDManager ====================="
-
+++ /dev/null
-#!/usr/bin/python
-
-import os, sys
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from shellplanner import *
-from test_constants import *
-
-class TestShellPlanner:
-
- def __init__(self):
- self.devId1 = '0000d81b00006200'
- self.devId2 = '0000d81400006200'
- self.devId3 = '00004e310000324d'
- self.devId4 = '0000d8f800006200'
-
- #return TctShellPlan
- def testInitShellPlan(self):
- suite1 = TctShellSuite('tct-capability-tests', None, 15,0, \
- 'common/tct-capability-tests-2.4.zip', 'WRTLauncher',\
- 'Compliance', 'tizen_web_2.4', 8000)
-
- '''
- suite2 = TctShellSuite('tct-alarm-tizen-tests', None, 60,0, \
- 'common/tct-alarm-tizen-tests-2.4.zip', 'WRTLauncher', \
- 'Tizen Web Device APIs', 'tizen_web_2.4', 8000)
-
- '''
- suites = [suite1]
-
- return TctShellPlan('testPlan1', self.devId2, 'mobile', ExecuteType('Auto'),suites, \
- 'tizen_web_2.4', '/opt/tct/tizen_web_2.4/shell/result/testresult/')
-
- def testInitShellPlan2(self):
- suite1 = TctShellSuite('tct-capability-tests', None, 15,0, \
- 'common/tct-capability-tests-2.4.zip', 'WRTLauncher',\
- 'Compliance', 'tizen_web_2.4', 8000)
-
- suite2 = TctShellSuite('tct-alarm-tizen-tests', None, 60,0, \
- 'common/tct-alarm-tizen-tests-2.4.zip', 'WRTLauncher', \
- 'Tizen Web Device APIs', 'tizen_web_2.4', 8000)
-
- suites = [suite1, suite2]
-
- return TctShellPlan('testPlan2', self.devId3, 'mobile', ExecuteType('Auto'),suites, \
- 'tizen_web_2.4', '/opt/tct/tizen_web_2.4/shell/result/testresult/')
-
-
- def testInitShellPlan3(self):
- suite1 = TctShellSuite('tct-capability-tests', None, 15,0, \
- 'common/tct-capability-tests-3.0.zip', 'WRTLauncher',\
- 'Compliance', 'tizen_web_3.0', 8000)
-
- suites = [suite1]
-
- return TctShellPlan('testPlan3', self.devId3, 'mobile', ExecuteType('Auto'),suites, \
- 'tizen_web_3.0', '/opt/tct/tizen_web_3.0/shell/result/testresult/')
-
- def testInitShellPlan4(self):
- suite1 = TctShellSuite('tct-capability-tests', None, 15,0, \
- 'common/tct-capability-tests-2.4.zip', 'WRTLauncher',\
- 'Compliance', 'tizen_web_2.4', 8000)
-
- suites = [suite1]
-
- return TctShellPlan('testPlan4', self.devId4, 'mobile', ExecuteType('Auto'),suites, \
- 'tizen_web_2.4', '/opt/tct/tizen_web_2.4/shell/result/testresult/')
-
-
- def testInstSuiteinHost(self):
- plan1 = self.testInitShellPlan3()
- suite = plan1.getSuites();
- #suite[0].installSuite(plan1.getDeviceId(), plan1.getDevTctTmpPath())
- suite[0].sdbCheckSuite(plan1.getDeviceId(), suite[0].getSuiteName())
- #suite[0].unInstallSuite(plan1.getDeviceId(), plan1.getDevTctTmpPath())
-
- def testInstSuiteinTarget(self):
- plan1 = self.testInitShellPlan4()
- suite = plan1.getSuites();
- suite[0].installSuite(plan1.getDeviceId(), plan1.getDevTctTmpPath())
- suite[0].sdbCheckSuite(plan1.getDeviceId(), suite[0].getSuiteName())
- suite[0].unInstallSuite(plan1.getDeviceId(), plan1.getDevTctTmpPath())
-
-
-if __name__ == "__main__":
- ins = TestShellPlanner()
- ins.testInstSuiteinHost()
- ins.testInstSuiteinTarget()
-
-
-
-
-
-
+++ /dev/null
-#!/usr/bin/python
-
-import os, sys
-import time
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from test_shellplanner import *
-from shellworker import *
-
-class TestShellWorker:
-
- def __init__(self):
- print ''
-
- def testInitPlanExecutor(self, plan, count):
- return PlanExecutor(plan, 1)
-
- def testRunPlanExecutor(self):
- planner = TestShellPlanner()
- plan1 = planner.testInitShellPlan()
- multiins = MultiRunnPlan._getInstance()
- multiins.addPlan(plan1.getPlanName(), plan1)
-
- exe1 = self.testInitPlanExecutor(plan1, 1)
- exe1.start()
-
- def testCheckRunningPlan(self):
- planner = TestShellPlanner()
- plan1 = planner.testInitShellPlan()
- plan2 = planner.testInitShellPlan2()
- multiins = MultiRunnPlan._getInstance()
- multiins.addPlan(plan1.getPlanName(), plan1)
- multiins.addPlan(plan2.getPlanName(), plan2)
-
- multiins.printRunnPlan()
- multiins.setCurrPlanRunning(plan1)
-
- multiins.printRunnPlan()
-
- def testGetRunnDevice(self):
- planner = TestShellPlanner()
- plan1 = planner.testInitShellPlan()
- plan2 = planner.testInitShellPlan2()
- multiins = MultiRunnPlan._getInstance()
- multiins.addPlan(plan1.getPlanName(), plan1)
- multiins.addPlan(plan2.getPlanName(), plan2)
-
- multiins.setCurrPlanRunning(plan1)
- print multiins.getRunnDevice()
-
- def testIsSelectedDevAvailable(self):
- planner = TestShellPlanner()
- plan1 = planner.testInitShellPlan()
- plan2 = planner.testInitShellPlan2()
- multiins = MultiRunnPlan._getInstance()
- multiins.addPlan(plan1.getPlanName(), plan1)
- multiins.addPlan(plan2.getPlanName(), plan2)
-
- multiins.setCurrPlanRunning(plan1)
- ins2 = MultiRunnPlan._getInstance()
- print ins2.isSelectedDevAvailable(plan2)
-
- def testCheckRecoveryDevice(self):
- planner = TestShellPlanner()
- ins = AutoSuiteWorker(planner)
- print ins.checkRecoveryDevice('10.113.74.133:26101')
-
-
-if __name__ == "__main__":
- ins = TestShellWorker()
-# ins.testRunPlanExecutor()
-# ins.testCheckRunningPlan()
-# ins.testGetRunnDevice()
-# ins.testIsSelectedDevAvailable()
- ins.testCheckRecoveryDevice()
-
-
+++ /dev/null
-#!/usr/bin/python
-
-import os, sys
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from new_shellwrapper import *
-
-wrapper = ShellWrapper()
-wrapper.parse_options(sys.argv)
+++ /dev/null
-#!/usr/bin/python
-
-import os, sys
-
-sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
-
-from usbmonitor import UsbMonitor
-
-class Testusbmonitor:
-
- def __init__(self):
- self.usbins = None
- print ''
-
- def testThread(self):
- self.usbins = UsbMonitor()
- self.usbins.start()
-
- def killThread(self):
- self.usbins.finishThread()
-
-if __name__ == "__main__":
- ins = Testusbmonitor()
- ins.testThread()
- raw_input()
- ins.killThread()
+++ /dev/null
-#!/usr/bin/python
-from result_summary import ResultSummary
-
-
-summary1 = ResultSummary("/opt/tct/tizen_web_2.4/manager/result/2016-01-12_15-10-43-526/tct-capability-tests.xml")
-summary1.unmarshal()
-'''
-try:
- summary1.unmarshal()
-except Exception, e:
- print "[ Error: reading suite result fail, error %s ]\n" % e
-'''
+++ /dev/null
-#!/usr/bin/python
-
-import threading
-import subprocess
-import time
-
-from .logmanager import LOGGER
-from .commodule.killall import killall
-from multiprocessing import Process
-
-
-#class UsbMonitor(threading.Thread):
-class UsbMonitor(Process):
- usb_cmd = 'tail -f /var/log/syslog | stdbuf -o0 grep usb'
- isStop = False
- LOGGER.setLevel('DEBUG')
-
- def __init__(self, devmgr):
- #threading.Thread.__init__(self)
- Process.__init__(self)
- self.daemon = True
- self.name = "UsbMonitor"
- self.devmgr = devmgr
- self.proc = subprocess.Popen(self.usb_cmd, shell=True, \
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-
- self.recovery_locks = {}
- self.curr_time = None
-
- def set_currsec(self):
- lt = time.localtime(time.time())
- self.curr_time = lt.tm_sec + (lt.tm_min * 60) + (lt.tm_hour * 3600)
-
- def run(self):
- LOGGER.debug("Starting UsbMonitor.......")
- self.set_currsec()
- while True:
- outs = self.proc.stdout.readline()
- if outs:
- outs = outs.strip().decode("utf-8")
- for outLog in outs.split('\n'):
- log_sp = outLog.split(' ')[2]
- time_sp = log_sp.split(':')
- tm_hour = int(time_sp[0])
- tm_min = int(time_sp[1])
- tm_sec = int(time_sp[2])
- time_sp = (tm_hour * 3600) + (tm_min * 60) + tm_sec
-
- if self.curr_time > time_sp:
- continue
-
- if self.isDisConnectUsb(outLog) or self.isConnectUsb(outLog):
- self.reLoadDeviceList()
-
- def reLoadDeviceList(self):
- time.sleep(3)
- ret = self.devmgr.loadDeviceList()
- if not ret:
- LOGGER.error('0 device is connected')
- else:
- for devId in self.recovery_locks.keys():
- if self.devmgr.isDeviceAvailable(devId):
- self.device_recovered(devId)
-
- def isDisConnectUsb(self, sysLog):
- if sysLog and sysLog.find('USB disconnect') > -1:
- LOGGER.error(sysLog)
- return True
- else:
- return False
-
- def isConnectUsb(self, sysLog):
- if sysLog.find('New USB device found') > -1:
- LOGGER.debug(sysLog)
- return True
- else:
- return False
-
- def setup_recovery(self, devId, lock):
- self.recovery_locks[devId] = lock
-
- def device_recovered(self, devId):
- try:
- self.recovery_locks[devId].put(1, block=False)
- except Exception as ex:
- LOGGER.debug(str(ex))
-
- def kill_usbmonitor(self):
- killall(self.proc.pid)
+++ /dev/null
-# -*- coding:utf-8 -*-
-import os
-import platform
-import shutil
-import stat
-import subprocess
-from optparse import OptionParser
-
-SDB_SERNO = "sdb"
-
-
-class CpFile:
- sep = os.sep
- TARGET_BASE_PATH = os.path.join(os.sep + "opt", "tools")
- TARGET_BASE_LITE = os.path.join(os.sep + "opt", "testkit")
-
- CURRENT_TARGET_BASE_PATH = ""
- CURRENT_TARGET_LITE_PATH = ""
- CURRENT_SOURCE_LITE_PATH = ""
-
- #monkey
- SOURCE_MONKEY_PATH = sep + "dev_event"
- TARGET_MONKEY_PATH = sep + "dev_event"
-
- #shell
- SOURCE_SHELL_PATH = sep + "shell"
- TARGET_SHELL_PATH = sep + "shell"
- #manager
- SOURCE_MANAGER_PATH = sep + "manager"
- TARGET_MANAGER_PATH = sep + "manager"
- #script
- SOURCE_SCRIPT_PATH = ""
- TARGET_SCRIPT_PATH = sep + "tools" + sep + "scripts"
- #testkit1.0
- SOURCE_TESTKIT_PATH1 = sep + "testkitlite1.0"
- TARGET_TESTKIT_PATH1 = sep + "lite2.4"
- #testkit2.0
- SOURCE_TESTKIT_PATH2 = sep + "testkitlite2.0"
- TARGET_TESTKIT_PATH2 = sep + "lite3.0"
- #plugin
- SOURCE_PLUGIN_PATH = sep + "plugin"
- TARGET_PLUGIN_PATH = sep + "plugin"
-
- def getCurrentOSBit(self):
- return platform.architecture()
-
- def setCurrentPath(self):
- self.CURRENT_SOURCE_BASE_PATH = os.getcwd() + self.sep
- self.CURRENT_TARGET_BASE_PATH = self.TARGET_BASE_PATH
- self.CURRENT_TARGET_LITE_PATH = self.TARGET_BASE_LITE
- print("current source base path =" + self.CURRENT_SOURCE_BASE_PATH)
- print("current target base path =" + self.CURRENT_TARGET_BASE_PATH)
-
- def cpSdb(self):
- osInfo = self.getCurrentOSBit()
- if (platform.system() == "Windows"):
- if (str(osInfo[0]).find("64") != -1):
- self.cpFile(
- self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + "sdb" + self.sep + "sdb-64.exe",
- self.CURRENT_TARGET_BASE_PATH + self.sep + "sdb.exe")
- if (str(osInfo[0]).find("32") != -1):
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + self.sep \
- + "sdb-32.exe", self.CURRENT_TARGET_BASE_PATH + \
- self.sep + "sdb.exe")
- else:
- '''
- # get status and output of the command
- status, output = commands.getstatusoutput('lsof | \
- grep /usr/bin/sdb')
- # merge continuing spaces to one
- collapsedOutput = ' '.join(output.split())
- # split words
- result = collapsedOutput.split(' ')
- # get the process id of the sdb
- if status is not 256 :
- # find the word sdb
- for x in range(0, result.__len__()):
- if (result[x] == "sdb"):
- break
- # get the process id of the sdb
- os.system('kill -9 ' + result[x+1])
- '''
- try:
- '''
- if(self.checkInstalledSdb()):
- print("sdb install is not required")
- return
-
- print("sdb install")
- '''
- if (str(osInfo[0]).find("64") != -1):
- self.cpFile(
- self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
- self.sep + "sdb-64",
- self.CURRENT_TARGET_BASE_PATH + self.sep + "sdb")
- self.cpFile(
- self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
- self.sep + "sdb-64",
- "/usr/bin/" + "sdb")
- if (str(osInfo[0]).find("32") != -1):
- self.cpFile(
- self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
- self.sep + "sdb-32",
- self.CURRENT_TARGET_BASE_PATH + self.sep + "sdb")
- self.cpFile(
- self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
- self.sep + "sdb-32",
- "/usr/bin/" + "sdb")
- os.system("chmod -R 777 /usr/bin/sdb")
- except:
- pass
-
- def get_cmd_result(self, command):
- p = subprocess.Popen(command,
- stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- return p.stdout.readline()
-
- def checkInstalledSdb(self):
- cmd = "sdb"
- installedVer = ""
- try:
- output = str(self.get_cmd_result(cmd).split('\n')[0])
- if output.find('Smart Development Bridge') > -1:
- installedVer = output.split(' ')[3]
- else:
- raise
- except:
- print("sdb is not installed")
- return False
-
- osInfo = self.getCurrentOSBit()
- if (str(osInfo[0]).find("32") != -1):
- cmd = "sdb/sdb-32"
- else:
- cmd = "sdb/sdb-64"
- toolVer = ""
- try:
- output = str(self.get_cmd_result(cmd).split('\n')[0])
- if output.find('Smart Development Bridge') > -1:
- toolVer = output.split(' ')[3]
- else:
- raise
- except:
- print("tool's sdb is not valid")
- return True
-
- print("installed sdb version : %s / tool's sdb version : %s" % (installedVer, toolVer))
- installedSplit = installedVer.split('.')
- toolSplit = toolVer.split('.')
- hit = 0
- for i in range(0, 3):
- if(int(installedSplit[i]) > int(toolSplit[i])):
- print("Higher version sdb is already installed : " + installedVer)
- return True
- if(int(installedSplit[i]) == int(toolSplit[i])):
- hit += 1
- continue
- if(int(installedSplit[i]) < int(toolSplit[i])):
- break
- if(hit==3):
- print("Same version sdb is already installed : " + installedVer)
- return True
-
- return False
-
- def cpOtherFiles(self):
- tct_mgr = "tct-mgr"
- tct_shell = "tct-shell"
- tct_monkey = "tct-monkey"
- testkit_lite1 = "testkit-lite1.0"
- testkit_lite2 = "testkit-lite2.0"
- tct_config = "TCT_CONFIG"
-
- if (platform.system() == "Windows"):
- tct_mgr = "tct-mgr.bat"
-
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + tct_mgr, self.CURRENT_TARGET_BASE_PATH + \
- self.sep + tct_mgr)
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + tct_shell, self.CURRENT_TARGET_BASE_PATH + \
- self.sep + tct_shell)
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + tct_monkey, self.CURRENT_TARGET_BASE_PATH + \
- self.sep + tct_monkey)
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + testkit_lite1, self.CURRENT_TARGET_BASE_PATH + \
- self.sep + testkit_lite1)
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + testkit_lite2, self.CURRENT_TARGET_BASE_PATH + \
- self.sep + testkit_lite2)
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
- self.sep + tct_config, self.CURRENT_TARGET_BASE_PATH + \
- self.sep + tct_config)
-
- def cpOtherFilesToBinDir(self):
- tct_mgr = "tct-mgr"
- tct_shell = "tct-shell"
- tct_monkey = "tct-monkey"
- testkit_lite1 = "testkit-lite1.0"
- testkit_lite2 = "testkit-lite2.0"
-
- if (platform.system() != "Windows"):
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + \
- tct_mgr, "/usr/bin/" + tct_mgr)
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + \
- tct_shell, "/usr/bin/" + tct_shell)
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + \
- tct_monkey, "/usr/bin/" + tct_monkey)
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + testkit_lite1,\
- "/usr/bin/" + testkit_lite1)
- self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
- self.SOURCE_SCRIPT_PATH + self.sep + testkit_lite2,\
- "/usr/bin/" + testkit_lite2)
-
- try:
- os.system("chmod -R 777 /usr/bin/" + tct_mgr)
- os.system("chmod -R 777 /usr/bin/" + tct_shell)
- os.system("chmod -R 777 /usr/bin/" + tct_monkey)
- os.system("chmod -R 777 /usr/bin/" + testkit_lite1)
- os.system("chmod -R 777 /usr/bin/" + testkit_lite2)
- os.system("chmod -R 777 /usr/bin/sdb")
- except:
- pass
-
- def cpTestKitLite(self):
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_TESTKIT_PATH1, \
- self.CURRENT_TARGET_LITE_PATH + self.TARGET_TESTKIT_PATH1, \
- "lite2.4")
- for r, d, f in os.walk(self.CURRENT_TARGET_LITE_PATH + \
- self.TARGET_TESTKIT_PATH1):
- if (platform.system() != "Windows"):
- os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
-
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_TESTKIT_PATH2,
- self.CURRENT_TARGET_LITE_PATH + self.TARGET_TESTKIT_PATH2, \
- "lite3.0")
- for r, d, f in os.walk(self.CURRENT_TARGET_LITE_PATH + \
- self.TARGET_TESTKIT_PATH2):
- if (platform.system() != "Windows"):
- os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
-
- def cpManager(self):
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_MANAGER_PATH,
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_MANAGER_PATH, \
- "manager")
- for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
- self.TARGET_MANAGER_PATH):
- if (platform.system() != "Windows"):
- os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
-
- def cpShell(self):
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SHELL_PATH,
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_SHELL_PATH, \
- "shell")
- for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
- self.TARGET_SHELL_PATH):
- if (platform.system() != "Windows"):
- os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
-
- def cpMonkey(self):
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_MONKEY_PATH, \
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_MONKEY_PATH, \
- "monkey")
- for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
- self.TARGET_MONKEY_PATH):
- if (platform.system() != "Windows"):
- os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
-
- def cpPlugin(self):
- self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_PLUGIN_PATH,
- self.CURRENT_TARGET_BASE_PATH + self.TARGET_PLUGIN_PATH, \
- "plugin")
- for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
- self.TARGET_PLUGIN_PATH):
- if (platform.system() != "Windows"):
- os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
-
- def cpFile(self, src, target):
- if (not os.path.isfile(src)):
- print(src + " is not a file")
- return
- path = os.path.dirname(target)
- if (not os.path.isdir(path)):
- os.makedirs(path)
- shutil.copyfile(src, target)
-
- def del_rw(self, action, name, exc):
- if (platform.system() != "Windows"):
- os.chmod(name, stat.S_IWRITE)
- os.remove(name)
-
- def cpDir(self, src, target, name):
- if (os.path.isdir(src) and not os.path.exists(target)):
- print("copy " + name + " dir start")
- shutil.copytree(src, target)
- print("copy " + name + " dir finish")
- else:
- if (not os.path.isdir(src)):
- print("source " + name + " path is not a dir")
- if (os.path.exists(target)):
- print ("target " + name + " path is exists")
- try:
- shutil.rmtree(target, onerror=self.del_rw)
- except Exception, data:
- print Exception, ":", data
-
- print ("target " + name + " dir destroyed")
- try:
- shutil.copytree(src, target)
- except Exception, data:
- print Exception, ":", data
- print("copy " + name + " dir finish")
-
- def clear(self):
- self.setCurrentPath()
- try:
- shutil.rmtree(self.CURRENT_TARGET_BASE_PATH, onerror=self.del_rw)
- except Exception, data:
- print Exception, ":", data
-
- def cp(self):
- self.setCurrentPath()
- self.cpShell()
- self.cpManager()
- self.cpMonkey()
- self.cpOtherFiles()
- self.cpTestKitLite()
- self.cpPlugin()
- self.cpOtherFilesToBinDir()
- self.cpSdb()
-
-parser = OptionParser()
-parser.add_option("-i", "--install", dest="install", action="store_true", \
- default=False, help="copy folders and file into os")
-parser.add_option("-p", "--purge", dest="clear", action="store_true", \
- default=False, help="clear all files")
-
-(options, args) = parser.parse_args()
-if (options.install):
- test = CpFile()
- test.cp()
-elif(options.clear):
- test = CpFile()
- test.clear()
-else:
- test = CpFile()
- test.cp()
+++ /dev/null
-#!/bin/bash
-
-THE_CLASSPATH=
-for i in `ls /opt/tools/manager/lib/*.jar`
-do
- THE_CLASSPATH=${THE_CLASSPATH}:${i}
-done
-
-java -cp ${THE_CLASSPATH} org.tizen.tct.tool.mgr.TctGui "${@}"
-
+++ /dev/null
-@echo off
-Setlocal EnableDelayedExpansion
-
-set classpath=
-for %%f in (/opt/tools/manager/lib/*.jar) do set classpath=!classpath!;/opt/tools/manager/lib/%%f
-
-echo ==================================================================================
-echo java_classpath = %classpath%
-java -cp %classpath% org.tizen.tct.tool.mgr.TctGui
-echo ==================================================================================
\ No newline at end of file
+++ /dev/null
-#!/bin/bash
-
-python /opt/tools/dev_event/tct-monkey "${@}"
+++ /dev/null
-#!/bin/bash
-
-python3 /opt/tools/shell/tct-shell "${@}"
+++ /dev/null
-#!/bin/bash
-
-python /opt/testkit/lite2.4/testkit-lite "${@}"
+++ /dev/null
-#!/bin/bash
-
-python /opt/testkit/lite3.0/testkit-lite "${@}"
+++ /dev/null
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+++ /dev/null
-Dependency:
-=================
-python2.7 python-pip requests
-
- sudo apt-get install python-pip
- sudo pip install requests
-
-How to build:
-=================
- Build from source code:
- sudo python setup.py build
-
-How to install:
-=================
- Install testkit lite from source code:
- sudo python setup.py install
-
-How to use:
-=================
- At first, install a test package or prepare one tests.xml file aligned with schema files: /opt/testkit/lite/xsd/testdefinition-syntax.xsd.
-
- And then,
- 1) You can run case on target:
- For web test cases:
- testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>'
- For native test cases:
- testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"
-
- 2) You can run case in single mode :
- For web test cases:
- testkit-lite -f "<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>' --comm localhost
- For native test cases:
- testkit-lite -f "<somewhere>/<package_name>/tests.xml" --comm localhost
-
- 3) You can select on parser engine to simply conduct one or more tests.xml on target:
- testkit-lite -f device:"<somewhere>/<package_name1>/tests.xml ... <somewhere>/<package_namen>/tests.xml" -e 'WRTLauncher <package_name1> ... <package_namen>'
-
- 4) If you want to execute both auto and manual tests:
- testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"
-
- 5) If you just want to execute manual tests:
- testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -M
-
- 6) If you just want to execute auto tests:
- testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -A
-
- 7) If you want to save test result to another file, by default it'll be under /opt/testkit/lite/latest:
- testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -o <somewhere>/xxx.xml
-
- 8) If you want to choose some filters:
- testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --status level1 --type type1 ...
-
- 9) If you want to run test according capability:
- testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --capability capability.xml
-
- 10) At last, you can freely compose the above parameters together:
- testkit-lite -f <somewhere1>/tests.xml <somewhere2>/tests.xml -A --priority P1 --type type1 ...
-
-Get Results:
-=================
-
- Test report will be generated as tests.result.xml
- The result will be under /opt/testkit/lite/latest after execution, you can also check the history results in /opt/testkit/lite/yyyy-mm-dd-HH:MM:SS.NNNNNN.
-
-View Results:
-=================
-
-Test report can be viewed in HTML format, so the data in the xml result file looks more human friendly.
-
-Please follow the following steps to view test report:
- 1) copy files: application.js back_top.png jquery.min.js testresult.xsl tests.css under directory /opt/testkit/lite/xsd/
- 2) put the files from step 1) under the same directory as the xml result file
- 3) open xml result file with a web browser(IE, Chrome or Firefox)
-
-Known Issues:
-=================
-N/A
+++ /dev/null
-[public_version]
-version=TESTKIT1_3.0
-[internal_version]
-version=TESTKIT1_3.0.1-151106
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Yuanyuan,Zou <zouyuanx@intel.com>
-
-
-SUBDIRS = impl
-
-commoduledir = /usr/lib/python2.7/dist-packages/commodule
-dist_commodule_SCRIPTS = *.py
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Liu,chengtao <chengtaox.liu@intel.com>
-""" The shell command executor module"""
-
-import os
-import sys
-import time
-import subprocess
-from datetime import datetime
-
-from .killall import killall
-from .str2 import str2str
-
-
-def shell_command(cmd, timeout=15):
- """shell communication for quick return in sync mode"""
- proc = subprocess.Popen(cmd,
- shell=True,
- bufsize=0,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- stdin=subprocess.PIPE)
- time_cnt = 0
- exit_code = None
- while time_cnt < timeout:
- exit_code = proc.poll()
- if not exit_code is None:
- break
- time_cnt += 0.2
- time.sleep(0.2)
-
- if exit_code is None:
- killall(proc.pid)
- exit_code = -1
- result = []
- else:
- result = proc.stdout.readlines() or proc.stderr.readlines()
- return [exit_code, result]
-
-
-def shell_command_ext(cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None):
- """shell executor, return [exitcode, stdout/stderr]
- timeout: None means unlimited timeout
- boutput: specify whether print output during the command running
- """
- cmd_open = subprocess.Popen(args=cmd,
- shell=True,
- bufsize=0,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE,
- stdin=subprocess.PIPE)
-
- while True:
- exit_code = cmd_open.poll()
- if exit_code is not None:
- break
- if timeout is not None:
- timeout -= 0.1
- if timeout <= 0:
- try:
- exit_code = "timeout"
- cmd_open.terminate()
- time.sleep(5)
- except OSError:
- killall(cmd_open.pid)
- break
- time.sleep(0.1)
-
- stdout_log = str2str(cmd_open.stdout.read())
- stderr_log = str2str(cmd_open.stderr.read())
- if 'returncode=' in stdout_log:
- index = stdout_log.find('returncode=') + 11
- exit_code = str(stdout_log[index:]).strip('\r\n')
- stdout_log = '<![CDATA[' + stdout_log + ']]>'
- stderr_log = '<![CDATA[' + stderr_log + ']]>'
-
- return [exit_code, stdout_log, stderr_log]
+++ /dev/null
-#!/usr/bin/python
-#
-# Copyright (C) 2013 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,Boston, MA 02110-1301,USA.
-#
-# Authors:
-# Liu,chengtao <chengtaox.liu@intel.com>
-"""Test connector for test instance and target instance"""
-
-from .log import LOGGER
-
-
-class Connector:
-
- """Communication module for test host and test remote"""
-
- def __init__(self, config):
- self.conn = None
- if "testmode" in config:
- try:
- exec "from impl.%s import get_target_conn" % config[
- "testmode"]
- device_no = config.get('deviceid', None)
- if device_no is not None:
- self.conn = get_target_conn(device_no)
- else:
- self.conn = get_target_conn()
- except Exception as error:
- LOGGER.error("[Error: Failed to initilize com-module,"
- " exception: % s]\n" % error)
-
- def get_connector(self):
- """list the handler instance"""
- return self.conn
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Liu,chengtao <chengtaox.liu@intel.com>
-""" The http request process module"""
-
-import requests
-import json
-
-
-def get_url(baseurl, api):
- """get full url string"""
- return "%s%s" % (baseurl, api)
-
-
-def http_request(url, rtype="POST", data=None, time_out=10):
- """
- http request to the device http server
- """
- result = None
- if rtype == "POST":
- headers = {'content-type': 'application/json'}
- try:
- ret = requests.post(url, data=json.dumps(
- data), headers=headers, timeout=time_out)
-
- if ret:
- result = ret.json()
- except Exception as error:
- pass
- elif rtype == "GET":
- try:
- ret = requests.get(url, params=data, timeout=time_out)
- if ret:
- result = ret.json()
- except Exception as error:
- pass
- return result
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Yuanyuan,Zou <zouyuanx@intel.com>
-
-
-commoduleimpldir = /usr/lib/python2.7/dist-packages/commodule/impl
-dist_commoduleimpl_SCRIPTS = *.py
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Liu,chengtao <chengtaox.liu@intel.com>
-
-""" The implementation of local host communication"""
-
-import os
-import time
-import socket
-import re
-from shutil import copyfile
-
-from commodule.log import LOGGER
-from commodule.autoexec import shell_command, shell_command_ext
-
-
-HOST_NS = "127.0.0.1"
-os.environ['no_proxy'] = HOST_NS
-APP_QUERY_STR = "ps aux | grep %s | grep -v grep"
-
-
-class LocalHost:
-
- """ Implementation for transfer data
- between Host and Tizen PC
- """
-
- def __init__(self):
- self.deviceid = "localhost"
-
- def shell_cmd(self, cmd="", timeout=15):
- return shell_command(cmd, timeout)
-
- def check_process(self, process_name):
- exit_code, ret = shell_command(APP_QUERY_STR % process_name)
- return len(ret)
-
- def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
- cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
- exit_code, ret = self.shell_cmd(cmdline)
- time.sleep(2)
-
- def check_widget_process(self, wgt_name):
- return True
-
- def shell_cmd_ext(self,
- cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None):
- return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
-
- def get_device_ids(self):
- """
- get device list of ids
- """
- return ['localhost']
-
- def get_device_info(self):
- """
- get tizen device inforamtion
- """
- device_info = {}
- device_info["device_id"] = self.deviceid
- device_info["resolution"] = "N/A"
- device_info["screen_size"] = "N/A"
- device_info["device_model"] = "N/A"
- device_info["device_name"] = "N/A"
- device_info["os_version"] = "N/A"
- device_info["build_id"] = "N/A"
- return device_info
-
- def get_server_url(self, remote_port="8000"):
- """get server url"""
- url_forward = "http://%s:%s" % (HOST_NS, remote_port)
- return url_forward
-
- def install_package(self, pkgpath):
- """
- install a package on tizen device
- """
- cmd = "rpm -ivh %s" % pkgpath
- exit_code, ret = shell_command(cmd)
- return ret
-
- def get_installed_package(self):
- """get list of installed package from device"""
- cmd = "rpm -qa | grep tct"
- exit_code, ret = shell_command(cmd)
- return ret
-
- def download_file(self, remote_path, local_path):
- """download file"""
- # copyfile(remote_path, local_path)
- # return True
- return False
-
- def upload_file(self, remote_path, local_path):
- """upload file"""
- # copyfile(local_path, remote_path)
- return False
-
- def get_launcher_opt(self, test_launcher, test_suite, test_set, fuzzy_match, auto_iu):
- """get test option dict """
- test_opt = {}
- test_opt["suite_name"] = test_suite
- test_opt["launcher"] = test_launcher
- test_opt["test_app_id"] = test_launcher
- return test_opt
-
- def launch_app(self, wgt_name):
- exit_code, ret = shell_command(wgt_name + '&')
- return True
-
- def kill_app(self, wgt_name):
- return True
-
- def start_debug(self, dlogfile):
- pass
-
- def stop_debug(self):
- pass
-
-
-def get_target_conn():
- """ Get connection for Test Target"""
- return LocalHost()
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston,
-# MA 02110-1301, USA.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-
-""" The implementation of TIZEN mobile communication"""
-
-import os
-import time
-import socket
-import threading
-import re
-import shutil
-import ConfigParser
-import platform
-import xml.etree.ElementTree as etree
-
-from commodule.log import LOGGER
-from commodule.autoexec import shell_command, shell_command_ext
-from commodule.killall import killall
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = ConfigParser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
-DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-
-LOCAL_HOST_NS = "127.0.0.1"
-RPM_INSTALL = "sdb -s %s shell rpm -ivh %s"
-RPM_UNINSTALL = "sdb -s %s shell rpm -e %s"
-RPM_LIST = "sdb -s %s shell \"rpm -qa|grep tct\""
-APP_QUERY_STR = "sdb -s %s shell \"ps aux|grep '%s'|grep -v grep\"|awk '{print $2}'"
-APP_KILL_STR = "sdb -s %s shell kill -9 %s"
-WRT_QUERY_STR = "sdb -s %s shell wrt-launcher -l | grep '%s'|awk '{print $2\":\"$NF}'"
-WRT_START_STR = "sdb -s %s shell 'wrt-launcher -s %s; echo returncode=$?'"
-WRT_STOP_STR = "sdb -s %s shell wrt-launcher -k %s"
-WRT_INSTALL_STR = "sdb -s %s shell pkgcmd -i -t wgt -q -p %s"
-WRT_UNINSTL_STR = "sdb -s %s shell pkgcmd -u -t wgt -q -n %s"
-WRT_SMOCK_STR = "sdb -s %s shell 'echo \"%s sdbd rw\" | smackload'"
-WRT_SMOCK_REV_STR = "sdb -s %s shell 'echo \"sdbd %s rw\" | smackload'"
-WRT_LOCATION = os.path.join(DEVICE_SUITE_TARGET_24, "tct/opt/%s/%s.wgt")
-DLOG_CLEAR = "sdb -s %s shell dlogutil -c"
-DLOG_WRT = "sdb -s %s shell dlogutil -v threadtime"
-
-SDB_COMMAND_RTN = "sdb -s %s shell '%s; echo returncode=$?'"
-
-# redefine constants for windows
-if platform.system() == "Windows":
- WRT_START_STR = 'sdb -s %s shell "wrt-launcher -s %s; echo returncode=$?"'
- SDB_COMMAND_RTN = 'sdb -s %s shell "%s; echo returncode=$?"'
-
-def debug_trace(cmdline, logfile):
- global debug_flag, metux
- wbuffile = file(logfile, "w")
- import subprocess
- exit_code = None
- proc = subprocess.Popen(args=cmdline,
- shell=True,
- stdout=wbuffile,
- stderr=None)
- while True:
- exit_code = proc.poll()
- if exit_code is not None:
- break
- time.sleep(0.5)
- metux.acquire()
- proc_flag = debug_flag
- metux.release()
- if not proc_flag:
- break
- wbuffile.close()
- if exit_code is None:
- killall(proc.pid)
-
-
-def _get_device_ids():
- """get tizen device list of ids"""
- result = []
- exit_code, ret = shell_command("sdb devices")
- for line in ret:
- if str.find(line, "\tdevice") != -1:
- result.append(line.split("\t")[0])
- return result
-
-
-class TizenMobile:
-
- """
- Implementation for transfer data
- between Host and Tizen Mobile Device
- """
-
- def __init__(self, device_id=None):
- self.deviceid = device_id
- self.is_NE = 0
- if self.deviceid and self.deviceid.find('NE') > -1:
- self.is_NE = int(self.deviceid.split(':')[1].split('_')[0])
- self.deviceid = self.deviceid.split('_')[1]
-
- self._wrt = False
-
- def is_NE_mode(self):
- return self.is_NE
-
- def get_devid(self):
- return self.deviceid
-
- def shell_cmd(self, cmd="", timeout=15):
- cmdline = "sdb -s %s shell \"%s\" " % (self.deviceid, cmd)
- return shell_command(cmdline, timeout)
-
- def check_process(self, process_name):
- exit_code, ret = shell_command(
- APP_QUERY_STR % (self.deviceid, process_name))
- return len(ret)
-
- def launch_stub(self, stub_app, stub_port, debug_opt=""):
- cmdline = "/opt/home/developer/%s --port:%s %s; sleep 2s" \
- % (stub_app, stub_port, debug_opt)
- exit_code, ret = self.shell_cmd(cmdline)
- time.sleep(2)
-
- def shell_cmd_ext(self,
- cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None):
-
- cmdline = SDB_COMMAND_RTN % (
- self.deviceid, cmd)
- return shell_command_ext(cmdline, timeout, boutput, \
- stdout_file, stderr_file)
-
- def get_device_info(self):
- """get tizen device inforamtion"""
- device_info = {}
- resolution_str = ""
- screen_size_str = ""
- device_model_str = ""
- device_name_str = ""
- build_id_str = ""
- os_version_str = ""
-
- # get resolution and screen size
- exit_code, ret = shell_command(
- "sdb -s %s shell xrandr" % self.deviceid)
- pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
- for line in ret:
- match = pattern.search(line)
- if match:
- resolution_str = "%s x %s" % (match.group(1), match.group(2))
- screen_size_str = "%s x %s" % (match.group(3), match.group(4))
-
- # get architecture
- exit_code, ret = shell_command(
- "sdb -s %s shell uname -m" % self.deviceid)
- if len(ret) > 0:
- device_model_str = ret[0]
-
- # get hostname
- exit_code, ret = shell_command(
- "sdb -s %s shell uname -n" % self.deviceid)
- if len(ret) > 0:
- device_name_str = ret[0]
-
- # get os version
- exit_code, ret = shell_command(
- "sdb -s %s shell cat /etc/issue" % self.deviceid)
- for line in ret:
- if len(line) > 1:
- os_version_str = "%s %s" % (os_version_str, line)
-
- # get build id
- exit_code, ret = shell_command(
- "sdb -s %s shell cat /etc/os-release" % self.deviceid)
- for line in ret:
- if line.find("BUILD_ID=") != -1:
- build_id_str = line.split('=')[1].strip('\"\r\n')
-
- os_version_str = os_version_str[0:-1]
-
- device_info["device_id"] = self.deviceid
- device_info["resolution"] = resolution_str
- device_info["screen_size"] = screen_size_str
- device_info["device_model"] = device_model_str
- device_info["device_name"] = device_name_str
- device_info["os_version"] = os_version_str
- device_info["build_id"] = build_id_str
- return device_info
-
- def get_buildinfo(self, _tizenV):
- """ get builf info"""
- device_file = ""
- if _tizenV and _tizenV.find("3.0") > -1:
- device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
- elif _tizenV and _tizenV.find("4.0") > -1:
- device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
- elif _tizenV and _tizenV.find("5.0") > -1:
- device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
- elif _tizenV and _tizenV.find("5.5") > -1:
- device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
- else:
- device_file = DEVICE_SUITE_TARGET_24 + '/Documents/tct/buildinfo.xml'
-
- builfinfo_file = '/opt/testkit/lite2.4/' + self.deviceid + '/buildinfo.xml'
- build_info = {}
- build_info['buildid'] = ''
- build_info['manufacturer'] = ''
- build_info['model'] = ''
-
- if self.download_file(device_file, builfinfo_file) \
- and os.path.exists(builfinfo_file):
- root = etree.parse(builfinfo_file).getroot()
- for element in root.findall("buildinfo"):
- if element is not None:
- if element.get("name").lower() == 'buildversion':
- child = etree.Element.getchildren(element)
- if child and child[0].text:
- buildid = child[0].text
- build_info['buildid'] = buildid
- if element.get("name").lower() == 'manufacturer':
- child = etree.Element.getchildren(element)
- if child and child[0].text:
- manufacturer = child[0].text
- build_info['manufacturer'] = manufacturer
- if element.get("name").lower() == 'model':
- child = etree.Element.getchildren(element)
- if child and child[0].text:
- model = child[0].text
- build_info['model'] = model
- os.remove(builfinfo_file)
- return build_info
-
-
- def get_server_url(self, remote_port="8000"):
- """forward request a host tcp port to targe tcp port"""
- if remote_port is None:
- return None
-
- os.environ['no_proxy'] = LOCAL_HOST_NS
- host = LOCAL_HOST_NS
- inner_port = 9000
- time_out = 2
- bflag = False
- while True:
- sock_inner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock_inner.settimeout(time_out)
- try:
- sock_inner.bind((host, inner_port))
- sock_inner.close()
- bflag = False
- except socket.error as error:
- if error.errno == 98 or error.errno == 13:
- bflag = True
- if bflag:
- inner_port += 1
- else:
- break
- host_port = str(inner_port)
- cmd = "sdb -s %s forward tcp:%s tcp:%s" % \
- (self.deviceid, host_port, remote_port)
- exit_code, ret = shell_command(cmd)
- url_forward = "http://%s:%s" % (host, host_port)
- return url_forward
-
- def download_file(self, remote_path, local_path):
- """download file from device"""
-
- local_path_dir = os.path.dirname(local_path)
- if not os.path.exists(local_path_dir):
- os.makedirs(local_path_dir)
- filename = os.path.basename(remote_path)
- cmd = "sdb -s %s pull %s %s" % (
- self.deviceid, remote_path, local_path_dir)
- exit_code, ret = shell_command(cmd)
- if exit_code != 0:
- error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
- LOGGER.info("[ Download file \"%s\" failed, error: %s ]"
- % (remote_path, error))
- return False
- else:
- src_path = os.path.join(local_path_dir, filename)
- if src_path != local_path:
- shutil.move(src_path, local_path)
- return True
-
- def upload_file(self, remote_path, local_path):
- """upload file to device"""
- cmd = "sdb -s %s push %s %s" % (self.deviceid, local_path, remote_path)
- exit_code, ret = shell_command(cmd)
- if exit_code != 0:
- error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
- LOGGER.info("[ Upload file \"%s\" failed,"
- " get error: %s ]" % (local_path, error))
- return False
- else:
- return True
-
- def get_launcher_opt(self, test_launcher, test_suite, test_set, \
- fuzzy_match, auto_iu):
- """
- get test option dict
- """
- test_opt = {}
- test_opt["suite_name"] = test_suite
- test_opt["launcher"] = test_launcher
- test_opt["test_app_id"] = test_launcher
- self._wrt = False
- if test_launcher.find('WRTLauncher') != -1:
- self._wrt = True
- cmd = ""
- test_app_id = None
- test_opt["launcher"] = "wrt-launcher"
- # test suite need to be installed by commodule
- if auto_iu:
- test_wgt = test_set
- test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
- if not self.install_app(test_wgt_path):
- LOGGER.info("[ failed to install widget \"%s\" in target ]"
- % test_wgt)
- return None
- else:
- test_wgt = test_suite
-
- # query the whether test widget is installed ok
- cmd = WRT_QUERY_STR % (self.deviceid, test_wgt)
- exit_code, ret = shell_command(cmd)
- if exit_code == -1:
- return None
- for line in ret:
- items = line.split(':')
- if len(items) < 1:
- continue
- if (fuzzy_match and items[0].find(test_wgt) != -1) \
- or items[0] == test_wgt:
- test_app_id = items[1].strip('\r\n')
- break
-
- if test_app_id is None:
- LOGGER.info("[ test widget \"%s\" not found in target ]"
- % test_wgt)
- return None
- else:
- test_opt["test_app_id"] = test_app_id
-
- cmd1 = WRT_SMOCK_STR % (self.deviceid, test_app_id.split('.')[0])
- cmd2 = WRT_SMOCK_REV_STR % \
- (self.deviceid, test_app_id.split('.')[0])
- shell_command(cmd1)
- shell_command(cmd2)
-
- return test_opt
-
- def install_package(self, pkgpath):
- """install a package on tizen device:
- push package and install with shell command
- """
- cmd = RPM_INSTALL % (self.deviceid, pkgpath)
- exit_code, ret = shell_command(cmd)
- return ret
-
- def uninstall_package(self, pkgname):
- """install a package on tizen device:
- push package and install with shell command
- """
- cmd = RPM_UNINSTALL % (self.deviceid, pkgname)
- exit_code, ret = shell_command(cmd)
- return ret
-
- def get_installed_package(self):
- """get list of installed package from device"""
- cmd = RPM_LIST % self.deviceid
- exit_code, ret = shell_command(cmd)
- return ret
-
- def start_debug(self, dlogfile):
- global debug_flag, metux
- if self.is_NE_mode():
- return
- debug_flag = True
- metux = threading.Lock()
- cmdline = DLOG_CLEAR % self.deviceid
- exit_code, ret = shell_command(cmdline)
- cmdline = DLOG_WRT % self.deviceid
- LOGGER.debug("[ DLOGFILE_PATH:%s ]" % str(dlogfile))
- th = threading.Thread(target=debug_trace, args=(cmdline, dlogfile))
- th.setDaemon(True)
- th.start()
-
- def stop_debug(self):
- global debug_flag, metux
- if self.is_NE_mode():
- return
-
- metux.acquire()
- debug_flag = False
- metux.release()
-
- def launch_app(self, wgt_name):
- if not self._wrt:
- exit_code, ret = self.shell_cmd(wgt_name)
- return True
- timecnt = 0
- blauched = False
- cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- cmdline = WRT_START_STR % (self.deviceid, wgt_name)
- while timecnt < 3:
- exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
- if exit_code == "0":
- blauched = True
- break
- timecnt += 1
- time.sleep(3)
- return blauched
-
- def kill_app(self, wgt_name):
- if not self._wrt:
- return True
- cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- return True
-
- def install_app(self, wgt_path="", timeout=90):
- cmd = WRT_INSTALL_STR % (self.deviceid, wgt_path)
- exit_code, ret = shell_command(cmd, timeout)
- if exit_code == -1:
- cmd = APP_QUERY_STR % (self.deviceid, wgt_path)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- return False
- else:
- return True
-
- def uninstall_app(self, wgt_name):
- cmd = WRT_UNINSTL_STR % (self.deviceid, wgt_name.split('.')[0])
- exit_code, ret = shell_command(cmd)
- return True
-
-
-def get_target_conn(device_id=None):
- """ Get connection for Test Target"""
- if device_id is None:
- dev_list = _get_device_ids()
- device_id = dev_list[0] if len(dev_list) else None
- return TizenMobile(device_id)
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110 - 1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-""" The process kill for os"""
-
-import os
-import platform
-import signal
-import re
-import ctypes
-
-
-def killall(ppid):
- """Kill all children process by parent process ID"""
- os_ver = platform.system()
- try:
- if os_ver == "Linux" or os_ver == "Darwin":
- ppid = str(ppid)
- pidgrp = []
-
- def getchildpids(ppid):
- """Return a list of children process"""
- command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
- ppid)
- pids = os.popen(command).read()
- pids = pids.split()
- return pids
-
- pidgrp.extend(getchildpids(ppid))
- for pid in pidgrp:
- pidgrp.extend(getchildpids(pid))
- # Insert self process ID to PID group list
- pidgrp.insert(0, ppid)
- while len(pidgrp) > 0:
- pid = pidgrp.pop()
- try:
- os.kill(int(pid), signal.SIGKILL)
- except OSError, error:
- pattern = re.compile('No such process')
- match = pattern.search(str(error))
- if not match:
- print "[ Error: fail to kill pid: %s," \
- " error: %s ]\n" % (int(pid), error)
- # kill for windows platform
- else:
- kernel32 = ctypes.windll.kernel32
- handle = kernel32.OpenProcess(1, 0, int(ppid))
- kernel32.TerminateProcess(handle, 0)
- except OSError, error:
- pattern = re.compile('No such process')
- match = pattern.search(str(error))
- if not match:
- print "[ Error: fail to kill pid: %s, error: %s ]\n" \
- % (int(ppid), error)
- return None
+++ /dev/null
-#!/usr/bin/python
-#
-# Copyright (C) 2013 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
-# Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Liu,chengtao <liux.chengtao@intel.com>
-"""General Implementation"""
-
-import threading
-import logging
-import logging.handlers
-import sys
-import os
-
-# logger levels
-LEVELS = {"CRITICAL": 50,
- "ERROR": 40,
- "WARNING": 30,
- "INFO": 20,
- "DEBUG": 10,
- "NOTSET": 0
- }
-
-
-class Logger:
-
- """General Logger Class"""
- _instance = None
- _mutex = threading.Lock()
-
- def __init__(self, level="DEBUG", format_str="%(message)s"):
- """Generate root logger"""
- self._logger = logging.getLogger("TCT")
- self._logger.setLevel(LEVELS[level])
- self._formatter = logging.Formatter(format_str)
- self.add_print_logger()
-
- def add_print_logger(self, level="INFO"):
- """Generate console writer [StreamHandler]"""
- writer = logging.StreamHandler(sys.stdout)
- writer.setLevel(LEVELS[level])
- writer.setFormatter(self._formatter)
- self._logger.addHandler(writer)
-
- @staticmethod
- def get_logger(level="DEBUG", format_str="%(message)s"):
- """sinlgeton of Logger"""
- if Logger._instance is None:
- Logger._mutex.acquire()
- if Logger._instance is None:
- Logger._instance = Logger(level, format_str)
- else:
- pass
- Logger._mutex.release()
- return Logger._instance
-
- def debug(self, msg):
- """debug level message"""
- if msg is not None:
- sys.stdout.write(msg + '\r\n')
- sys.stdout.flush()
-
- def info(self, msg):
- """info level message"""
- if msg is not None:
- sys.stdout.write(msg + '\r\n')
- sys.stdout.flush()
-
- def warning(self, msg):
- """warning level message"""
- if msg is not None:
- self._logger.warning(msg)
-
- def error(self, msg):
- """error level message"""
- if msg is not None:
- sys.stdout.write(msg + '\r\n')
- sys.stdout.flush()
-
- def critical(self, msg):
- """critical level message"""
- if msg is not None:
- self._logger.critical(msg)
-
-
-LOGGER = Logger.get_logger(level=os.environ.get('LOG_LEVEL', 'INFO'))
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston,
-# MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-""" string convertor"""
-
-from types import IntType, FloatType, LongType
-import string
-
-
-def str2str(src):
- """string to printable string"""
- if isinstance(src, unicode):
- return src.encode("utf8")
-
- if isinstance(src, str):
- accept = string.punctuation + string.letters + string.digits + ' \r\n'
- return filter(lambda x: x in accept, src)
-
- return ""
-
-
-def str2val(src):
- """string to program value"""
- ret = None
- try:
- ret = eval(str2str(src))
- except:
- pass
- return ret
-
-
-def str2bool(src):
- """string to boolean"""
- if "TRUE" == str2str(src).upper():
- return True
- if "FALSE" == str2str(src).upper():
- return False
- return None
-
-
-def str2number(src):
- """string to boolean"""
- val = str2val(str2str(src))
- if type(val) in [IntType, FloatType, LongType]:
- return val
- else:
- return None
-
-
-def str2xmlstr(src):
- """string to xml string value"""
- return src.replace('\n', '\\n')
+++ /dev/null
-testkit-lite (2.3.22) unstable; urgency=low
-
- * TCT2.3 Release.
-
- -- ChengTao Liu <chengtaox.liu@intel.com> Mon, 4 Nov 2013 11:13:11 +0800
+++ /dev/null
-Source: testkit-lite
-Section: utils
-Priority: standard
-Maintainer: Cathy Shen <cathy.shen@intel.com>
-Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
-Standards-Version: 3.9.3
-Homepage: https://github.com/testkit/testkit-lite
-#Vcs-Git: git://git.debian.org/collab-maint/testkit-manager.git
-#Vcs-Browser: http://git.debian.org/?p=collab-maint/testkit-manager.git;a=summary
-
-Package: testkit-lite
-Architecture: all
-Depends: ${misc:Depends}, ${python:Depends}
-XB-Python-Version: ${python:Versions}
-Description: Test runner for test execution.
-
+++ /dev/null
-Format: http://dep.debian.net/deps/dep5
-Source: https://github.com/testkit/testkit-lite
-
-Files: *
-Copyright: 2012-2013 Intel Corp.
-License: GPL-2.0
-
-Files: debian/*
-Copyright: 2012-2013 Intel Corp.
-License: GPL-2.0
-
-License: GPL-2.0
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License
- .
- This package is distributed in the hope that 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, see <http://www.gnu.org/licenses/>.
- .
- On Debian systems, the complete text of the GNU General
- Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
-
+++ /dev/null
-testkit-lite_2.3.20_all.deb utils standard
+++ /dev/null
-#!/bin/sh
-
-# Set permissions
-mkdir /opt/testkit/lite2.4/test_packages
-chmod ugo+rwx -R /opt/testkit/lite2.4
-ln -fs /usr/share/pyshared/commodule /usr/lib/python2.7/dist-packages/commodule
-ln -fs /usr/share/pyshared/testkitlite /usr/lib/python2.7/dist-packages/testkitlite
-
+++ /dev/null
-#!/usr/bin/make -f
-
-%:
- dh $@
-
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitdocdir = /opt/testkit/lite2.4/doc
-dist_testkitdoc_DATA = testkit-lite_user_guide_for_tct.pdf
+++ /dev/null
-PKG_NAME := testkit-lite
-SPECFILE = $(addsuffix .spec, $(PKG_NAME))
-PKG_VERSION := $(shell grep '^Version: ' $(SPECFILE)|awk '{print $$2}')
-
-TARBALL := $(PKG_NAME)_$(PKG_VERSION).tar.gz
-
-dsc: $(TARBALL)
- $(eval MD5=$(shell md5sum $(TARBALL) | sed "s/ / $(shell stat -c '%s' $(TARBALL)) /"))
- @sed -i 's/^Version:.*/Version: $(PKG_VERSION)/' $(PKG_NAME).dsc
- @sed -i 's/ [a-f0-9]\+ [0-9]\+ $(PKG_NAME).*tar.*/ $(MD5)/' $(PKG_NAME).dsc
-
-$(TARBALL):
- cd "$$(git rev-parse --show-toplevel)" \
- && git archive --prefix $(PKG_NAME)-$(PKG_VERSION)/ HEAD \
- | gzip > "$(CURDIR)/$(TARBALL)"
-
-clean:
- rm -f $(PKG_NAME)*.tar.gz
-
-all: clean dsc
-
+++ /dev/null
-Source: testkit-lite
-Section: utils
-Priority: standard
-Maintainer: Lei Yang <lei.a.yang@intel.com>
-Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
-Standards-Version: 3.9.2
-Homepage: https://github.com/testkit/testkit-manager
-Version: 2.3.4
-Files:
- 82c2118d146839ec9139559f5049d2bf 6361871 testkit-lite_2.3.4.tar.gz
-
+++ /dev/null
-Summary: TCT-Lite
-Name: testkit-lite
-Version: 2.3.22
-Release: 1
-License: GPLv2
-Group: Applications/System
-Source: %{name}_%{version}.tar.gz
-
-BuildRequires: python-distribute
-
-%{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
-
-%description
-testkit-lite is a test runner with command-line interface.It has the following functions
-1. Accepts .xml test case descriptor files as input.
-2. drives automatic test execution.
-3. provide multiple options to meet various test requirements.
-
-%prep
-%setup -q
-
-%build
-
-%install
-python setup.py install --prefix=%{_prefix} --root=%{buildroot}
-# remove tests
-rm -rf %{buildroot}/%{python_sitelib}/tests
-
-%clean
-rm -rf %{buildroot}
-
-%post
-# Set permissions
-chmod ugo+rwx /opt/testkit/lite2.4
-
-%files
-%{python_sitelib}/testkitlite/*
-%{python_sitelib}/commodule/*
-%{python_sitelib}/testkit_lite-*.egg-info/*
-/opt/testkit/lite2.4/VERSION
-%{_bindir}/testkit-lite
-%defattr(-,root,root)
-
-%doc
-/opt/testkit/lite2.4/testkit-lite_user_guide_for_tct.pdf
-
-%changelog
+++ /dev/null
-#!/usr/bin/python
-
-from setuptools import setup, find_packages
-
-setup(
- name = "testkit-lite",
- description = "Test runner for test execution",
- url = "https://github.com/testkit/testkit-lite",
- author = "Cathy Shen",
- author_email = "cathy.shen@intel.com",
- version = "2.3.22",
- include_package_data = True,
- data_files = [('/opt/testkit/lite2.4/',
- ('VERSION', 'doc/testkit-lite_user_guide_for_tct.pdf'))],
- scripts = ('testkit-lite',),
- packages = find_packages(),
-)
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
-# USA.
-#
-# Authors:
-# Jing,Wang <jing.j.wang@intel.com>
-# Yuanyuan,Zou <zouyuanx@intel.com>
-""" testkit lite tools"""
-
-import os
-import sys
-import traceback
-import platform
-import ConfigParser
-import re
-import xml.etree.ElementTree as etree
-from optparse import OptionParser, make_option
-from datetime import datetime
-
-# import logger
-try:
- from commodule.log import LOGGER
-except ImportError, err:
- print "[ Error: loading logging failed, error: %s ]\n" % err
- print "try to run command " \
- "'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and " \
- "'export PYTHONPATH=/usr/share/pyshared/' to resolve this issue"
- sys.exit(1)
-
-# import process kill
-try:
- from testkitlite.common.process_killall import kill_testkit_lite, clean_testxml
-except ImportError, err:
- LOGGER.error("[ Error: loading module killall failed, error: %s ]\n" % err)
- LOGGER.info("try to run command \
-'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and \
-'export PYTHONPATH=/usr/share/pyshared/' to resolve this issue")
- sys.exit(1)
-
-# get platform version info
-os_ver = platform.system()
-JOIN = os.path.join
-EXISTS = os.path.exists
-DIRNAME = os.path.dirname
-BASENAME = os.path.basename
-ABSPATH = os.path.abspath
-SPLIT = os.path.split
-ISLINK = os.path.islink
-
-NOW = datetime.now().strftime("%Y-%m-%d_%H_%M_%S")+ str(os.getpid())
-TESTKIT_DIR = "/opt/testkit/lite2.4"
-if not os_ver == "Linux" and not os_ver == "Darwin":
- TESTKIT_DIR = DIRNAME(ABSPATH(__file__))
- sys.path += [JOIN(TESTKIT_DIR)]
- TESTKIT_DIR = JOIN(TESTKIT_DIR, "results")
-
-LOG_DIR = TESTKIT_DIR
-NOW_DIR = JOIN(LOG_DIR, NOW)
-PID_FILE = JOIN(NOW_DIR, "pid.log")
-TEST_PACKAGES_DIR = JOIN(NOW_DIR, "test_packages")
-
-if not EXISTS(NOW_DIR):
- os.makedirs(NOW_DIR)
-
-#LOGGER.info("\nNOW:%s\n NOW_DIR:%s\n TESTKIT_DIR:%s\n LOG_DIR:%s\n PID_FILE:%s\n TEST_PACKAGES_DIR:%s\n"% (NOW, NOW_DIR, TESTKIT_DIR, LOG_DIR, PID_FILE, TEST_PACKAGES_DIR))
-COMMON_FILTERS = {
- "suite": [],
- "set": [],
- "priority": [],
- "id": [],
- "type": [],
- "component": []}
-down_status = False
-remote_test = False
-can_merge_result = False
-
-# start testkit-lite in Singleton mode
-#kill_testkit_lite(PID_FILE)
-
-if not os_ver == "Linux" and not os_ver == "Darwin":
- try:
- #LOGGER.info("\n[ makedirs LOG_DIR: %s ]\n" % LOG_DIR)
- if not EXISTS(LOG_DIR):
- os.makedirs(LOG_DIR)
- except OSError, err:
- LOGGER.error("[ Error: create results directory:"
- " %s failed, error: %s ]\n" % (LOG_DIR, err))
-
-try:
- #LOGGER.info("\n[ Opening PID_FILE: %s ]\n" % PID_FILE)
- with open(PID_FILE, "w") as fd:
- PID = str(os.getpid())
- fd.writelines(PID + '\n')
-except OSError, e:
- LOGGER.error("[ Error: can't create pid log file: %s, error: %s ]\n" %
- (PID_FILE, err))
- sys.exit(1)
-
-try:
- os.chmod(PID_FILE, 0666)
-except OSError:
- pass
-
-# detect version option
-if "--version" in sys.argv:
- try:
- CONFIG = ConfigParser.ConfigParser()
- if platform.system() == "Linux":
- CONFIG.read('/opt/testkit/lite2.4/VERSION')
- else:
- VERSION_FILE = JOIN(sys.path[0], 'VERSION')
- CONFIG.read(VERSION_FILE)
- VERSION = CONFIG.get('public_version', 'version')
- LOGGER.info("V%s" % VERSION)
- except ConfigParser.Error, err:
- LOGGER.error(
- "[ Error: fail to parse version info, error: %s ]\n" % err)
- sys.exit(1)
-
-# detect internal version option
-if "--internal-version" in sys.argv:
- try:
- CONFIG = ConfigParser.ConfigParser()
- if platform.system() == "Linux":
- CONFIG.read('/opt/testkit/lite2.4/VERSION')
- else:
- VERSION_FILE = JOIN(sys.path[0], 'VERSION')
- CONFIG.read(VERSION_FILE)
- VERSION = CONFIG.get('internal_version', 'version')
- print VERSION
- except ConfigParser.Error, err:
- print "[ Error: fail to parse version info, error: %s ]\n" % err
- sys.exit(1)
-
-
-# init test engine here
-try:
- from testkitlite.engines.default.runner import TRunner
- from commodule.connector import Connector
-except ImportError, err:
- LOGGER.error("[ Error: loading test engine failed, error: %s ]\n" % err)
- LOGGER.info("try to run command "
- "'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and "
- "'export PYTHONPATH=/usr/share/pyshared/'to resolve this issue")
- sys.exit(1)
-
-
-def varnarg(option, opt_str, value, parser):
- """ parser srg"""
- value = []
- import re
- for arg in parser.rargs:
- if re.search('^--.+', arg) or \
- re.search('^-[\D]', arg):
- break
- value.append(arg)
-
- del parser.rargs[:len(value)]
- setattr(parser.values, option.dest, value)
-
-try:
- OPTION_LIST = [
- make_option("-f", "--testxml", dest="testxml",
- action="callback", callback=varnarg,
- help="Specify the path of test definition file (tests.xml)."
- " If run more one test package,just list the all the path "
- " of \"tests.xml\" and separate with a whitespace"),
- make_option("-D", "--dryrun", dest="bdryrun",
- action="store_true",
- help="Dry-run the selected test cases"),
- make_option("-M", "--manual-only", dest="bmanualonly",
- action="store_true",
- help="Enable only manual tests"),
- make_option("-A", "--auto-only", dest="bautoonly",
- action="store_true",
- help="Enable only auto tests"),
- make_option("-o", "--output", dest="resultfile",
- help="Specify output file for result xml. \
- If more than one testxml provided, \
- results will be merged together to this output file"),
- make_option("-e", dest="exttest", action="store",
- help="Launch external test with a launcher,\
- supports browser or other web-runtime"),
- make_option("--version", dest="version_info", action="store_true",
- help="Show version information"),
- make_option("--internal-version", dest="internal_version_info",
- action="store_true",
- help="Show internal version information"),
- make_option("--deviceid", dest="device_serial", action="store",
- help="set device serial information"),
- make_option("--testprefix", dest="test_prefix", action="store",
- help="set prefix for test case entry"),
- make_option("--comm", dest="commodule", action="store",
- help="set commodule by default,"
- "set \"localhost\" for local web testing"),
- make_option("--capability", dest="capability", action="store",
- help="set platform for sepecfic device capability"),
- make_option("--quit", dest="quit", action="store_true",
- help="quit testkit-lite"),
- make_option("--debug", dest="debug", action="store_true",
- help="run in debug mode,more log information print out"),
- make_option("--rerun", dest="rerun", action="store_true",
- help="check if rerun test mode"),
- make_option("--non-active", dest="non_active", action="store_true",
- help="Disable the ability to set the result of \
- core manual cases from the console"),
- make_option("--tizen-version", dest="tizenversion", action="callback", callback=varnarg, help="set tizen version infomation"),
- make_option("--skip-tc", dest="skip_tc", action="callback", callback=varnarg, help="Specify the testcase id for exclude from the test"),
- make_option("--stub-port", dest="stubport", action="callback", callback=varnarg, help = "set testkit-stub port number")
-
- ]
-
- OPTION_LIST.extend([
- make_option("--%s" % flt,
- dest="w%s" % flt, action="callback", callback=varnarg,
- help="Select the specified filter-rules : %s" % flt)
- for flt in COMMON_FILTERS])
-
- try:
- # untrusted behaviour of %%prog
- USAGE = "%%prog [options] -f [prefix:]\"<somewhere/test.xml>\" -e \
-\"<launcher-name>\"\n\
-forms: %%prog -f [prefix:]\"<somewhere>/test.xml\"\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" -D\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" -A\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" -M\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --type \"smoke\"\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --component \"TizenAPI/Communication/Messaging\"\n\
- %%prog -f [prefix:]\"<somewhere>/test1.xml <somewhere>/test2.xml \
-<somewhere>/test3.xml\" \n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" -D -A \ --capability <capability file> --comm <commoduletype>\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" -D -A \
-...\n\
-exmaples: \n\
- run a web test package from device side with device WRT (it is default): \n\
- %%prog -f device:\"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -e \
-'WRTLauncher' -A \n\
- run a web test package from local path with chrome browser: \n\
- %%prog -f \"/usr/share/webapi-webkit-tests/tests.xml\" -e \
-'<somewhere>/chrome-startup' -A --comm localhost \n\
-\n\
-Note: \n\
- 1) Proxy settings should be disabled when execute webapi packages\n\
- 2) TestLog is stored to %s/latest\n\
- 3) %%prog enables both auto and manual tests by default\n\
- 4) Obviously -A and -M are conflict options\n\
- 5) -e option does not support -D mode\n\
- 6) The test cases' order in the result files might be arbitrary,\
-when running same tests.xml with same options. This is caused \
-by python's API 'getiterator' from module 'xml.etree.ElementTree'\n\
- 7) run command 'testkit-lite', \
- it might not be able to locate module 'testkitlite.engines.\
-default.runner', \
- run command 'export PYTHONPATH=/usr/share/pyshared/' \
- run command 'export PYTHONPATH=/usr/lib/python2.7/dist-packages' \
- to resolve this issue" % (LOG_DIR)
- except Exception:
- USAGE = None
-
- # detect non-params
- if len(sys.argv) == 1:
- sys.argv.append("-h")
-
- PARSERS = OptionParser(option_list=OPTION_LIST, usage=USAGE)
-
- (OPTIONS, ARGS) = PARSERS.parse_args()
- # detect quit action
- if OPTIONS.quit:
- try:
- LOGGER.info("[ Quit testkit-lite now ]")
- kill_testkit_lite(PID_FILE)
- except Exception, err:
- LOGGER.error("[ Error: fail to kill existing testkit-lite,"
- " error: %s ]\n" % err)
- sys.exit(1)
-
- # detect conflict
- if OPTIONS.bautoonly and OPTIONS.bmanualonly:
- raise ValueError("-A and -M are conflict")
- if OPTIONS.commodule:
- if OPTIONS.commodule == 'localhost' and "device:" in OPTIONS.testxml[0]:
- raise ValueError("For single mode, pls set local file to test ")
- COMMODULE_TYPE = OPTIONS.commodule
- else:
- COMMODULE_TYPE = "tizenmobile"
-
- CONNECTOR = Connector({"testmode": COMMODULE_TYPE, "deviceid":OPTIONS.device_serial}).get_connector()
- if CONNECTOR == None:
- LOGGER.error("[ Error: init commodule error... ]\n")
- sys.exit(1)
-
- # create runner
- RUNNER = TRunner(CONNECTOR)
- RUNNER.set_pid_log(PID_FILE)
-
- # apply all options
- RUNNER.set_global_parameters(OPTIONS)
-
- if OPTIONS.tizenversion is None:
- LOGGER.error("[ Error : input your tizen version ]\n")
- sys.exit(1)
- else :
- tizenver = OPTIONS.tizenversion[0]
- VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d"
- pa = re.compile(VER_PATTERN, re.I)
- ma = pa.match(tizenver)
- if ma is None:
- LOGGER.error("A required \"/opt/tct/"+tizenver+" could not be found.\n")
- sys.exit(1)
-
- RUNNER.set_tizenversion(tizenver)
-
- if OPTIONS.stubport is not None:
- port = OPTIONS.stubport[0]
- RUNNER.set_stubport(port)
-
- if OPTIONS.skip_tc is not None:
- RUNNER.set_skip_tc(OPTIONS.skip_tc)
-
- # set capability
- if OPTIONS.capability:
- GET_CAPABILITY_STATUS = RUNNER.get_capability(OPTIONS.capability)
- if not GET_CAPABILITY_STATUS:
- sys.exit(1)
-
- if "device:" in OPTIONS.testxml[0]:
- remote_test = True
- try:
- #LOGGER.info("\n[ makedirs TEST_PACKAGES_DIR: %s ]\n" % TEST_PACKAGES_DIR)
- if not EXISTS(TEST_PACKAGES_DIR):
- os.makedirs(TEST_PACKAGES_DIR)
- except OSError, err:
- LOGGER.error("[ Error: "
- "can't create test package directory: %s, error: %s ]\n" %
- (TEST_PACKAGES_DIR, err))
- sys.exit(1)
- REMOTE_TESTLITS = OPTIONS.testxml[0]
- REMOTE_TESTLITS = REMOTE_TESTLITS.split(':')[1]
- TESTLISTARRARY = REMOTE_TESTLITS.split()
- LOCALARRY = []
-
- for remote_file in TESTLISTARRARY:
- tmp_remote_file = SPLIT(remote_file)
- tmp_remote_folder = BASENAME(tmp_remote_file[0])
- tmp_remote_test_xml = JOIN(
- tmp_remote_folder, tmp_remote_file[1])
- local_test_package = JOIN(
- TEST_PACKAGES_DIR, tmp_remote_test_xml)
- down_status = RUNNER.connector.download_file(remote_file, local_test_package)
- if not down_status:
- LOGGER.error("can not get test definition file, pls check file on device:%s"
- % remote_file)
- sys.exit(1)
- LOCALARRY.append(local_test_package)
- OPTIONS.testxml = LOCALARRY
- else:
- if len(OPTIONS.testxml) == 1:
- i = 0
- start = 0
- end = 0
- LOCAL_TESTLISTS= []
- temp_xml = OPTIONS.testxml[0]
- while(i < len(temp_xml)):
- tmp = temp_xml[i:len(temp_xml)]
- if ".xml" in tmp :
- index = tmp.index(".xml")+4+i
- end = index
- i=index+1
- LOCAL_TESTLISTS.append(temp_xml[start:end])
- start = index+1
- else:
- print 'no xml found'
- break
- OPTIONS.testxml = LOCAL_TESTLISTS
-
- # apply filter
- WFILTERS = {}
- for flt in COMMON_FILTERS:
- if eval('OPTIONS.w%s' % flt):
- WFILTERS[flt] = eval('OPTIONS.w%s' % flt)
- RUNNER.add_filter_rules(**WFILTERS)
-
- if not OPTIONS.testxml:
- LOGGER.error("[ Error: not specify a test xml... ]\n")
- sys.exit(1)
-
- # 1) prepare log dir
- if os_ver == "Linux" or os_ver == "Darwin":
- SESSION = datetime.today().isoformat('-')+str(os.getpid())+"_session"
- else:
- SESSION = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")+str(os.getpid())+"_session"
- CURRENT_LOG_DIR = JOIN(LOG_DIR, SESSION)
- LATEST_DIR = JOIN(LOG_DIR, "latest")
- try:
- if EXISTS(LATEST_DIR):
- os.remove(LATEST_DIR)
- if ISLINK(LATEST_DIR):
- os.remove(LATEST_DIR)
- os.makedirs(CURRENT_LOG_DIR)
- if os.name == "posix":
- os.symlink(CURRENT_LOG_DIR, LATEST_DIR)
- except IOError, err:
- LOGGER.error("[ Error: create session log directory: "
- "%s failed, error: %s ]\n" % (CURRENT_LOG_DIR, err))
- except OSError, err:
- LOGGER.error("error : %s" % err)
-
- finally:
- if not EXISTS(CURRENT_LOG_DIR):
- os.makedirs(CURRENT_LOG_DIR)
-
- # 2) prepare run test
- # run more than one tests.xml
- # 1. run all auto cases from the xmls
- # 2. run all manual cases from the xmls
- TESTXMLS = set(OPTIONS.testxml)
- for t in TESTXMLS:
- if EXISTS(t):
- filename = t
- filename = os.path.splitext(filename)[0]
- if os_ver == "Linux" or os_ver == "Darwin":
- if not filename.startswith('/'):
- LOGGER.error("[ Error:"
- " xml file %s should start with '/' ]" % filename)
- sys.exit(1)
- else:
- filename = filename.split('/')[-2]
- if filename == "":
- LOGGER.error("[ Error:"
- " unable to find package name from %s ]" % t)
- sys.exit(1)
- else:
- filename = filename.split('\\')[-2]
- filename = "%s.total" % BASENAME(filename)
- resultfile = "%s.xml" % filename
- resultfile = JOIN(CURRENT_LOG_DIR, resultfile)
- try:
- ep = etree.parse(t)
- suiteparent = ep.getroot()
- except etree.ParseError:
- LOGGER.error("[ Error: no case found in testxml, "
- "pls check the test package ]\n")
- sys.exit(1)
- no_test_definition = 1
- for tf in ep.getiterator('test_definition'):
- no_test_definition = 0
- if no_test_definition:
- suiteparent = etree.Element('test_definition')
- suiteparent.tail = "\n"
- for suite in ep.getiterator('suite'):
- suite.tail = "\n"
- suiteparent.append(suite)
- if OPTIONS.bautoonly:
- WFILTERS['execution_type'] = ["auto"]
- RUNNER.add_filter_rules(**WFILTERS)
- if OPTIONS.bmanualonly:
- WFILTERS['execution_type'] = ["manual"]
- RUNNER.add_filter_rules(**WFILTERS)
- RUNNER.apply_filter(suiteparent)
- # just leave suite and set for merge result
- for suite in ep.getiterator('suite'):
- for tset in suite.getiterator('set'):
- for testcase in tset.getiterator('testcase'):
- tset.remove(testcase)
- try:
- #LOGGER.info("\n[ Opening resultfile: %s ]\n" % resultfile)
- with open(resultfile, 'w') as output:
- tree = etree.ElementTree(element=suiteparent)
- tree.write(output)
- except IOError, err:
- LOGGER.error(
- "[ Error: create filtered total result file: %s failed, "
- "error: %s ]\n" % (resultfile, err))
- else:
- print "[ Have no test xml found ]"
- sys.exit(1)
- START_TIME = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
- if not OPTIONS.bautoonly:
- if OPTIONS.bmanualonly:
- for t in TESTXMLS:
- try:
- WFILTERS['execution_type'] = ["manual"]
- RUNNER.add_filter_rules(**WFILTERS)
- RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
- except IOError, err:
- LOGGER.error("[ Error: prepare_run test xml: "
- "%s from testkit-lite failed, error: %s ]\n" % (t, err))
- else:
- for t in TESTXMLS:
- try:
- WFILTERS['execution_type'] = ["auto"]
- RUNNER.add_filter_rules(**WFILTERS)
- RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
- except IOError, err:
- LOGGER.error("[ Error: prepare_run test xml: "
- "%s from testkit-lite failed, error: %s ]\n" % (t, err))
- for t in TESTXMLS:
- try:
- WFILTERS['execution_type'] = ["manual"]
- RUNNER.add_filter_rules(**WFILTERS)
- RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
- except IOError, err:
- LOGGER.error("[ Error: prepare_run test xml: "
- "%s from testkit-lite failed, error: %s ]\n" % (t, err))
- else:
- for t in TESTXMLS:
- try:
- WFILTERS['execution_type'] = ["auto"]
- RUNNER.add_filter_rules(**WFILTERS)
- RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
- except IOError, err:
- clean_testxml(TESTXMLS, remote_test)
- LOGGER.error("[ Error: prepare_run test xml: "
- "%s from testkit-lite failed, error: %s ]\n" % (t, err))
-
- try:
- can_merge_result = True
- RUNNER.run_case(CURRENT_LOG_DIR)
- except Exception, err:
- clean_testxml(TESTXMLS, remote_test)
- traceback.print_exc()
- LOGGER.error("[ Error: run_test_case failed ,error: %s ]\n" % err)
- try:
- RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
- clean_testxml(TESTXMLS, remote_test)
- LOGGER.info("[ all tasks for testkit lite are accomplished, goodbye ]")
- except Exception, err:
- traceback.print_exc()
- clean_testxml(TESTXMLS,remote_test)
- LOGGER.error("[ Error: merge_resultfile "
- "failed,error: %s, goodbye ]\n" % err)
-
-except KeyboardInterrupt, err:
- if RUNNER.session_id:
- RUNNER.finalize_test(RUNNER.session_id)
- if can_merge_result:
- RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
- if down_status:
- clean_testxml(OPTIONS.testxml, remote_test)
- LOGGER.info("\n[ exiting testkit-lite on user cancel, goodbye ]\n")
- sys.exit(1)
-except Exception, err:
- if RUNNER.session_id:
- RUNNER.finalize_test(RUNNER.session_id)
- if can_merge_result:
- RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
- if down_status:
- clean_testxml(OPTIONS.testxml, remote_test)
- LOGGER.error("\n[ Error: exiting testkit-lite "
- "by catching a critical error: %s, goodbye ]\n" % err)
- traceback.print_exc()
- sys.exit(1)
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-SUBDIRS = common engines
-
-testkitlitedir = /usr/lib/python2.7/dist-packages/testkitlite
-dist_testkitlite_SCRIPTS = __init__.py
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitlitecommondir = /usr/lib/python2.7/dist-packages/testkitlite/common
-dist_testkitlitecommon_SCRIPTS = *.py
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston,
-# MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-""" kill testkit-lite """
-import os
-import platform
-import signal
-import re
-import ctypes
-from commodule.log import LOGGER
-from commodule.killall import killall
-
-
-def kill_testkit_lite(pid_file):
- """ kill testkit lite"""
- try:
- with open(pid_file, "r") as pidfile:
- pid = pidfile.readline().rstrip("\n")
- if pid:
- killall(pid)
- except IOError, error:
- pattern = re.compile('No such file or directory|No such process')
- match = pattern.search(str(error))
- if not match:
- LOGGER.info("[ Error: fail to kill existing testkit-lite, "\
- "error: %s ]\n" % error)
- return None
-
-def clean_testxml(testxmls,remote_test):
- """clean all test xmls"""
- if remote_test:
- EXISTS = os.path.exists
- for testxml in testxmls:
- if EXISTS(testxml):
- fd_name = os.path.dirname(testxml)
- os.remove(testxml)
- os.rmdir(fd_name)
- return None
\ No newline at end of file
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-SUBDIRS = default
-
-testkitliteenginesdir = /usr/lib/python2.7/dist-packages/testkitlite/engines
-dist_testkitliteengines_SCRIPTS = __init__.py
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitliteenginesdefaultdir = /usr/lib/python2.7/dist-packages/testkitlite/engines/default
-dist_testkitliteenginesdefault_SCRIPTS = *.py
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.,
-# 51 Franklin Street,
-# Fifth Floor,
-# Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-# Yuanyuan,Zou <zouyuanx@intel.com>
-""" prepare run , split xml ,run case , merge result """
-
-import os
-import platform
-import time
-import sys
-import traceback
-import collections
-import string
-import random
-from datetime import datetime
-from shutil import copyfile
-import xml.etree.ElementTree as etree
-import ConfigParser
-from tempfile import mktemp
-from shutil import move
-from os import remove
-from commodule.log import LOGGER
-from commodule.str2 import str2xmlstr
-
-
-from .worker import TestWorker
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = ConfigParser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
-DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-DEVICE_EXECUTION_MODE_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
-DEVICE_SUITE_TARGET_30_STR = "{DEVICE_SUITE_TARGET_30}"
-DEVICE_EXECUTION_MODE_30_STR = "{DEVICE_EXECUTION_MODE_30}"
-
-JOIN = os.path.join
-DIRNAME = os.path.dirname
-BASENAME = os.path.basename
-EXISTS = os.path.exists
-ABSPATH = os.path.abspath
-
-
-class TRunner:
-
- """
- Parse the testdefinition.xml files.
- Apply filter for each run.
- Conduct tests execution.
- """
-
- def __init__(self, connector):
- """ init all self parameters here """
- # dryrun
- self.bdryrun = False
- # non_active
- self.non_active = False
- # result file
- self.resultfile = None
- # external test
- self.external_test = None
- # filter rules
- self.filter_rules = None
- self.debug = False
- self.resultfiles = set()
- self.core_auto_files = []
- self.core_manual_files = []
- self.skip_all_manual = False
- self.testsuite_dict = {}
- self.exe_sequence = []
- self.testresult_dict = {"pass": 0, "fail": 0,
- "block": 0, "not_run": 0}
- self.current_test_xml = "none"
- self.first_run = True
- self.deviceid = None
- self.session_id = None
- self.pid_log = None
- self.set_parameters = {}
- self.connector = connector
- self.testworker = TestWorker(connector)
- self.stub_name = "testkit-stub"
- self.capabilities = {}
- self.has_capability = False
- self.rerun = False
- self.test_prefix = ""
- self.tizenV = None
- self.skip_tc = None
- self.stub_port = "8000"
-
- def set_global_parameters(self, options):
- "get all options "
- # apply dryrun
- if options.bdryrun:
- self.bdryrun = options.bdryrun
- # Disable set the result of core manual cases from the console
- if options.non_active:
- self.non_active = options.non_active
- # apply user specify test result file
- if options.resultfile:
- self.resultfile = options.resultfile
- # set the external test WRTLauncher
- if options.exttest:
- self.external_test = options.exttest
- if options.debug:
- self.debug = options.debug
- if options.rerun:
- self.rerun = options.rerun
- if options.test_prefix:
- self.test_prefix = options.test_prefix
- if options.device_serial:
- self.deviceid = options.device_serial
-
- def set_pid_log(self, pid_log):
- """ get pid_log file """
- self.pid_log = pid_log
-
- def add_filter_rules(self, **kargs):
- """
- kargs: key:values - "":["",]
- """
- self.filter_rules = kargs
-
- def set_session_id(self, session_id):
- """ set the set test session id which is get form com_module """
- self.session_id = session_id
-
- def set_stubport(self, stubport):
- self.stub_port = stubport
-
- def set_tizenversion(self, _tizenV):
- self.tizenV = _tizenV
- self.testworker.set_TizenVersion(self.tizenV)
-
- def set_skip_tc(self, skip_tc):
- self.skip_tc = skip_tc
-
- def set_capability(self, capabilities):
- """ set capabilitys """
- self.capabilities = capabilities
- self.has_capability = True
-
- def prepare_run(self, testxmlfile, resultdir=None):
- """
- testxmlfile: target testxml file
- execdir and resultdir: should be the absolute path since TRunner
- is the common lib
- """
- # resultdir is set to current directory by default
- if not resultdir:
- resultdir = os.getcwd()
- ok_prepare = True
- if ok_prepare:
- try:
- filename = testxmlfile
- filename = os.path.splitext(filename)[0]
- if platform.system() == "Linux":
- filename = filename.split('/')[-2]
- else:
- filename = filename.split('\\')[-2]
- if self.filter_rules["execution_type"] == ["manual"]:
- resultfile = "%s.manual.xml" % filename
- else:
- resultfile = "%s.auto.xml" % filename
- resultfile = JOIN(resultdir, resultfile)
- if not EXISTS(resultdir):
- os.mkdir(resultdir)
- LOGGER.info("[ analysis test xml file: %s ]" % resultfile)
- self.__prepare_result_file(testxmlfile, resultfile)
- self.__split_test_xml(resultfile, resultdir)
- except IOError as error:
- LOGGER.error(error)
- ok_prepare &= False
- return ok_prepare
-
- def __split_test_xml(self, resultfile, resultdir):
- """ split_test_xml into auto and manual"""
- casefind = etree.parse(resultfile).getiterator('testcase')
- if casefind:
- test_file_name = "%s" % BASENAME(resultfile)
- test_file_name = os.path.splitext(test_file_name)[0]
- self.__splite_external_test(
- resultfile, test_file_name, resultdir)
-
- def __splite_core_test(self, resultfile):
- """select core test"""
- if self.filter_rules["execution_type"] == ["auto"]:
- self.core_auto_files.append(resultfile)
- else:
- self.core_manual_files.append(resultfile)
- self.resultfiles.add(resultfile)
-
- def __splite_external_test(self, resultfile, test_file_name, resultdir):
- """select external_test"""
- testsuite_dict_value_list = []
- testsuite_dict_add_flag = 0
- filename_diff = 1
-
- parser = etree.parse(resultfile)
- for tsuite in parser.getiterator('suite'):
- root = etree.Element('test_definition')
- suitefilename = os.path.splitext(resultfile)[0]
- suitefilename += ".suite_%s.xml" % filename_diff
- suitefilename = JOIN(resultdir, suitefilename)
- tsuite.tail = "\n"
- root.append(tsuite)
- try:
- with open(suitefilename, 'w') as output:
- tree = etree.ElementTree(element=root)
- tree.write(output)
- except IOError as error:
- LOGGER.error("[ Error: create filtered result file: %s failed,\
- error: %s ]" % (suitefilename, error))
- case_suite_find = etree.parse(
- suitefilename).getiterator('testcase')
- if case_suite_find:
- if tsuite.get('launcher'):
- if tsuite.get('launcher').find('WRTLauncher'):
- self.__splite_core_test(suitefilename)
- else:
- testsuite_dict_value_list.append(suitefilename)
- if testsuite_dict_add_flag == 0:
- self.exe_sequence.append(test_file_name)
- testsuite_dict_add_flag = 1
- self.resultfiles.add(suitefilename)
- else:
- if self.filter_rules["execution_type"] == ["auto"]:
- self.core_auto_files.append(suitefilename)
- else:
- self.core_manual_files.append(suitefilename)
- self.resultfiles.add(suitefilename)
- filename_diff += 1
- if testsuite_dict_add_flag:
- self.testsuite_dict[test_file_name] = testsuite_dict_value_list
-
- def __prepare_result_file(self, testxmlfile, resultfile):
- """ write the test_xml content to resultfile"""
- try:
- parse_tree = etree.parse(testxmlfile)
- suiteparent = parse_tree.getroot()
- no_test_definition = 1
- if parse_tree.getiterator('test_definition'):
- no_test_definition = 0
- if no_test_definition:
- suiteparent = etree.Element('test_definition')
- suiteparent.tail = "\n"
- for suite in parse_tree.getiterator('suite'):
- suite.tail = "\n"
- suiteparent.append(suite)
- self.apply_filter(suiteparent)
- try:
- with open(resultfile, 'w') as output:
- tree = etree.ElementTree(element=suiteparent)
- tree.write(output)
- except IOError as error:
- LOGGER.error("[ Error: create filtered result file: %s failed,\
- error: %s ]" % (resultfile, error))
- except IOError as error:
- LOGGER.error(error)
- return False
-
- def run_case(self, latest_dir):
- """ run case """
- # run core auto cases
- self.__run_core_auto()
-
- # run webAPI cases
- self.__run_webapi_test(latest_dir)
-
- # run core manual cases
- self.__run_core_manual()
-
- def __run_core_auto(self):
- """ core auto cases run"""
- self.core_auto_files.sort()
- for core_auto_file in self.core_auto_files:
- temp_test_xml = os.path.splitext(core_auto_file)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml += ".auto"
- # print identical xml file name
- if self.current_test_xml != temp_test_xml:
- time.sleep(3)
- LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
- self.current_test_xml = temp_test_xml
- self.__run_with_commodule(core_auto_file)
-
- def __run_core_manual(self):
- """ core manual cases run """
- self.core_manual_files.sort()
- for core_manual_file in self.core_manual_files:
- temp_test_xml = os.path.splitext(core_manual_file)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml += ".manual"
- # print identical xml file name
- if self.current_test_xml != temp_test_xml:
- time.sleep(3)
- LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
- self.current_test_xml = temp_test_xml
- if self.non_active:
- self.skip_all_manual = True
- else:
- self.__run_with_commodule(core_manual_file)
-
- def __run_webapi_test(self, latest_dir):
- """ run webAPI test"""
- if self.bdryrun:
- LOGGER.info("[ WRTLauncher mode does not support dryrun ]")
- return True
-
- list_auto = []
- list_manual = []
- for i in self.exe_sequence:
- if i[-4::1] == "auto":
- list_auto.append(i)
- if i[-6::1] == "manual":
- list_manual.append(i)
- list_auto.sort()
- list_manual.sort()
- self.exe_sequence = []
- self.exe_sequence.extend(list_auto)
- self.exe_sequence.extend(list_manual)
-
- for webapi_total_file in self.exe_sequence:
- for webapi_file in self.testsuite_dict[webapi_total_file]:
- # print identical xml file name
- if self.current_test_xml != \
- JOIN(latest_dir, webapi_total_file):
- time.sleep(3)
- LOGGER.info("\n[ testing xml: %s.xml ]\n"
- % JOIN(latest_dir, webapi_total_file))
- self.current_test_xml = JOIN(latest_dir, webapi_total_file)
-
- self.__run_with_commodule(webapi_file)
-
- def __run_with_commodule(self, webapi_file):
- """run_with_commodule,Initialization,check status,get result"""
- try:
- # prepare test set list
- test_xml_set_list = self.__split_xml_to_set(webapi_file)
- # create temporary parameter
- for test_xml_set in test_xml_set_list:
- LOGGER.info("\n[ run set: %s ]" % test_xml_set)
- # prepare the test JSON
- self.__prepare_external_test_json(test_xml_set)
-
- # init test here
- init_status = self.__init_com_module(test_xml_set)
- if not init_status:
- continue
- # send set JSON Data to com_module
- self.testworker.run_test(
- self.session_id, self.set_parameters)
- while True:
- time.sleep(1)
- # check the test status ,if the set finished,get
- # the set_result,and finalize_test
- if self.__check_test_status():
- set_result = self.testworker.get_test_result(
- self.session_id)
- # write_result to set_xml
- self.__write_set_result(
- test_xml_set, set_result)
- # shut down server
- self.finalize_test(self.session_id)
- break
- except IOError as error:
- LOGGER.error(
- "[ Error: fail to run webapi test xml, error: %s ]" % error)
-
- def __split_xml_to_set(self, webapi_file):
- """split xml by <set>"""
-
- LOGGER.debug("[ split xml: %s by <set> ]" % webapi_file)
- LOGGER.debug("[ this might take some time, please wait ]")
- set_number = 1
- test_xml_set_list = []
- self.resultfiles.discard(webapi_file)
- test_xml_temp = etree.parse(webapi_file)
- for test_xml_temp_suite in test_xml_temp.getiterator('suite'):
- while set_number <= len(test_xml_temp_suite.getiterator('set')):
- copy_url = os.path.splitext(webapi_file)[0]
- copy_url += "_set_%s.xml" % set_number
- copyfile(webapi_file, copy_url)
- test_xml_set_list.append(copy_url)
- self.resultfiles.add(copy_url)
- set_number += 1
- time.sleep(3)
- set_number -= 1
- LOGGER.info("[ total set number is: %s ]" % set_number)
-
- # only keep one set in each xml file and remove empty set
- test_xml_set_list_empty = []
- if len(test_xml_set_list) > 1:
- test_xml_set_list.reverse()
- for test_xml_set in test_xml_set_list:
- test_xml_set_tmp = etree.parse(test_xml_set)
- set_keep_number = 1
- # LOGGER.debug("[ process set: %s ]" % test_xml_set)
- for temp_suite in test_xml_set_tmp.getiterator('suite'):
- for test_xml_set_temp_set in temp_suite.getiterator('set'):
- if set_keep_number != set_number:
- temp_suite.remove(test_xml_set_temp_set)
- else:
- if not test_xml_set_temp_set.getiterator('testcase'):
- test_xml_set_list_empty.append(test_xml_set)
- set_keep_number += 1
- set_number -= 1
- test_xml_set_tmp.write(test_xml_set)
- for empty_set in test_xml_set_list_empty:
- LOGGER.debug("[ remove empty set: %s ]" % empty_set)
- test_xml_set_list.remove(empty_set)
- self.resultfiles.discard(empty_set)
- if len(test_xml_set_list) > 1:
- test_xml_set_list.reverse()
- return test_xml_set_list
-
- def merge_resultfile(self, start_time, latest_dir):
- """ merge_result_file """
- mergefile = mktemp(suffix='.xml', prefix='tests.', dir=latest_dir)
- #LOGGER.info("\nmergefile: %s ]" % mergefile)
- mergefile = os.path.splitext(mergefile)[0]
- #LOGGER.info("\nmergefile: %s ]" % mergefile)
- mergefile = os.path.splitext(mergefile)[0]
- #LOGGER.info("\nmergefile: %s ]" % mergefile)
- mergefile = "%s.result" % BASENAME(mergefile)
- #LOGGER.info("\nmergefile: %s ]" % mergefile)
- mergefile = "%s.xml" % mergefile
- #LOGGER.info("\nmergefile: %s ]" % mergefile)
- mergefile = JOIN(latest_dir, mergefile)
- #LOGGER.info("\nmergefile: %s ]" % mergefile)
- end_time = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
- LOGGER.info("\n[ test complete at time: %s ]" % end_time)
- LOGGER.debug("[ start merging test result xml files, "\
- "this might take some time, please wait ]")
- LOGGER.debug("[ merge result files into %s ]" % mergefile)
- root = etree.Element('test_definition')
- root.tail = "\n"
- totals = set()
-
- # merge result files
- resultfiles = self.resultfiles
- totals = self.__merge_result(resultfiles, totals)
-
- for total in totals:
- result_xml = etree.parse(total)
- for suite in result_xml.getiterator('suite'):
- if suite.getiterator('testcase'):
- suite.tail = "\n"
- root.append(suite)
- # print test summary
- self.__print_summary()
- # generate actual xml file
- LOGGER.info("[ generate result xml: %s ]" % mergefile)
- if self.skip_all_manual:
- LOGGER.info("[ some results of core manual cases are N/A,"
- "please refer to the above result file ]")
- LOGGER.info("[ merge complete, write to the result file,"
- " this might take some time, please wait ]")
- # get useful info for xml
- # add environment node
- # add summary node
- root.insert(0, get_summary(start_time, end_time))
- root.insert(0, self.__get_environment())
- # add XSL support to testkit-lite
- declaration_text = """<?xml version="1.0" encoding="UTF-8"?>
- <?xml-stylesheet type="text/xsl" href="testresult.xsl"?>\n"""
- #LOGGER.info("\nmergefile: %s ]" % mergefile)
- try:
- with open(mergefile, 'w') as output:
- output.write(declaration_text)
- tree = etree.ElementTree(element=root)
- tree.write(output, xml_declaration=False, encoding='utf-8')
- except IOError as error:
- LOGGER.error(
- "[ Error: merge result file failed, error: %s ]" % error)
- # change <![CDATA[]]> to <![CDATA[]]>
- replace_cdata(mergefile)
- # copy result to -o option
- try:
- if self.resultfile:
- if os.path.splitext(self.resultfile)[-1] == '.xml':
- if not os.path.exists(os.path.dirname(self.resultfile)):
- if len(os.path.dirname(self.resultfile)) > 0:
- os.makedirs(os.path.dirname(self.resultfile))
- LOGGER.info("[ copy result xml to output file:"
- " %s ]" % self.resultfile)
- copyfile(mergefile, self.resultfile)
- else:
- LOGGER.info(
- "[ Please specify and xml file for result output,"
- " not:%s ]" % self.resultfile)
-
- for root, dirs, files in os.walk(latest_dir):
- for afile in files:
- if os.path.splitext(afile)[-1] == '.dlog':
- LOGGER.info("[ copy result dlog to output file:"
- " %s ]" % afile)
- dlogfile = os.path.join(root, afile)
- finalName = afile
- rerunString = self.resultfile.split('.')[-2]
- if(rerunString == 'rerun'):
- extraNames = afile.split('.')
- extraName = ""
- if not extraNames[1].isdigit():
- extraName = extraNames[1] + '.'
- for i in range(2, len(extraNames)-1):
- extraName += extraNames[i]+'.'
- finalName = self.resultfile.split('/')[-1].split('.')[0]+"."+extraName[:-1]+"_rerun_"+str(datetime.now())+".dlog"
- destdfile = os.path.join(\
- os.path.dirname(self.resultfile), finalName)
- print("destdfile = "+destdfile)
- copyfile(dlogfile, destdfile)
-# for afile in os.listdir(os.path.dirname(self.resultfile)):
-# if ".dlog" in afile and "tct" not in afile:
-# os.remove(afile)
-
- except IOError as error:
- LOGGER.error("[ Error: fail to copy the result file to: %s,"
- " please check if you have created its parent directory,"
- " error: %s ]" % (self.resultfile, error))
-
- def __merge_result(self, setresultfiles, totals):
- """ merge set result to total"""
- resultfiles = setresultfiles
- for resultfile in resultfiles:
- totalfile = os.path.splitext(resultfile)[0]
- totalfile = os.path.splitext(totalfile)[0]
- totalfile = os.path.splitext(totalfile)[0]
- totalfile = "%s.total" % totalfile
- totalfile = "%s.xml" % totalfile
- total_xml = etree.parse(totalfile)
- # LOGGER.info("|--[ merge webapi result file: %s ]" % resultfile)
- result_xml = etree.parse(resultfile)
- for total_suite in total_xml.getiterator('suite'):
- for total_set in total_suite.getiterator('set'):
- for result_suite in result_xml.getiterator('suite'):
- for result_set in result_suite.getiterator('set'):
- # when total xml and result xml have same suite
- # name and set name
- self.__merge_result_by_name(\
- result_set, total_set, \
- result_suite, total_suite)
- total_xml.write(totalfile)
- totals.add(totalfile)
- return totals
-
- def __merge_result_by_name(
- self, result_set, total_set, result_suite, total_suite):
- ''' merge result select by name'''
- if result_set.get('name') == total_set.get('name') \
- and result_suite.get('name') == total_suite.get('name'):
- if result_set.get('set_debug_msg'):
- total_set.set("set_debug_msg", result_set.get('set_debug_msg'))
- # set cases that doesn't have result in result \
- # set to N/A
- # append cases from result set to total set
- result_case_iterator = result_set.getiterator(
- 'testcase')
- if result_case_iterator:
- # LOGGER.info("----[ suite: %s, set: %s, time: %s ]"
- #% (result_suite.get('name'), result_set.get('name'),
- # datetime.today().strftime("%Y-%m-%d_%H_%M_%S")))
- for result_case in result_case_iterator:
- try:
- if self.skip_tc and str(self.skip_tc).find(result_case.get('id')) > -1:
- continue
- self.__count_result(result_case)
- total_set.append(result_case)
- except IOError as error:
- LOGGER.error("[ Error: fail to append %s, error: %s ]"
- % (result_case.get('id'), error))
-
- def __count_result(self, result_case):
- """ record the pass,failed,block,N/A case number"""
-
- if not result_case.get('result'):
- result_case.set('result', 'N/A')
- # add empty result node structure for N/A case
- resinfo_elm = etree.Element('result_info')
- res_elm = etree.Element('actual_result')
- start_elm = etree.Element('start')
- end_elm = etree.Element('end')
- stdout_elm = etree.Element('stdout')
- stderr_elm = etree.Element('stderr')
- resinfo_elm.append(res_elm)
- resinfo_elm.append(start_elm)
- resinfo_elm.append(end_elm)
- resinfo_elm.append(stdout_elm)
- resinfo_elm.append(stderr_elm)
- result_case.append(resinfo_elm)
- res_elm.text = 'N/A'
- if result_case.get('result') == "PASS":
- self.testresult_dict["pass"] += 1
- if result_case.get('result') == "FAIL":
- self.testresult_dict["fail"] += 1
- if result_case.get('result') == "BLOCK":
- self.testresult_dict["block"] += 1
- if result_case.get('result') == "N/A":
- self.testresult_dict["not_run"] += 1
-
- def __get_environment(self):
- """ get environment """
- device_info = self.connector.get_device_info()
- build_info = self.connector.get_buildinfo(self.tizenV)
-
- # add environment node
- environment = etree.Element('environment')
- environment.attrib['device_id'] = device_info['device_id']
- environment.attrib['device_model'] = device_info["device_model"]
- environment.attrib['device_name'] = device_info["device_name"]
- environment.attrib['build_id'] = build_info['buildid']
- environment.attrib['host'] = platform.platform()
- environment.attrib['resolution'] = device_info["resolution"]
- environment.attrib['screen_size'] = device_info["screen_size"]
- environment.attrib['device_model'] = build_info['model']
- environment.attrib['manufacturer'] = build_info['manufacturer']
- other = etree.Element('other')
- other.text = ""
- environment.append(other)
- environment.tail = "\n"
-
- return environment
-
- def __print_summary(self):
- """ print test summary infomation"""
- LOGGER.info("[ test summary ]")
- total_case_number = int(self.testresult_dict["pass"]) \
- + int(self.testresult_dict["fail"]) \
- + int(self.testresult_dict["block"]) \
- + int(self.testresult_dict["not_run"])
- LOGGER.info(" [ total case number: %s ]" % (total_case_number))
- if total_case_number == 0:
- LOGGER.info("[Warning: found 0 case from the result files, "
- "if it's not right, please check the test xml files, "
- "or the filter values ]")
- else:
- LOGGER.info(" [ pass rate: %.2f%% ]" % (float(
- self.testresult_dict["pass"]) * 100 / int(total_case_number)))
- LOGGER.info(" [ PASS case number: %s ]" %
- self.testresult_dict["pass"])
- LOGGER.info(" [ FAIL case number: %s ]" %
- self.testresult_dict["fail"])
- LOGGER.info(" [ BLOCK case number: %s ]" %
- self.testresult_dict["block"])
- LOGGER.info(" [ N/A case number: %s ]" %
- self.testresult_dict["not_run"])
-
- def __prepare_external_test_json(self, resultfile):
- """Run external test"""
- parameters = {}
- xml_set_tmp = resultfile
- # split set_xml by <case> get case parameters
- LOGGER.debug("[ split xml: %s by <case> ]" % xml_set_tmp)
- LOGGER.debug("[ this might take some time, please wait ]")
- try:
- parse_tree = etree.parse(xml_set_tmp)
- root_em = parse_tree.getroot()
- case_tmp = []
- for tset in root_em.getiterator('set'):
- case_order = 1
- parameters.setdefault(
- "casecount", str(len(tset.getiterator('testcase')))
- )
- parameters.setdefault("current_set_name", xml_set_tmp)
-
- for tcase in tset.getiterator('testcase'):
- if self.skip_tc and str(self.skip_tc).find(tcase.get('id')) > -1:
- continue
-
- case_detail_tmp = {}
- step_tmp = []
- parameters.setdefault(
- "exetype", tcase.get('execution_type')
- )
-
- parameters.setdefault("type", tcase.get('type'))
- case_detail_tmp.setdefault("case_id", tcase.get('id'))
- case_detail_tmp.setdefault("purpose", tcase.get('purpose'))
- case_detail_tmp.setdefault("order", str(case_order))
- case_detail_tmp.setdefault("onload_delay", "3")
-
- if tcase.find('description/test_script_entry') is not None:
- tc_entry = tcase.find(
- 'description/test_script_entry').text
- if not tc_entry:
- tc_entry = ""
-
- tc_entry = tc_entry.replace(DEVICE_SUITE_TARGET_30_STR,DEVICE_SUITE_TARGET_30)
- tc_entry = tc_entry.replace(DEVICE_EXECUTION_MODE_30_STR,DEVICE_EXECUTION_MODE_30)
-
- case_detail_tmp["entry"] = self.test_prefix + tc_entry
- if tcase.find(
- 'description/test_script_entry')\
- .get('timeout'):
- case_detail_tmp["timeout"] = tcase.find(
- 'description/test_script_entry'
- ).get('timeout')
- if tcase.find(
- 'description/test_script_entry'
- ).get('test_script_expected_result'):
- case_detail_tmp["expected_result"] = tcase.find(
- 'description/test_script_entry'
- ).get('test_script_expected_result')
- for this_step in tcase.getiterator("step"):
- step_detail_tmp = {}
- step_detail_tmp.setdefault("order", "1")
- step_detail_tmp["order"] = str(this_step.get('order'))
-
- if this_step.find("step_desc") is not None:
- text = this_step.find("step_desc").text
- if text is not None:
- step_detail_tmp["step_desc"] = text
-
- if this_step.find("expected") is not None:
- text = this_step.find("expected").text
- if text is not None:
- step_detail_tmp["expected"] = text
-
- step_tmp.append(step_detail_tmp)
-
- case_detail_tmp['steps'] = step_tmp
-
- if tcase.find('description/pre_condition') is not None:
- text = tcase.find('description/pre_condition').text
- if text is not None:
- case_detail_tmp["pre_condition"] = text
-
- if tcase.find('description/post_condition') is not None:
- text = tcase.find('description/post_condition').text
- if text is not None:
- case_detail_tmp['post_condition'] = text
-
- if tcase.get('onload_delay') is not None:
- case_detail_tmp[
- 'onload_delay'] = tcase.get('onload_delay')
- # Check performance test
- if tcase.find('measurement') is not None:
- measures = tcase.getiterator('measurement')
- measures_array = []
- for measure in measures:
- measure_json = {}
- measure_json['name'] = measure.get('name')
- measure_json['file'] = measure.get('file')
- measures_array.append(measure_json)
- case_detail_tmp['measures'] = measures_array
- case_tmp.append(case_detail_tmp)
- case_order += 1
- parameters.setdefault("cases", case_tmp)
- if self.bdryrun:
- parameters.setdefault("dryrun", True)
- self.set_parameters = parameters
-
- except IOError as error:
- LOGGER.error("[ Error: fail to prepare cases parameters, "
- "error: %s ]\n" % error)
- return False
- return True
-
- def apply_filter(self, root_em):
- """ apply filter """
- rules = self.filter_rules
- for tsuite in root_em.getiterator('suite'):
- if rules.get('suite'):
- if tsuite.get('name') not in rules['suite']:
- root_em.remove(tsuite)
- for tset in tsuite.getiterator('set'):
- if rules.get('set'):
- if tset.get('name') not in rules['set']:
- tsuite.remove(tset)
-
- for tsuite in root_em.getiterator('suite'):
- for tset in tsuite.getiterator('set'):
- # if there are capabilities ,do filter
- if self.has_capability:
- tset_status = self.__apply_capability_filter_set(tset)
- if not tset_status:
- tsuite.remove(tset)
- continue
- for tcase in tset.getiterator('testcase'):
- if not self.__apply_filter_case_check(tcase):
- tset.remove(tcase)
-
- def __apply_filter_case_check(self, tcase):
- """filter cases"""
- rules = self.filter_rules
- for key in rules.iterkeys():
- if key in ["suite", "set"]:
- continue
-
- #suhee.yoo : priority filter
- if key in ["priority"]:
- if not tcase.get(key):
- return False
-
- # Check attribute
- t_val = tcase.get(key)
- if t_val:
- if not t_val in rules[key]:
- return False
- else:
- # Check sub-element
- items = tcase.getiterator(key)
- if items:
- t_val = []
- for i in items:
- t_val.append(i.text)
- if len(set(rules[key]) & set(t_val)) == 0:
- return False
- return True
-
- def __apply_capability_filter_set(self, tset):
- """ check the set required capability with self.capabilities """
-
- for tcaps in tset.getiterator('capabilities'):
- for tcap in tcaps.getiterator('capability'):
- capname = None
- capvalue = None
- capname = tcap.get('name').lower()
- if tcap.find('value') is not None:
- capvalue = tcap.find('value').text
-
- if capname in self.capabilities:
- if capvalue is not None:
- if capvalue != self.capabilities[capname]:
- # if capability value is not equal ,remove the case
- return False
- else:
- # if does not hava this capability ,remove case
- return False
- return True
-
- # sdx@kooltux.org: parse measures returned by test script
- # and insert in XML result
- # see xsd/test_definition.xsd: measurementType
- _MEASURE_ATTRIBUTES = ['name', 'value', 'unit',
- 'target', 'failure', 'power']
-
- def __insert_measures(self, case, buf, pattern="###[MEASURE]###"):
- """ get measures """
- measures = self.__extract_measures(buf, pattern)
- for measure in measures:
- m_elm = etree.Element('measurement')
- for key in measure:
- m_elm.attrib[key] = measure[key]
- case.append(m_elm)
-
- def __extract_measures(self, buf, pattern):
- """
- This function extracts lines from <buf> containing the defined
- <pattern>. For each line containing the pattern, it extracts the
- string to the end of line Then it splits the content in multiple
- fields using the defined separator <field_sep> and maps the fields
- to measurement attributes defined in xsd. Finally, a list containing
- all measurement objects found in input buffer is returned
- """
- out = []
- for line in buf.split("\n"):
- pos = line.find(pattern)
- if pos < 0:
- continue
-
- measure = {}
- elts = collections.deque(line[pos + len(pattern):].split(':'))
- for k in self._MEASURE_ATTRIBUTES:
- if len(elts) == 0:
- measure[k] = ''
- else:
- measure[k] = elts.popleft()
-
- # don't accept unnamed measure
- if measure['name'] != '':
- out.append(measure)
- return out
-
- def __init_com_module(self, testxml):
- """
- send init test to com_module
- if webapi test,com_module will start testkit-stub
- else com_module send the test case to devices
- """
- starup_prms = self.__prepare_starup_parameters(testxml)
- # init stub and get the session_id
- session_id = self.testworker.init_test(starup_prms)
- if session_id == None:
- LOGGER.error("[ Error: Initialization Error]")
- return False
- else:
- self.set_session_id(session_id)
- return True
-
- def __prepare_starup_parameters(self, testxml):
- """ prepare_starup_parameters """
-
- starup_parameters = {}
- LOGGER.info("[ prepare_startup_parameters ]")
- try:
- parse_tree = etree.parse(testxml)
- tsuite = parse_tree.getroot().getiterator('suite')[0]
- tset = parse_tree.getroot().getiterator('set')[0]
- if tset.get("launcher") is not None:
- starup_parameters['test-launcher'] = tset.get("launcher")
- else:
- starup_parameters['test-launcher'] = tsuite.get("launcher")
- starup_parameters['testsuite-name'] = tsuite.get("name")
- starup_parameters['testset-name'] = tset.get("name")
- starup_parameters['stub-name'] = self.stub_name
- if self.external_test is not None:
- starup_parameters['external-test'] = self.external_test
- starup_parameters['debug'] = self.debug
- starup_parameters['test_prefix'] = self.test_prefix
- if self.rerun:
- starup_parameters['rerun'] = self.rerun
- if len(self.capabilities) > 0:
- starup_parameters['capability'] = self.capabilities
- if self.tizenV is not None:
- starup_parameters['tizen-version'] = self.tizenV
- if self.stub_port is not None:
- starup_parameters['stub-port'] = self.stub_port
-
- except IOError as error:
- LOGGER.error(
- "[ Error: prepare startup parameters, error: %s ]" % error)
- return starup_parameters
-
- def __check_test_status(self):
- '''
- get_test_status from com_module
- check the status
- if end ,return ture; else return False
- '''
- # check test running or end
- # if the status id end return True ,else return False
-
- session_status = self.testworker.get_test_status(self.session_id)
- # session_status["finished"] == "0" is running
- # session_status["finished"] == "1" is end
- if not session_status == None:
- if session_status["finished"] == "0":
- progress_msg_list = session_status["msg"]
- for line in progress_msg_list:
- LOGGER.info(line)
- return False
- elif session_status["finished"] == "1":
- return True
- else:
- LOGGER.error("[ session status error ,pls finalize test ]\n")
- # return True to finished this set ,becasue server error
- return True
-
- def finalize_test(self, sessionid):
- '''shut_down testkit-stub'''
- try:
- self.testworker.finalize_test(sessionid)
- except Exception as error:
- LOGGER.error("[ Error: fail to close webapi http server, "
- "error: %s ]" % error)
-
- def get_capability(self, file_name):
- """get_capability from file """
-
- capability_xml = file_name
- capabilities = {}
- try:
- parse_tree = etree.parse(capability_xml)
- root_em = parse_tree.getroot()
- for tcap in root_em.getiterator('capability'):
- capability = get_capability_form_node(tcap)
- capabilities = dict(capabilities, **capability)
-
- self.set_capability(capabilities)
- return True
- except IOError as error:
- LOGGER.error(
- "[ Error: fail to parse capability xml, error: %s ]" % error)
- return False
-
- def __write_set_result(self, testxmlfile, result):
- '''
- get the result JSON form com_module,
- write them to orignal testxmlfile
-
- '''
- # write the set_result to set_xml
- set_result_xml = testxmlfile
- # covert JOSN to python dict string
- set_result = result
- if 'resultfile' in set_result:
- self.__write_file_result(set_result_xml, set_result)
- else:
- write_json_result(set_result_xml, set_result)
-
- def __write_file_result(self, set_result_xml, set_result):
- """write xml result file"""
- result_file = set_result['resultfile']
- try:
- if self.rerun:
- LOGGER.info("[ Web UI FW Unit Test Does not support rerun.\
- Result should be N/A ]\n")
- else:
- test_tree = etree.parse(set_result_xml)
- test_em = test_tree.getroot()
- result_tree = etree.parse(result_file)
- result_em = result_tree.getroot()
- dubug_file = os.path.basename(set_result_xml)
- dubug_file = os.path.splitext(dubug_file)[0] + '.dlog'
- for result_suite in result_em.getiterator('suite'):
- for result_set in result_suite.getiterator('set'):
- for test_suite in test_em.getiterator('suite'):
- for test_set in test_suite.getiterator('set'):
- if result_set.get('name') == \
- test_set.get('name'):
- result_set.set("set_debug_msg", dubug_file)
- test_suite.remove(test_set)
- test_suite.append(result_set)
- test_tree.write(set_result_xml)
- os.remove(result_file)
- LOGGER.info("[ cases result saved to resultfile ]\n")
- except OSError as error:
- traceback.print_exc()
- LOGGER.error(
- "[ Error: fail to write cases result, error: %s ]\n" % error)
-
-
-def get_capability_form_node(capability_em):
- ''' splite capability key and value form element tree'''
- tmp_key = ''
- capability = {}
- tcap = capability_em
- if tcap.get("name"):
- tmp_key = tcap.get("name").lower()
-
- if tcap.get("type").lower() == 'boolean':
- if tcap.get("support").lower() == 'true':
- capability[tmp_key] = True
-
- if tcap.get("type").lower() == 'integer':
- if tcap.get("support").lower() == 'true':
- if tcap.getiterator(
- "value") and tcap.find("value").text is not None:
- capability[tmp_key] = int(tcap.find("value").text)
-
- if tcap.get("type").lower() == 'string':
- if tcap.get("support").lower() == 'true':
- if tcap.getiterator(
- "value") and tcap.find("value").text is not None:
- capability[tmp_key] = tcap.find("value").text
-
- return capability
-
-
-def get_version_info():
- """
- get testkit tool version ,just read the version in VERSION file
- VERSION file must put in /opt/testkit/lite2.4/
- """
- try:
- config = ConfigParser.ConfigParser()
- if platform.system() == "Linux":
- config.read('/opt/testkit/lite2.4/VERSION')
- else:
- version_file = os.path.join(sys.path[0], 'VERSION')
- config.read(version_file)
- version = config.get('public_version', 'version')
- return version
- except KeyError as error:
- LOGGER.error(
- "[ Error: fail to parse version info, error: %s ]\n" % error)
- return ""
-
-
-def replace_cdata(file_name):
- """ replace some character"""
- try:
- abs_path = mktemp()
- new_file = open(abs_path, 'w')
- old_file = open(file_name)
- for line in old_file:
- line_temp = line.replace('<![CDATA', '<![CDATA')
- new_file.write(line_temp.replace(']]>', ']]>'))
- new_file.close()
- old_file.close()
- remove(file_name)
- move(abs_path, file_name)
- except IOError as error:
- LOGGER.error("[ Error: fail to replace cdata in the result file, "
- "error: %s ]\n" % error)
-
-
-def extract_notes(buf, pattern):
- """util func to split lines in buffer, search for pattern on each line
- then concatenate remaining content in output buffer"""
- out = ""
- for line in buf.split("\n"):
- pos = line.find(pattern)
- if pos >= 0:
- out += line[pos + len(pattern):] + "\n"
- return out
-
-# sdx@kooltux.org: parse notes in buffer and insert them in XML result
-
-
-def insert_notes(case, buf, pattern="###[NOTE]###"):
- """ insert notes"""
- desc = case.find('description')
- if desc is None:
- return
-
- notes_elm = desc.find('notes')
- if notes_elm is None:
- notes_elm = etree.Element('notes')
- desc.append(notes_elm)
- if notes_elm.text is None:
- notes_elm.text = extract_notes(buf, pattern)
- else:
- notes_elm.text += "\n" + extract_notes(buf, pattern)
-
-
-def get_summary(start_time, end_time):
- """ set summary node """
- summary = etree.Element('summary')
- summary.attrib['test_plan_name'] = "Empty test_plan_name"
- start_at = etree.Element('start_at')
- start_at.text = start_time
- end_at = etree.Element('end_at')
- end_at.text = end_time
- summary.append(start_at)
- summary.append(end_at)
- summary.tail = "\n "
- return summary
-
-
-def write_json_result(set_result_xml, set_result):
- ''' fetch result form JSON'''
-
- case_results = set_result["cases"]
- try:
- parse_tree = etree.parse(set_result_xml)
- root_em = parse_tree.getroot()
- dubug_file = os.path.basename(set_result_xml)
- dubug_file = os.path.splitext(dubug_file)[0] + '.dlog'
- for tset in root_em.getiterator('set'):
- tset.set("set_debug_msg", dubug_file)
- for tcase in tset.getiterator('testcase'):
- for case_result in case_results:
- if tcase.get("id") == case_result['case_id']:
- tcase.set('result', case_result['result'].upper())
- # Check performance test
- if tcase.find('measurement') is not None:
- for measurement in tcase.getiterator(
- 'measurement'):
- if 'measures' in case_result:
- m_results = case_result['measures']
- for m_result in m_results:
- if measurement.get('name') == \
- m_result['name'] and 'value' in m_result:
- measurement.set(
- 'value', m_result[
- 'value'])
- if tcase.find("./result_info") is not None:
- tcase.remove(tcase.find("./result_info"))
- result_info = etree.SubElement(tcase, "result_info")
- actual_result = etree.SubElement(
- result_info, "actual_result")
- actual_result.text = case_result['result'].upper()
-
- start = etree.SubElement(result_info, "start")
- end = etree.SubElement(result_info, "end")
- stdout = etree.SubElement(result_info, "stdout")
- stderr = etree.SubElement(result_info, "stderr")
- if 'start_at' in case_result:
- start.text = case_result['start_at']
- if 'end_at' in case_result:
- end.text = case_result['end_at']
- if 'stdout' in case_result:
- stdout.text = str2xmlstr(case_result['stdout'])
- if 'stderr' in case_result:
- stderr.text = str2xmlstr(case_result['stderr'])
- parse_tree.write(set_result_xml)
-
- LOGGER.info("[ cases result saved to resultfile ]\n")
- except IOError as error:
- traceback.print_exc()
- LOGGER.error(
- "[ Error: fail to write cases result, error: %s ]\n" % error)
-
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston,
-# MA 02110-1301, USA.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-""" The implementation test worker"""
-
-import os
-import time
-import threading
-import uuid
-import ConfigParser
-
-from datetime import datetime
-from commodule.log import LOGGER
-from commodule.httprequest import get_url, http_request
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = ConfigParser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
-DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-
-CNT_RETRY = 10
-DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
-UIFW_MAX_TIME = 300
-UIFW_MAX_WRITE_TIME = 10
-UIFW_RESULT = os.path.join(DEVICE_SUITE_TARGET_24, "Documents/tcresult")
-UIFW_SET_NUM = 0
-LAUNCH_ERROR = 1
-BLOCK_ERROR = 3
-
-
-class TestSetResut(object):
-
- """ test result """
-
- _progress = "execute case: %s # %s...(%s)"
- _mutex = threading.Lock()
-
- def __init__(self, testsuite_name="", testset_name=""):
- self._suite_name = testsuite_name
- self._set_name = testset_name
- self._result = {"cases": []}
- self._finished = 0
-
- def set_status(self, flag=0):
- """set finished tag"""
- self._mutex.acquire()
- self._finished = flag
- self._mutex.release()
-
- def get_status(self):
- """return finished tag"""
- self._mutex.acquire()
- flag = self._finished
- self._mutex.release()
- return flag
-
- def set_result(self, tresult):
- """set cases result to result buffer"""
- self._mutex.acquire()
- self._result = tresult
- self._mutex.release()
-
- def extend_result(self, cases_result=None, print_out=True):
- """update cases result to the result buffer"""
- self._mutex.acquire()
- if cases_result is not None:
- self._result["cases"].extend(cases_result)
-
- if print_out:
- for case_it in cases_result:
- LOGGER.info(self._progress %
- (self._suite_name, case_it['case_id'], \
- case_it['result']))
- if case_it['result'].lower() in ['fail', 'block'] \
- and 'stdout' in case_it:
- LOGGER.info(case_it['stdout'])
- self._mutex.release()
-
- def get_result(self):
- """get cases result from the result buffer"""
- self._mutex.acquire()
- result = self._result
- self._mutex.release()
- return result
-
-
-def _print_dlog(dlog_file):
- if os.path.exists(dlog_file):
- LOGGER.info('[ start of dlog message ]')
- readbuff = file(dlog_file, "r")
- for line in readbuff.readlines():
- LOGGER.info(line.strip('\n'))
- LOGGER.info('[ end of dlog message ]')
-
-
-def _core_test_exec(conn, test_set_name, exetype, cases_queue, result_obj, \
- tizen_version):
- """function for running core tests"""
- exetype = exetype.lower()
- total_count = len(cases_queue)
- current_idx = 0
- manual_skip_all = False
- result_list = []
- for test_case in cases_queue:
- if result_obj.get_status() == 1:
- break
-
- current_idx += 1
- core_cmd = ""
- if "entry" in test_case:
- core_cmd = test_case["entry"]
- else:
- LOGGER.info(
- "[ Warnning: test script is empty,"
- " please check your test xml file ]")
- continue
- expected_result = test_case.get('expected_result', '0')
- time_out = int(test_case.get('timeout', '90'))
- measures = test_case.get('measures', [])
- retmeasures = []
-
- LOGGER.info("\n[%s:%s] TestCase: %s\n"
- "TestEntry: %s"
- % (current_idx, total_count, test_case['case_id'], core_cmd))
- strtime = datetime.now().strftime(DATE_FORMAT_STR)
- LOGGER.info("start: %s" % strtime)
- test_case["start_at"] = strtime
- if exetype == 'auto':
- return_code, stdout, stderr = conn.shell_cmd_ext(
- core_cmd, time_out, False)
-
- if return_code is not None and return_code != "timeout":
- test_case["result"] = "pass" if str(
- return_code) == expected_result else "fail"
- test_case["stdout"] = stdout
- test_case["stderr"] = stderr
- for item in measures:
- ind = item['name']
- fname = item['file']
- if fname is None:
- continue
- tmpname = os.path.expanduser("~") + os.sep + "mea_tmp"
- if conn.download_file(fname, tmpname):
- try:
- config = ConfigParser.ConfigParser()
- config.read(tmpname)
- item['value'] = config.get(ind, 'value')
- retmeasures.append(item)
- os.remove(tmpname)
- except IOError as error:
- LOGGER.error(
- "[ Error: fail to parse value,"
- " error:%s ]\n" % error)
- test_case["measures"] = retmeasures
- else:
- test_case["result"] = "BLOCK"
- test_case["stdout"] = stdout
- test_case["stderr"] = stderr
- elif exetype == 'manual':
- # handle manual core cases
- try:
- # LOGGER.infopre-condition info
- if "pre_condition" in test_case:
- LOGGER.info("\n****\nPre-condition: %s\n ****\n"
- % test_case['pre_condition'])
- # LOGGER.infostep info
- if "steps" in test_case:
- for step in test_case['steps']:
- LOGGER.info(
- "********************\n"
- "Step Order: %s" % step['order'])
- LOGGER.info("Step Desc: %s" % step['step_desc'])
- LOGGER.info(
- "Expected: %s\n********************\n"
- % step['expected'])
- if manual_skip_all:
- test_case["result"] = "N/A"
- else:
- while True:
- test_result = raw_input(
- '[ please input case result ]'
- ' (p^PASS, f^FAIL, b^BLOCK, n^Next, d^Done):')
- if test_result.lower() == 'p':
- test_case["result"] = "PASS"
- break
- elif test_result.lower() == 'f':
- test_case["result"] = "FAIL"
- break
- elif test_result.lower() == 'b':
- test_case["result"] = "BLOCK"
- break
- elif test_result.lower() == 'n':
- test_case["result"] = "N/A"
- break
- elif test_result.lower() == 'd':
- manual_skip_all = True
- test_case["result"] = "N/A"
- break
- else:
- LOGGER.info(
- "[ Warnning: you input: '%s' is invalid,"
- " please try again ]" % test_result)
- except IOError as error:
- LOGGER.info(
- "[ Error: fail to get core manual test step,"
- " error: %s ]\n" % error)
- strtime = datetime.now().strftime(DATE_FORMAT_STR)
- LOGGER.info("end : %s" % strtime)
- test_case["end_at"] = strtime
- LOGGER.info("execute case: %s" % test_case["result"])
- result_list.append(test_case)
-
- result_obj.extend_result(result_list, False)
- result_obj.set_status(1)
-
-
-def _web_test_exec(conn, server_url, test_web_app, exetype, cases_queue, \
- result_obj, tizen_version):
- """function for running web tests"""
- exetype = exetype.lower()
- test_set_finished = False
- err_cnt = 0
- relaunch_cnt = 0
- for test_group in cases_queue:
- if test_set_finished:
- break
-
- ret = http_request(
- get_url(server_url, "/set_testcase"), "POST", test_group, 30)
- if ret is None:
- LOGGER.error(
- "[ set testcases timeout, please check device! ]")
- result_obj.set_status(1)
- break
-
- if not conn.launch_app(test_web_app):
- result_obj.set_status(1)
- break
-
- while True:
- if result_obj.get_status() == 1:
- test_set_finished = True
- break
- ret = http_request(
- get_url(server_url, "/check_server_status"), "GET", {})
- if ret is None:
- err_cnt += 1
- LOGGER.info("/check_server_status : %s " % ret)
- if err_cnt >= CNT_RETRY:
- LOGGER.error(
- "[ check server status time out, \
- please check device! ]")
- test_set_finished = True
- result_obj.set_status(1)
- break
- else:
- result_cases = ret.get("cases")
- error_code = ret.get("error_code")
- if error_code is not None:
- if not conn.launch_app(test_web_app):
- test_set_finished = True
- result_obj.set_status(1)
- break
- if error_code == LAUNCH_ERROR:
- LOGGER.error("[ERROR : test app no response, hang or not launched!]")
- relaunch_cnt += 1
- if relaunch_cnt >= 3:
- test_set_finished = True
- result_obj.set_status(1)
- break
- elif error_code == BLOCK_ERROR:
- relaunch_cnt = 0
- else:
- err_cnt = 0
- relaunch_cnt = 0
-
- if result_cases is not None and len(result_cases):
- result_obj.extend_result(result_cases)
- elif exetype == 'manual':
- LOGGER.info(
- "[ please execute manual cases ]\r\n")
-
- if ret["finished"] == 1:
- test_set_finished = True
- result_obj.set_status(1)
- break
- elif ret["block_finished"] == 1:
- break
- time.sleep(2)
-
-
-def _webuifw_test_exec(conn, test_web_app, test_session, test_set_name, \
- exetype, cases_queue, result_obj):
- """function for running webuifw tests"""
- global UIFW_SET_NUM
- UIFW_SET_NUM = UIFW_SET_NUM + 1
- set_UIFW_RESULT = UIFW_RESULT + "_" + str(UIFW_SET_NUM) + ".xml"
- result_obj.set_status(0)
- result_obj.set_result({"resultfile": ""})
- ls_cmd = "ls -l %s" % set_UIFW_RESULT
- sz_cmd = "du -hk %s " % set_UIFW_RESULT
- time_out = UIFW_MAX_TIME
- rm_cmd = "rm " + os.path.join(DEVICE_SUITE_TARGET_24, "Documents/tcresult*.xml")
-
- if exetype == "auto":
- conn.shell_cmd(rm_cmd)
- UIFW_SET_NUM = 1
- LOGGER.info('[webuifw] start test executing')
- if not conn.launch_app(test_web_app):
- LOGGER.info("[ launch test app \"%s\" failed! ]" \
- % str(test_web_app))
- result_obj.set_result({"resultfile": ""})
- result_obj.set_status(1)
-
- result_file = os.path.expanduser("~") + os.sep + test_session + "_uifw.xml"
-
- while time_out > 0:
- LOGGER.info('[webuifw] waiting for test completed...')
- exit_code, ret = conn.shell_cmd(ls_cmd)
- if not 'No such file or directory' in ret[0]:
- exit_code, ret = conn.shell_cmd(sz_cmd)
- f_size = int(ret[0].split("\t")[0])
- if f_size > 0:
- break
- if time_out > UIFW_MAX_WRITE_TIME:
- time_out = UIFW_MAX_WRITE_TIME
- time.sleep(2)
- time_out -= 2
-
- LOGGER.info('[webuifw] end test executing')
- if conn.download_file(set_UIFW_RESULT, result_file):
- result_obj.set_result({"resultfile": result_file})
- for test_case in cases_queue:
- LOGGER.info("[webuifw] execute case: %s # %s" %
- (test_set_name, test_case['case_id']))
- result_obj.set_status(1)
-
-
-class TestWorker(object):
-
- """Test executor for testkit-lite"""
-
- def __init__(self, client=None):
- super(TestWorker, self).__init__()
- self.conn = client
- self.tizen_version = ""
- self.server_url = None
- self.result_obj = None
- self.opts = dict({'block_size': 300,
- 'test_type': None,
- 'auto_iu': False,
- 'fuzzy_match': False,
- 'self_exec': False,
- 'self_repeat': False,
- 'debug_mode': False
- })
-
- def set_TizenVersion(self, tizenversion):
- self.tizen_version = tizenversion
-
- def __init_test_stub(self, stub_app, stub_port, debug_opt):
- # init testkit-stub deamon process
- timecnt = 0
- blaunched = False
- while timecnt < CNT_RETRY:
- if not self.conn.check_process(stub_app):
- LOGGER.info(\
- "[ no stub process activated, now try to launch %s ]"\
- % stub_app)
- self.conn.launch_stub(stub_app, stub_port, debug_opt)
- timecnt += 1
- else:
- blaunched = True
- break
-
- if not blaunched:
- LOGGER.info("[ launch stub process failed! ]")
- return False
-
- if self.server_url is None:
- self.server_url = self.conn.get_server_url(stub_port)
-
- timecnt = 0
- blaunched = False
- while timecnt < CNT_RETRY:
- ret = http_request(get_url(
- self.server_url, "/check_server_status"), "GET", {})
- if ret is None:
- LOGGER.info("[ check server status, not ready yet! ]")
- timecnt += 1
- time.sleep(1)
- else:
- blaunched = True
- break
- return blaunched
-
- def __init_webtest_opt(self, params):
- """init the test runtime, mainly process the star up of test stub"""
- if params is None:
- return None
-
- session_id = str(uuid.uuid1())
- cmdline = ""
- debug_opt = ""
- stub_app = params.get('stub-name', 'testkit-stub')
- stub_port = params.get('stub-port', '8000')
- test_launcher = params.get('external-test', '')
- testsuite_name = params.get('testsuite-name', '')
- testset_name = params.get('testset-name', '')
- capability_opt = params.get("capability", None)
- client_cmds = params.get('test-launcher', '').strip().split()
- wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
- self.opts['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
- self.opts['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
- self.opts['self_exec'] = wrt_tag.find('a') != -1
- self.opts['self_repeat'] = wrt_tag.find('r') != -1
- self.opts['debug_mode'] = params.get("debug", False)
-
- test_opt = self.conn.get_launcher_opt(
- test_launcher, testsuite_name, testset_name, fuzzy_match, auto_iu)
- if test_opt is None:
- LOGGER.info("[ init the test options, get failed ]")
- return None
-
- # to be removed in later version
- test_opt["suite_id"] = test_opt["test_app_id"]
- self.opts.update(test_opt)
-
- # uifw, this suite don't need stub
- if self.opts['self_exec'] or self.opts['self_repeat']:
- self.opts['test_type'] = "jqunit"
- return session_id
-
- # enable debug information
- if self.opts['debug_mode']:
- debug_opt = '--debug'
-
- if self.__init_test_stub(stub_app, stub_port, debug_opt):
- ret = http_request(get_url(
- self.server_url, "/init_test"), "POST", test_opt)
- if ret is None:
- LOGGER.info("[ init test suite failed! ]")
- return None
- elif "error_code" in ret:
- LOGGER.info("[ init test suite, "
- "get error code %d ! ]" % ret["error_code"])
- return None
-
- if capability_opt is not None:
- ret = http_request(get_url(self.server_url,
- "/set_capability"),
- "POST", capability_opt)
- return session_id
- else:
- LOGGER.info("[ Init test failed ! ]")
- return None
-
- def init_test(self, params):
- """init the test envrionment"""
- self.opts['testset_name'] = params.get('testset-name', '')
- self.opts['testsuite_name'] = params.get('testsuite-name', '')
- if params.get('test-launcher') is not None:
- self.opts['test_type'] = "webapi"
- return self.__init_webtest_opt(params)
- else:
- self.opts['test_type'] = "coreapi"
- return str(uuid.uuid1())
-
- def __run_core_test(self, sessionid, test_set_name, exetype, cases):
- """
- process the execution for core api test
- """
- self.opts['async_th'] = threading.Thread(
- target=_core_test_exec,
- args=(
- self.conn, test_set_name, exetype, cases, self.result_obj,\
- self.tizen_version)
- )
- self.opts['async_th'].start()
- return True
-
- def __run_jqt_test(self, sessionid, test_set_name, cases):
- """
- process the execution for Qunit testing
- """
- exetype = "auto" if self.opts['self_exec'] else ""
- self.opts['async_th'] = threading.Thread(
- target=_webuifw_test_exec,
- args=(
- self.conn, self.opts['test_app_id'], sessionid, test_set_name,\
- exetype, cases, self.result_obj)
- )
- self.opts['async_th'].start()
- return True
-
- def __run_web_test(self, sessionid, test_set_name, exetype, ctype, cases):
- """
- process the execution for web api test
- may be splitted to serveral blocks,
- with the unit size defined by block_size
- """
- case_count = len(cases)
- blknum = 0
- if case_count % self.opts['block_size'] == 0:
- blknum = case_count / self.opts['block_size']
- else:
- blknum = case_count / self.opts['block_size'] + 1
-
- idx = 1
- test_set_queues = []
- while idx <= blknum:
- block_data = {}
- block_data["exetype"] = exetype
- block_data["type"] = ctype
- block_data["totalBlk"] = str(blknum)
- block_data["currentBlk"] = str(idx)
- block_data["casecount"] = str(case_count)
- start = (idx - 1) * self.opts['block_size']
- if idx == blknum:
- end = case_count
- else:
- end = idx * self.opts['block_size']
- block_data["cases"] = cases[start:end]
- test_set_queues.append(block_data)
- idx += 1
- self.opts['async_th'] = threading.Thread(
- target=_web_test_exec,
- args=(
- self.conn, self.server_url, self.opts['test_app_id'], exetype,\
- test_set_queues, self.result_obj, self.tizen_version)
- )
- self.opts['async_th'].start()
- return True
-
- def run_test(self, sessionid, test_set):
- """
- process the execution for a test set
- """
- if sessionid is None:
- return False
-
- if not "cases" in test_set:
- return False
-
- # start debug trace thread
- dlogfile = test_set['current_set_name'].replace('.xml', '.dlog')
- self.opts['dlog_file'] = dlogfile
- self.conn.start_debug(dlogfile)
- time.sleep(1)
-
- self.result_obj = TestSetResut(
- self.opts['testsuite_name'], self.opts['testset_name'])
-
- cases, exetype, ctype = test_set[
- "cases"], test_set["exetype"], test_set["type"]
-
- devid = self.conn.get_devid()
- if self.conn.is_NE_mode() or (devid and devid.find('None') > -1):
- result_list = []
- for case in cases:
- test_case = {}
- test_case['case_id'] = case['case_id']
- test_case['result'] = 'N/A'
- if devid.find('None') > -1:
- test_case['stdout'] = "target not found"
- else:
- issue_num = int(self.conn.is_NE_mode())
- err_msg = "precondition failed "
- if issue_num == 1:
- err_msg += "(not connected to wifi)"
- elif issue_num == 2:
- err_msg += "(not set email account)"
- elif issue_num == 3:
- err_msg += "(not available device network)"
- elif issue_num == 4:
- err_msg += "(not enable bluetooth)"
- elif issue_num == 5:
- err_msg += "(not enable nfc)"
- elif issue_num == 6:
- err_msg += "(not available sim card)"
- test_case['stdout'] = err_msg
-
- result_list.append(test_case)
-
- self.result_obj.extend_result(result_list)
- self.result_obj.set_status(1)
- return True
-
- if self.opts['test_type'] == "webapi":
- return self.__run_web_test(sessionid, \
- self.opts['testset_name'], exetype, ctype, cases)
- elif self.opts['test_type'] == "coreapi":
- return self.__run_core_test(sessionid, \
- self.opts['testset_name'], exetype, cases)
- elif self.opts['test_type'] == "jqunit":
- return self.__run_jqt_test(sessionid, \
- self.opts['testset_name'], cases)
- else:
- LOGGER.info("[ unsupported test suite type ! ]")
- return False
-
- def get_test_status(self, sessionid):
- """poll the test task status"""
- if sessionid is None:
- return None
- result = {}
- result["msg"] = []
- result["finished"] = str(self.result_obj.get_status())
- return result
-
- def get_test_result(self, sessionid):
- """get the test result for a test set """
- result = {}
- if sessionid is None:
- return result
-
- result = self.result_obj.get_result()
- return result
-
- def finalize_test(self, sessionid):
- """clear the test stub and related resources"""
- if sessionid is None:
- return False
-
- self.result_obj.set_status(1)
-
- # stop test app
- if self.opts['test_type'] == "webapi":
- self.conn.kill_app(self.opts['test_app_id'])
- # uninstall test app
- if self.opts['auto_iu']:
- self.conn.uninstall_app(self.opts['test_app_id'])
-
- # stop debug thread
- self.conn.stop_debug()
-
- # add dlog output for debug
- if self.opts['debug_mode']:
- _print_dlog(self.opts['dlog_file'])
-
- return True
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitwebdir = /opt/testkit/web
-dist_testkitweb_DATA = *.html *.js
+++ /dev/null
-<!doctype html>
-<!--
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Wang, Jing <jing.j.wang@intel.com>
-# Tang, Shaofeng <shaofeng.tang@intel.com>
--->
-<head>
-<meta name="viewport" content="width=device-width">
-<script src="jquery.js"></script>
-<script>
- var iTest = 0;
-
- var Tests;
- var statusNode;
- var oTestFrame;
- var statusFrame;
- var frmset;
- var xmldoc;
-
- var startTime;
- var defTime = 2000;
- var timeout;
- var winCloseTimeout = 5000;
- var blockCheckTime = 10;
-
- var server = "http://127.0.0.1:8000";
- var need_ajax = true;
-
- var hidestatus;
- var ttestsuite;
- var tpriority;
- var tstatus;
- var ttype;
- var tcategory;
- var texecutiontype;
-
- var manualcaseslist;
-
- var cursuite;
- var curset;
-
- var last_test_page = "";
- var current_page_uri = "";
-
- var activetest = true;
-
- var manualcases = function() {
- this.casesid = "";
- this.index = 0;
- this.result = "";
- };
-
- 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 Parm(data, name) {
- var p;
- ts = $(data).find(name);
- if (ts) {
- t = $(ts).get(0);
- if (t)
- p = $(t).text().trim();
- }
-
- if (p) {
- var rawVal = decodeURI(p);
- if (rawVal.indexOf(',') < 0)
- p = rawVal;
- else
- p = rawVal.split(',');
- }
-
- return p;
- }
-
- function getParms() {
- var parms = new Array();
- var str = location.search.substring(1);
- var items = str.split('&');
- for ( var i = 0; i < items.length; i++) {
- var pos = items[i].indexOf('=');
- if (pos > 0) {
- var key = items[i].substring(0, pos);
- var val = items[i].substring(pos + 1);
- if (!parms[key]) {
- var rawVal = decodeURI(val);
- if (rawVal.indexOf(',') < 0)
- parms[key] = rawVal;
- else
- parms[key] = rawVal.split(',');
- }
- }
- }
-
- ttestsuite = parms["testsuite"];
- tpriority = parms["priority"];
- hidestatus = parms["hidestatus"];
- tstatus = parms["status"];
- ttype = parms["type"];
- tcategory = parms["category"];
- texecutiontype = parms["execution_type"];
- if (need_ajax) {
- $.ajax({
- async : false,
- type : "GET",
- url : server + "/get_params",
- dataType : "xml",
- success : function(data) {
- hidestatus = Parm(data, 'hidestatus');
- },
- error : function(x, t, e) {
- print_error_log("getParms", e);
- }
- });
- }
- }
-
- function runTestsuite_nofilter(xml) {
- xmldoc = xml;
- Tests = $(xml).find("testcase");
- doTest();
- }
-
- function runTestsuite(xml) {
- xmldoc = xml;
- $(xml).find("testcase").each(
- function() {
- var v, vType;
- v = $(this).attr('execution_type');
-
- if (texecutiontype && texecutiontype == "manual")
- vType = "manual";
- else if (texecutiontype && texecutiontype == "auto")
- vType = "auto";
- else if (!texecutiontype)
- vType = [ "auto", "manual" ];
- else
- vType = "auto";
-
- if (v != vType && $.inArray(v, vType) < 0)
- $(this).remove();
- v = $(this).attr('priority');
- if (tpriority && v != tpriority
- && $.inArray(v, tpriority) < 0)
- $(this).remove();
- v = $(this).attr('status');
- if (tstatus && v != tstatus && $.inArray(v, tstatus) < 0)
- $(this).remove();
- v = $(this).attr('type');
- if (ttype && v != ttype && $.inArray(v, ttype) < 0)
- $(this).remove();
- var categories = $(this).find("categories > category");
- if (categories.length > 0 && tcategory) {
- var i;
- var found = false;
- for (i = 0; i < categories.length; i++) {
- var category = $(categories).get(i);
- if ($(category).text().trim() != tcategory
- && $.inArray($(category).text().trim(),
- tcategory) < 0) {
- found = true;
- break;
- }
- }
- if (!found)
- $(this).remove();
- }
-
- $(this).attr('result', "N/A");
- });
- Tests = $(xml).find("testcase");
- xmldoc = xml;
- save_result();
- doTest();
- }
-
- function precheck_init() {
- server_url = "http://127.0.0.1:8000/check_server";
- $.ajax({
- async : false,
- url : server_url,
- type : "GET",
- success : init_test,
- error : function(x, t, e) {
- print_error_log("can't find a http server",
- "run widget in the standalone mode");
- need_ajax = false;
- init();
- }
- });
- }
-
- function init() {
- getParms();
-
- oTestFrame = document.getElementById('testframe');
- if (!oTestFrame)
- return;
-
- statusFrame = document.getElementById('statusframe');
- if (!statusFrame)
- return;
-
- var statusWin = statusFrame.contentWindow;
- if (!statusWin)
- return;
-
- statusNode = statusWin.document.createElement("div");
- if (!statusNode)
- return;
- statusWin.document.body.appendChild(statusNode);
-
- frmset = $($('#main')).get(0);
- if (!frmset)
- return;
-
- if (hidestatus && hidestatus == "1")
- $(frmset).attr('rows', "0, *");
- if (need_ajax) {
- $.ajax({
- async : false,
- type : "GET",
- url : server + '/get_testsuite',
- dataType : "xml",
- success : runTestsuite_nofilter,
- error : function(x, t, e) {
- print_error_log("init", e);
- }
- });
- }
- if (!xmldoc) {
- if (!ttestsuite) {
- ttestsuite = 'tests.xml';
- }
- $.ajax({
- async : false,
- type : "GET",
- url : ttestsuite,
- dataType : "xml",
- success : runTestsuite,
- error : function(x, t, e) {
- print_error_log("init", e);
- }
- });
- }
- }
-
- function escape_html(s) {
- return s.replace(/\&/g, "&").replace(/</g, "<").replace(/"/g,
- """).replace(/'/g, "'");
- }
-
- function check_timeout(time) {
- if (time == 11) {
- report('BLOCK', "Time is out");
- }
- sleep_time = time * 50;
- setTimeout("CheckResult('yes', " + time + ")", sleep_time);
- }
-
- function CheckResult(need_check_block, sleep_time) {
- var message = "";
- var total_num = "";
- var locator_key = "";
- var value = "";
-
- var oTestWin = oTestFrame.contentWindow;
- var oTestDoc = oTestWin.document;
- var case_uri = current_page_uri;
-
- try {
- if (oTestWin.document.readyState == "complete") {
- total_num = getTestPageParam(case_uri, "total_num");
- locator_key = getTestPageParam(case_uri, "locator_key");
- value = getTestPageParam(case_uri, "value");
-
- oPass = $(oTestDoc).find(".pass");
- oFail = $(oTestDoc).find(".fail");
-
- // Test page has parameters
- 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].textContent;
- var desc = results[i].childNodes[1].textContent;
- var msg = results[i].childNodes[2].textContent;
- if (rest && rest.toUpperCase() == "PASS")
- report('PASS', msg);
- else
- report('FAIL', msg);
- break;
- }
- } else {
- var i;
- for (i = 0; i < fails.length; i++) {
- var desccell = fails[i].childNodes[1];
- if (desccell)
- message += "\n###Test Start###\n"
- + desccell.textContent
- + "\n###Test End###\n";
- var msgcell = fails[i].childNodes[2];
- if (msgcell)
- message += "###Error1 Start###\n"
- + msgcell.textContent
- + "\n###Error1 End###";
- }
- report('FAIL', message);
- }
- } else if (locator_key == "test_name") {
- // Place holder
- } else if (locator_key == "msg") {
- // Place holder
- } else {
- alert("Unknown locator key");
- }
- } else if (oPass.length > 0 && oFail.length == 0) {
- if (oTestWin.resultdiv)
- message = oTestWin.resultdiv.innerHTML;
- report('PASS', message);
- } 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)
- message += "\n###Test Start###\n"
- + desccell.textContent + "\n###Test End###\n";
- var msgcell = fails[i].childNodes[2];
- if (msgcell)
- message += "###Error2 Start###\n"
- + msgcell.textContent
- + "\n###Error2 End###";
- }
- }
- report('FAIL', message);
- } else // oFail.length==0 && oPass.length==0
- if (need_check_block == 'yes') {
- next_sleep_time = sleep_time + 1;
- check_timeout(next_sleep_time);
- return;
- }
- } else // not complete
- if (need_check_block == 'yes') {
- next_sleep_time = sleep_time + 1;
- check_timeout(next_sleep_time);
- return;
- }
- } catch (e) {
- report('BLOCK', e);
- }
- }
-
- function report(result, log) {
-
- if (iTest >= Tests.length)
- return;
- $(Tests[iTest]).attr('result', result);
- var doc = $.parseXML("<result_info>" + "<actual_result>" + result
- + "</actual_result>" + "<start>" + startTime + "</start>"
- + "<end>" + new Date() + "</end>" + "<stdout>"
- + escape_html(log) + "</stdout>" + "</result_info>");
- $(Tests[iTest]).append(doc.documentElement);
-
- statusNode.innerHTML = "Test #" + (iTest + 1) + "/" + Tests.length
- + "(" + result + ") " + current_page_uri;
-
- try {
- var starts = log.indexOf('value:');
- var stops = log.lastIndexOf(',');
- var resultinfo = log.substring(starts + 6, stops);
- $(Tests[iTest]).find("measurement").attr('value', resultinfo);
- } catch (e) {
- }
-
- iTest++;
-
- if (activetest) {
- doTest();
- } else {
- activetest = true;
- }
- }
-
- function doTest() {
- while (iTest < Tests.length) {
- if ($(Tests[iTest]).attr('execution_type') != 'auto') {
- iTest++;
- continue;
- }
- var ts = $(Tests[iTest]).find('test_script_entry');
- if (ts.length == 0) {
- iTest++;
- continue;
- }
- var it = $(ts).get(0);
- var tstr = $(it).attr('timeout');
- if (!tstr)
- timeout = 8 * defTime;
- else {
- var t;
- try {
- t = parseInt(tstr) * 1000;
- } catch (e) {
- t = 8 * defTime;
- }
- timeout = t;
- }
-
- pset = $(Tests[iTest]).parent().attr('name');
- psuite = $(Tests[iTest]).parent().parent().attr('name');
-
- startTime = new Date();
-
- current_page_uri = $(it).text();
- var index = current_page_uri.indexOf("?");
- var test_page = "";
- if (need_ajax) {
- var svr = server + "/test_hint";
- $.ajax({
- async : false,
- type : "POST",
- url : svr,
- data : {
- suite : psuite,
- set : pset,
- testcase : current_page_uri
- },
- error : function(x, t, e) {
- print_error_log("doTest", e);
- }
- });
- }
- if (index >= 0)
- test_page = current_page_uri.substring(0, index);
- else
- test_page = current_page_uri;
-
- // Don't load the same test page again
- if (test_page == last_test_page) {
- print_error_log("test page url is the same as the last one",
- test_page);
- activetest = false;
- CheckResult('yes', 0);
- continue;
- }
-
- if ((current_page_uri.indexOf("2DTransforms") != -1)
- || (current_page_uri.indexOf("3DTransforms") != -1)) {
- oTestFrame.height = 500000 + "px";
- } else {
- oTestFrame.height = 2500 + "px";
- }
- oTestFrame.src = current_page_uri;
- last_test_page = test_page;
- if (oTestFrame.attachEvent) {
- oTestFrame.attachEvent("onload", function() {
- CheckResult('yes', 0);
- });
- } else {
- oTestFrame.onload = function() {
- CheckResult('yes', 0);
- };
- }
- return;
- }
- doManualTest();
- }
-
- function doManualTest() {
- manualcaseslist = new Array();
- var iTemp1 = 0, iTemp2 = 0;
- while (iTemp1 < Tests.length) {
- if ($(Tests[iTemp1]).attr('execution_type') == 'manual') {
- parent.document.getElementById("statusframe").height = 385 + "px";
- manualcaseslist[iTemp2] = new manualcases();
- manualcaseslist[iTemp2].casesid = $(Tests[iTemp1]).attr('id');
- manualcaseslist[iTemp2].index = iTemp1;
- manualcaseslist[iTemp2].result = $(Tests[iTemp1])
- .attr('result');
- iTemp2++;
- }
- iTemp1++;
- }
- if (iTemp2 > 0) {
- winCloseTimeout = 50000;
- statusFrame.src = "./manualharness.html";
- $(frmset).attr('rows', "100,*");
- } else if (iTest == Tests.length) {
- setTimeout("PublishResult()", 2000);
- }
- oTestFrame.src = '';
- }
-
- function PublishResult() {
- $(frmset).attr('rows', "0, *");
- results = oTestFrame.contentWindow;
- var resultXML;
- resultXML = "<title>HTML5 Test Result XML</title>";
- resultXML += "<head> <style type='text/css'>\
-html {font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;}\
-section#summary {margin-bottom:1em;}\
-table#results {\
- border-collapse:collapse;\
- table-layout:fixed;\
- width:80%;\
-}\
-table#results th:first-child,\
-table#results td:first-child {\
- width:40%;\
-}\
-table#results th:last-child,\
-table#results td:last-child {\
- width:30%;\
-}\
-table#results th {\
- padding:0;\
- padding-bottom:0.5em;\
- text-align:left;\
- border-bottom:medium solid black;\
-}\
-table#results td {\
- padding:1em;\
- padding-bottom:0.5em;\
- border-bottom:thin solid black;\
-}\
-</style><head>";
-
- resultXML += "<section id='summary'>";
- resultXML += "<h2>Summary</h2>";
- var ipass = $(xmldoc).find("testcase[result='PASS']").length;
- var failList = $(xmldoc).find("testcase[result='FAIL']");
- var ifail = failList.length;
- resultXML += "<h3>Total:" + Tests.length
- + " Pass:<span style='color:green;'>" + ipass
- + "</span> Fail:<span style='color:red;'>" + ifail
- + "</span></h3>";
- resultXML += "</section>";
-
- resultXML += "<p><table id='results'> <tr> <th> TestSet </th> <th> Pass </th> <th> Fail </th></tr>";
- var Sets = $(xmldoc).find("set");
- var i = 0;
- for (i = 0; i < Sets.length; i++) {
- ipass = $(Sets[i]).find("testcase[result='PASS']").length;
- ifail = $(Sets[i]).find("testcase[result='FAIL']").length;
- resultXML += "<tr>";
- resultXML += "<td>" + $(Sets[i]).attr('name') + "</td>";
- resultXML += "<td style='color:green;'>" + ipass
- + "</td><td style='color:red;'>" + ifail + "</td>";
- resultXML += "</tr>";
- }
- resultXML += "</table>";
-
- if (ifail > 0) {
- resultXML += "<section id='failedlist'>";
- resultXML += "<h2>Fails</h2>";
- resultXML += "<ul>";
- for (i = 0; i < failList.length; i++) {
- var ts = $(failList[i]).find("test_script_entry");
- if (ts.length > 0) {
- var t = ts.get(0);
- resultXML += "<li style='color:red;'>" + $(t).text()
- + "</li>";
- }
- }
- resultXML += "</ul>";
- resultXML += "</section>";
- }
-
- resultXML += "<h2>Details</h2>";
- resultXML += "<form method='post' id='resultform'> <textarea id='results' style='width: 80%; height: 90%;' name='filecontent' disabled='disabled'>"
- + save_result() + "</textarea></form>";
- setTimeout("window.open('','_self','');window.close()", winCloseTimeout);
- results.document.writeln(resultXML);
- }
-
- function save_result() {
- var svr = server + "/save_result";
- var testid = (new Date()).getTime();
- var contents = (new XMLSerializer()).serializeToString(xmldoc);
- if (need_ajax) {
- $.ajax({
- async : false,
- type : "POST",
- url : svr,
- data : {
- filename : testid,
- filecontent : contents
- },
- error : function(x, t, e) {
- print_error_log("doTest", e);
- }
- });
- }
- return contents;
- }
- // merge code from application.js
- function init_test() {
- var session_id = Math.round(Math.random() * 10000);
- init_message_frame();
- save_session_id(session_id);
- sync_session_id(session_id);
- start_test();
- }
-
- function init_message_frame() {
- messageFrame = document.getElementById('messageframe');
- messageWin = messageFrame.contentWindow;
- messageNode = messageWin.document.getElementById('message_div');
- if (null == messageNode) {
- messageNode = messageWin.document.createElement("div");
- messageNode.id = "message_div";
- messageWin.document.body.appendChild(messageNode);
- messageNode.innerHTML = "Message Area";
- }
- return messageNode;
- }
-
- function print_error_log(command, message) {
- messageFrame = document.getElementById('messageframe');
- messageFrame.height = 160 + "px";
- messageNode = init_message_frame();
- messageNode.innerHTML = "Message Area<div id=\"log_title\"></div><br/>Command: <div id=\"log_command\">"
- + command
- + "</div><br/>Message: <div id=\"log_message\">"
- + message + "</div>";
- }
-
- function save_session_id(session_id) {
- statusFrame = document.getElementById('statusframe');
- statusFrame.height = 270 + "px";
- 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/><div id=\"execution_progress\"></div><br/>";
- }
- }
-
- function sync_session_id(session_id) {
- var server_url = server + "/init_session_id";
- server_url += "?session_id=" + session_id;
- $.ajax({
- async : false,
- url : server_url,
- type : "GET",
- error : function(x, t, e) {
- print_error_log("sync_session_id", e);
- }
- });
- }
-
- function get_session_id() {
- statusFrame = document.getElementById('statusframe');
- statusWin = statusFrame.contentWindow;
- sessionIdNode = statusWin.document.getElementById('session_id');
- return sessionIdNode.innerHTML;
- }
-
- function close_window(){
- //for tct-webgl-nonw3c-tests run by tizen-tool emulator html,window.parent.close() no function,must call window.close, why?
- if(window.parent != window.self){
- window.open('','_self','');
- window.close();
- window.parent.onbeforeunload = null;
- window.parent.close();
- }
- else{
- window.open('','_self','');
- window.close();
- }
- }
- function start_test() {
- try {
- var task = ask_test_task();
- } catch (e) {
- print_error_log("start_test_ask_test_task", e);
- }
- try {
- if (task == 1) {
- print_error_log("start_test_execute_test_task",
- "Invalid session");
- } else if (task == -1) {
- print_error_log("restart client process activated",
- "this window will be closed in 2sec");
- close_window();
- //setTimeout("window.open('','_self','');window.close()", 2000);
- } else if (task == null) {
- print_error_log(
- "get auto case failed, client will be restarted later",
- "this window will be closed in 2sec");
- close_window();
- //setTimeout("window.open('','_self','');window.close()", 2000);
- } else if (task != 0) {
- var progress = check_execution_progress();
- execute_test_task(task, progress);
- } else {
- execute_manual_test();
- }
- } catch (e) {
- print_error_log("start_test_execute_test_task", e);
- }
- }
-
- function ask_generate_xml() {
- var server_url = server + "/generate_xml";
- $.ajax({
- async : false,
- url : server_url,
- type : "GET",
- error : function(x, t, e) {
- print_error_log("ask_generate_xml", e);
- }
- });
- close_window();
- //setTimeout("window.open('','_self','');window.close()", winCloseTimeout);
- }
-
- function extract_all_manual() {
- var server_url = server + "/manual_cases";
- var tasks = null;
- $.ajax({
- async : false,
- url : server_url,
- type : "GET",
- dataType : "text",
- success : function(txt) {
- task = $.parseJSON(txt);
- if (0 == task.none) {
- task = null;
- }
- },
- error : function(x, t, e) {
- print_error_log("extract_all_manual", e);
- }
- });
- return task;
- }
-
- function ask_test_task() {
- var server_url = server + "/auto_test_task";
- var task = null;
- session_id = get_session_id();
- server_url += "?session_id=" + session_id;
- $.ajax({
- async : false,
- url : server_url,
- type : "GET",
- dataType : "text",
- success : function(txt) {
- task = $.parseJSON(txt);
- if (task.none == 0) {
- task = 0;
- }
- if (task.invalid == 0) {
- task = 1;
- }
- if (task.stop == 0) {
- task = -1;
- }
- },
- error : function(x, t, e) {
- print_error_log("ask_test_task", e);
- }
- });
- return task;
- }
-
- function check_execution_progress() {
- var server_url = server + "/check_execution_progress";
- var progress = null;
- session_id = get_session_id();
- server_url += "?session_id=" + session_id;
- $.ajax({
- async : false,
- url : server_url,
- type : "GET",
- dataType : "text",
- success : function(txt) {
- progress = $.parseJSON(txt);
- },
- error : function(x, t, e) {
- print_error_log("check_execution_progress", e);
- }
- });
- return progress;
- }
-
- function ask_next_step() {
- var server_url = server + "/ask_next_step";
- var next_step = null;
- session_id = get_session_id();
- server_url += "?session_id=" + session_id;
- $.ajax({
- async : false,
- url : server_url,
- type : "GET",
- dataType : "text",
- success : function(txt) {
- next_step = $.parseJSON(txt);
- },
- error : function(x, t, e) {
- print_error_log("ask_next_step", e);
- }
- });
- return next_step;
- }
-
- 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, json_progress) {
- try {
- oTestFrame = document.getElementById('testframe');
- statusNode = init_status_frame();
- // update execution progress
- statusFrame = document.getElementById('statusframe');
- statusWin = statusFrame.contentWindow;
- progressNode = statusWin.document
- .getElementById('execution_progress');
- progressNode.innerHTML = "Total:" + json_progress.total
- + ", Current:" + json_progress.current;
- // update case info
- statusNode.innerHTML = "Test Purpose:<div id=\"test_purpose_div\">"
- + json_task.purpose
- + "</div><br/>Test Entry:<div id=\"test_entry_div\">"
- + json_task.entry
- + "</div><br/>Last Test Result:<div id=\"test_result_div\">"
- + json_progress.last_test_result + "</div>";
- current_page_uri = json_task.entry;
- case_id_str = json_task.case_id;
- var index = current_page_uri.indexOf("?");
- var test_page = "";
- if (index >= 0)
- test_page = current_page_uri.substring(0, index);
- else
- test_page = current_page_uri;
- // Get how many times to check BLOCK result
- if (json_task.onload_delay) {
- calculate_block_check_time(parseInt(json_task.onload_delay) * 1000);
- } else {
- print_error_log("execute_test_task",
- "can't get attribute onload_delay from task: "
- + json_task.purpose);
- }
- // Don't load the same test page again
- if (test_page == last_test_page) {
- print_error_log("test page url is the same as the last one",
- test_page);
- extract_case_result('yes', 0);
- return;
- }
- if ((current_page_uri.indexOf("2DTransforms") != -1)
- || (current_page_uri.indexOf("3DTransforms") != -1)) {
- oTestFrame.height = 500000 + "px";
- } else {
- oTestFrame.height = 2500 + "px";
- }
- oTestFrame.src = current_page_uri;
- last_test_page = test_page;
- if (oTestFrame.attachEvent) {
- oTestFrame.attachEvent("onload", function() {
- extract_case_result('yes', 0);
- });
- } else {
- oTestFrame.onload = function() {
- extract_case_result('yes', 0);
- };
- }
- } catch (e) {
- print_error_log("execute_test_task", e);
- }
- }
-
- function calculate_block_check_time(onload_delay) {
- blockCheckTime = Math.ceil((Math.sqrt(onload_delay * 4 + 25) - 5) / 10);
- }
-
- function check_block_result_again(time) {
- sleep_time = time * 50;
- if (time == blockCheckTime) {
- setTimeout("extract_case_result('no', " + time + ")", sleep_time);
- return;
- }
- setTimeout("extract_case_result('yes', " + time + ")", sleep_time);
- }
-
- function extract_case_result(need_check_block, sleep_time) {
- 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 = current_page_uri;
-
- 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].textContent;
- var desc = results[i].childNodes[1].textContent;
- case_msg = results[i].childNodes[2].textContent;
- if (rest && rest.toUpperCase() == "PASS") {
- result = "PASS";
- } else {
- result = "FAIL";
- }
- break;
- }
- } else {
- if (need_check_block == 'yes') {
- next_sleep_time = sleep_time + 1;
- check_block_result_again(next_sleep_time);
- return;
- }
- else{
- var i;
- for (i = 0; i < fails.length; i++) {
- var desccell = fails[i].childNodes[1];
- if (desccell) {
- case_msg += "\n###Test Start###\n" + desccell.textContent
- + "\n###Test End###\n";
- }
- var msgcell = fails[i].childNodes[2];
- if (msgcell) {
- case_msg += "###Error1 Start###\n"
- + msgcell.textContent + "\n###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 += "\n###Test Start###\n" + desccell.textContent
- + "\n###Test End###\n";
- }
- var msgcell = fails[i].childNodes[2];
- if (msgcell) {
- case_msg += "###Error2 Start###\n" + msgcell.textContent
- + "\n###Error2 End###";
- }
- }
- }
- result = "FAIL";
- } else {
- if (need_check_block == 'yes') {
- next_sleep_time = sleep_time + 1;
- check_block_result_again(next_sleep_time);
- return;
- }
- }
- var next_step = ask_next_step();
- commit_test_result(result, case_msg);
- if (next_step.step == "continue") {
- start_test();
- } else {
- print_error_log("memory collection process activated",
- "this window will be closed in 2sec");
- close_window();
- //setTimeout("window.open('','_self','');window.close()", 2000);
- }
- }
-
- 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();
- if (tasks != null){
- for ( var i = 0; i < tasks.length; i++) {
- if (parent.document.getElementById("statusframe"))
- 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) {
- statusFrame.src = "./manual_harness.html";
- $($($('#main')).get(0)).attr('rows', "100,*");
- }
- oTestFrame = document.getElementById('testframe');
- oTestFrame.src = '';
- }
- else {
- // No manual cases, generate the result.
- ask_generate_xml();
- }
- }
-
- function commit_test_result(result, msg) {
- statusFrame = document.getElementById('statusframe');
- purposeNode = statusWin.document.getElementById('test_purpose_div');
- session_id = get_session_id();
- var purpose_str = purposeNode.innerHTML
- var server_url = server + "/commit_result";
- $.ajax({
- async : false,
- url : server_url,
- type : "POST",
- data : {
- "case_id" : case_id_str,
- "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");
- }
- },
- error : function(x, t, e) {
- print_error_log("commit_test_result", e);
- }
- });
- }
-</script>
-</head>
-<body id="main" onload='precheck_init()'>
- <iframe frameborder="1" height="30px" width="100%" id="messageframe"></iframe>
- <iframe frameborder="1" height="30px" width="100%" id="statusframe"></iframe>
- <iframe frameborder="1" height="2500px" width="100%" id="testframe" allowFullScreen="true" mozAllowFullScreen="true" webkitAllowFullscreen="true"></iframe>
-</body>
-</html>
+++ /dev/null
-/*!
- * jQuery JavaScript Library v1.7
- * http://jquery.com/
- *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
- * Includes Sizzle.js
- * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- *
- * Date: Thu Nov 3 16:18:21 2011 -0400
- */
-(function( window, undefined ) {
-
-// Use the correct document accordingly with window argument (sandbox)
-var document = window.document,
- navigator = window.navigator,
- location = window.location;
-var jQuery = (function() {
-
-// Define a local copy of jQuery
-var jQuery = function( selector, context ) {
- // The jQuery object is actually just the init constructor 'enhanced'
- return new jQuery.fn.init( selector, context, rootjQuery );
- },
-
- // Map over jQuery in case of overwrite
- _jQuery = window.jQuery,
-
- // Map over the $ in case of overwrite
- _$ = window.$,
-
- // A central reference to the root jQuery(document)
- rootjQuery,
-
- // A simple way to check for HTML strings or ID strings
- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
- quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
- // Check if a string has a non-whitespace character in it
- rnotwhite = /\S/,
-
- // Used for trimming whitespace
- trimLeft = /^\s+/,
- trimRight = /\s+$/,
-
- // Check for digits
- rdigit = /\d/,
-
- // Match a standalone tag
- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
- // JSON RegExp
- rvalidchars = /^[\],:{}\s]*$/,
- rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
- rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
- // Useragent RegExp
- rwebkit = /(webkit)[ \/]([\w.]+)/,
- ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
- rmsie = /(msie) ([\w.]+)/,
- rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
-
- // Matches dashed string for camelizing
- rdashAlpha = /-([a-z]|[0-9])/ig,
- rmsPrefix = /^-ms-/,
-
- // Used by jQuery.camelCase as callback to replace()
- fcamelCase = function( all, letter ) {
- return ( letter + "" ).toUpperCase();
- },
-
- // Keep a UserAgent string for use with jQuery.browser
- userAgent = navigator.userAgent,
-
- // For matching the engine and version of the browser
- browserMatch,
-
- // The deferred used on DOM ready
- readyList,
-
- // The ready event handler
- DOMContentLoaded,
-
- // Save a reference to some core methods
- toString = Object.prototype.toString,
- hasOwn = Object.prototype.hasOwnProperty,
- push = Array.prototype.push,
- slice = Array.prototype.slice,
- trim = String.prototype.trim,
- indexOf = Array.prototype.indexOf,
-
- // [[Class]] -> type pairs
- class2type = {};
-
-jQuery.fn = jQuery.prototype = {
- constructor: jQuery,
- init: function( selector, context, rootjQuery ) {
- var match, elem, ret, doc;
-
- // Handle $(""), $(null), or $(undefined)
- if ( !selector ) {
- return this;
- }
-
- // Handle $(DOMElement)
- if ( selector.nodeType ) {
- this.context = this[0] = selector;
- this.length = 1;
- return this;
- }
-
- // The body element only exists once, optimize finding it
- if ( selector === "body" && !context && document.body ) {
- this.context = document;
- this[0] = document.body;
- this.selector = selector;
- this.length = 1;
- return this;
- }
-
- // Handle HTML strings
- if ( typeof selector === "string" ) {
- // Are we dealing with HTML string or an ID?
- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
- // Assume that strings that start and end with <> are HTML and skip the regex check
- match = [ null, selector, null ];
-
- } else {
- match = quickExpr.exec( selector );
- }
-
- // Verify a match, and that no context was specified for #id
- if ( match && (match[1] || !context) ) {
-
- // HANDLE: $(html) -> $(array)
- if ( match[1] ) {
- context = context instanceof jQuery ? context[0] : context;
- doc = ( context ? context.ownerDocument || context : document );
-
- // If a single string is passed in and it's a single tag
- // just do a createElement and skip the rest
- ret = rsingleTag.exec( selector );
-
- if ( ret ) {
- if ( jQuery.isPlainObject( context ) ) {
- selector = [ document.createElement( ret[1] ) ];
- jQuery.fn.attr.call( selector, context, true );
-
- } else {
- selector = [ doc.createElement( ret[1] ) ];
- }
-
- } else {
- ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
- selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
- }
-
- return jQuery.merge( this, selector );
-
- // HANDLE: $("#id")
- } else {
- elem = document.getElementById( match[2] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id !== match[2] ) {
- return rootjQuery.find( selector );
- }
-
- // Otherwise, we inject the element directly into the jQuery object
- this.length = 1;
- this[0] = elem;
- }
-
- this.context = document;
- this.selector = selector;
- return this;
- }
-
- // HANDLE: $(expr, $(...))
- } else if ( !context || context.jquery ) {
- return ( context || rootjQuery ).find( selector );
-
- // HANDLE: $(expr, context)
- // (which is just equivalent to: $(context).find(expr)
- } else {
- return this.constructor( context ).find( selector );
- }
-
- // HANDLE: $(function)
- // Shortcut for document ready
- } else if ( jQuery.isFunction( selector ) ) {
- return rootjQuery.ready( selector );
- }
-
- if ( selector.selector !== undefined ) {
- this.selector = selector.selector;
- this.context = selector.context;
- }
-
- return jQuery.makeArray( selector, this );
- },
-
- // Start with an empty selector
- selector: "",
-
- // The current version of jQuery being used
- jquery: "1.7",
-
- // The default length of a jQuery object is 0
- length: 0,
-
- // The number of elements contained in the matched element set
- size: function() {
- return this.length;
- },
-
- toArray: function() {
- return slice.call( this, 0 );
- },
-
- // Get the Nth element in the matched element set OR
- // Get the whole matched element set as a clean array
- get: function( num ) {
- return num == null ?
-
- // Return a 'clean' array
- this.toArray() :
-
- // Return just the object
- ( num < 0 ? this[ this.length + num ] : this[ num ] );
- },
-
- // Take an array of elements and push it onto the stack
- // (returning the new matched element set)
- pushStack: function( elems, name, selector ) {
- // Build a new jQuery matched element set
- var ret = this.constructor();
-
- if ( jQuery.isArray( elems ) ) {
- push.apply( ret, elems );
-
- } else {
- jQuery.merge( ret, elems );
- }
-
- // Add the old object onto the stack (as a reference)
- ret.prevObject = this;
-
- ret.context = this.context;
-
- if ( name === "find" ) {
- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
- } else if ( name ) {
- ret.selector = this.selector + "." + name + "(" + selector + ")";
- }
-
- // Return the newly-formed element set
- return ret;
- },
-
- // Execute a callback for every element in the matched set.
- // (You can seed the arguments with an array of args, but this is
- // only used internally.)
- each: function( callback, args ) {
- return jQuery.each( this, callback, args );
- },
-
- ready: function( fn ) {
- // Attach the listeners
- jQuery.bindReady();
-
- // Add the callback
- readyList.add( fn );
-
- return this;
- },
-
- eq: function( i ) {
- return i === -1 ?
- this.slice( i ) :
- this.slice( i, +i + 1 );
- },
-
- first: function() {
- return this.eq( 0 );
- },
-
- last: function() {
- return this.eq( -1 );
- },
-
- slice: function() {
- return this.pushStack( slice.apply( this, arguments ),
- "slice", slice.call(arguments).join(",") );
- },
-
- map: function( callback ) {
- return this.pushStack( jQuery.map(this, function( elem, i ) {
- return callback.call( elem, i, elem );
- }));
- },
-
- end: function() {
- return this.prevObject || this.constructor(null);
- },
-
- // For internal use only.
- // Behaves like an Array's method, not like a jQuery method.
- push: push,
- sort: [].sort,
- splice: [].splice
-};
-
-// Give the init function the jQuery prototype for later instantiation
-jQuery.fn.init.prototype = jQuery.fn;
-
-jQuery.extend = jQuery.fn.extend = function() {
- var options, name, src, copy, copyIsArray, clone,
- target = arguments[0] || {},
- i = 1,
- length = arguments.length,
- deep = false;
-
- // Handle a deep copy situation
- if ( typeof target === "boolean" ) {
- deep = target;
- target = arguments[1] || {};
- // skip the boolean and the target
- i = 2;
- }
-
- // Handle case when target is a string or something (possible in deep copy)
- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
- target = {};
- }
-
- // extend jQuery itself if only one argument is passed
- if ( length === i ) {
- target = this;
- --i;
- }
-
- for ( ; i < length; i++ ) {
- // Only deal with non-null/undefined values
- if ( (options = arguments[ i ]) != null ) {
- // Extend the base object
- for ( name in options ) {
- src = target[ name ];
- copy = options[ name ];
-
- // Prevent never-ending loop
- if ( target === copy ) {
- continue;
- }
-
- // Recurse if we're merging plain objects or arrays
- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
- if ( copyIsArray ) {
- copyIsArray = false;
- clone = src && jQuery.isArray(src) ? src : [];
-
- } else {
- clone = src && jQuery.isPlainObject(src) ? src : {};
- }
-
- // Never move original objects, clone them
- target[ name ] = jQuery.extend( deep, clone, copy );
-
- // Don't bring in undefined values
- } else if ( copy !== undefined ) {
- target[ name ] = copy;
- }
- }
- }
- }
-
- // Return the modified object
- return target;
-};
-
-jQuery.extend({
- noConflict: function( deep ) {
- if ( window.$ === jQuery ) {
- window.$ = _$;
- }
-
- if ( deep && window.jQuery === jQuery ) {
- window.jQuery = _jQuery;
- }
-
- return jQuery;
- },
-
- // Is the DOM ready to be used? Set to true once it occurs.
- isReady: false,
-
- // A counter to track how many items to wait for before
- // the ready event fires. See #6781
- readyWait: 1,
-
- // Hold (or release) the ready event
- holdReady: function( hold ) {
- if ( hold ) {
- jQuery.readyWait++;
- } else {
- jQuery.ready( true );
- }
- },
-
- // Handle when the DOM is ready
- ready: function( wait ) {
- // Either a released hold or an DOMready/load event and not yet ready
- if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( !document.body ) {
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Remember that the DOM is ready
- jQuery.isReady = true;
-
- // If a normal DOM Ready event fired, decrement, and wait if need be
- if ( wait !== true && --jQuery.readyWait > 0 ) {
- return;
- }
-
- // If there are functions bound, to execute
- readyList.fireWith( document, [ jQuery ] );
-
- // Trigger any bound ready events
- if ( jQuery.fn.trigger ) {
- jQuery( document ).trigger( "ready" ).unbind( "ready" );
- }
- }
- },
-
- bindReady: function() {
- if ( readyList ) {
- return;
- }
-
- readyList = jQuery.Callbacks( "once memory" );
-
- // Catch cases where $(document).ready() is called after the
- // browser event has already occurred.
- if ( document.readyState === "complete" ) {
- // Handle it asynchronously to allow scripts the opportunity to delay ready
- return setTimeout( jQuery.ready, 1 );
- }
-
- // Mozilla, Opera and webkit nightlies currently support this event
- if ( document.addEventListener ) {
- // Use the handy event callback
- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-
- // A fallback to window.onload, that will always work
- window.addEventListener( "load", jQuery.ready, false );
-
- // If IE event model is used
- } else if ( document.attachEvent ) {
- // ensure firing before onload,
- // maybe late but safe also for iframes
- document.attachEvent( "onreadystatechange", DOMContentLoaded );
-
- // A fallback to window.onload, that will always work
- window.attachEvent( "onload", jQuery.ready );
-
- // If IE and not a frame
- // continually check to see if the document is ready
- var toplevel = false;
-
- try {
- toplevel = window.frameElement == null;
- } catch(e) {}
-
- if ( document.documentElement.doScroll && toplevel ) {
- doScrollCheck();
- }
- }
- },
-
- // See test/unit/core.js for details concerning isFunction.
- // Since version 1.3, DOM methods and functions like alert
- // aren't supported. They return false on IE (#2968).
- isFunction: function( obj ) {
- return jQuery.type(obj) === "function";
- },
-
- isArray: Array.isArray || function( obj ) {
- return jQuery.type(obj) === "array";
- },
-
- // A crude way of determining if an object is a window
- isWindow: function( obj ) {
- return obj && typeof obj === "object" && "setInterval" in obj;
- },
-
- isNumeric: function( obj ) {
- return obj != null && rdigit.test( obj ) && !isNaN( obj );
- },
-
- type: function( obj ) {
- return obj == null ?
- String( obj ) :
- class2type[ toString.call(obj) ] || "object";
- },
-
- isPlainObject: function( obj ) {
- // Must be an Object.
- // Because of IE, we also have to check the presence of the constructor property.
- // Make sure that DOM nodes and window objects don't pass through, as well
- if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
- return false;
- }
-
- try {
- // Not own constructor property must be Object
- if ( obj.constructor &&
- !hasOwn.call(obj, "constructor") &&
- !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
- return false;
- }
- } catch ( e ) {
- // IE8,9 Will throw exceptions on certain host objects #9897
- return false;
- }
-
- // Own properties are enumerated firstly, so to speed up,
- // if last one is own, then all properties are own.
-
- var key;
- for ( key in obj ) {}
-
- return key === undefined || hasOwn.call( obj, key );
- },
-
- isEmptyObject: function( obj ) {
- for ( var name in obj ) {
- return false;
- }
- return true;
- },
-
- error: function( msg ) {
- throw msg;
- },
-
- parseJSON: function( data ) {
- if ( typeof data !== "string" || !data ) {
- return null;
- }
-
- // Make sure leading/trailing whitespace is removed (IE can't handle it)
- data = jQuery.trim( data );
-
- // Attempt to parse using the native JSON parser first
- if ( window.JSON && window.JSON.parse ) {
- return window.JSON.parse( data );
- }
-
- // Make sure the incoming data is actual JSON
- // Logic borrowed from http://json.org/json2.js
- if ( rvalidchars.test( data.replace( rvalidescape, "@" )
- .replace( rvalidtokens, "]" )
- .replace( rvalidbraces, "")) ) {
-
- return ( new Function( "return " + data ) )();
-
- }
- jQuery.error( "Invalid JSON: " + data );
- },
-
- // Cross-browser xml parsing
- parseXML: function( data ) {
- var xml, tmp;
- try {
- if ( window.DOMParser ) { // Standard
- tmp = new DOMParser();
- xml = tmp.parseFromString( data , "text/xml" );
- } else { // IE
- xml = new ActiveXObject( "Microsoft.XMLDOM" );
- xml.async = "false";
- xml.loadXML( data );
- }
- } catch( e ) {
- xml = undefined;
- }
- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
- jQuery.error( "Invalid XML: " + data );
- }
- return xml;
- },
-
- noop: function() {},
-
- // Evaluates a script in a global context
- // Workarounds based on findings by Jim Driscoll
- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
- globalEval: function( data ) {
- if ( data && rnotwhite.test( data ) ) {
- // We use execScript on Internet Explorer
- // We use an anonymous function so that context is window
- // rather than jQuery in Firefox
- ( window.execScript || function( data ) {
- window[ "eval" ].call( window, data );
- } )( data );
- }
- },
-
- // Convert dashed to camelCase; used by the css and data modules
- // Microsoft forgot to hump their vendor prefix (#9572)
- camelCase: function( string ) {
- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
- },
-
- nodeName: function( elem, name ) {
- return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
- },
-
- // args is for internal usage only
- each: function( object, callback, args ) {
- var name, i = 0,
- length = object.length,
- isObj = length === undefined || jQuery.isFunction( object );
-
- if ( args ) {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.apply( object[ name ], args ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.apply( object[ i++ ], args ) === false ) {
- break;
- }
- }
- }
-
- // A special, fast, case for the most common use of each
- } else {
- if ( isObj ) {
- for ( name in object ) {
- if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
- break;
- }
- }
- } else {
- for ( ; i < length; ) {
- if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
- break;
- }
- }
- }
- }
-
- return object;
- },
-
- // Use native String.trim function wherever possible
- trim: trim ?
- function( text ) {
- return text == null ?
- "" :
- trim.call( text );
- } :
-
- // Otherwise use our own trimming functionality
- function( text ) {
- return text == null ?
- "" :
- text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
- },
-
- // results is for internal usage only
- makeArray: function( array, results ) {
- var ret = results || [];
-
- if ( array != null ) {
- // The window, strings (and functions) also have 'length'
- // The extra typeof function check is to prevent crashes
- // in Safari 2 (See: #3039)
- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
- var type = jQuery.type( array );
-
- if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
- push.call( ret, array );
- } else {
- jQuery.merge( ret, array );
- }
- }
-
- return ret;
- },
-
- inArray: function( elem, array, i ) {
- var len;
-
- if ( array ) {
- if ( indexOf ) {
- return indexOf.call( array, elem, i );
- }
-
- len = array.length;
- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
-
- for ( ; i < len; i++ ) {
- // Skip accessing in sparse arrays
- if ( i in array && array[ i ] === elem ) {
- return i;
- }
- }
- }
-
- return -1;
- },
-
- merge: function( first, second ) {
- var i = first.length,
- j = 0;
-
- if ( typeof second.length === "number" ) {
- for ( var l = second.length; j < l; j++ ) {
- first[ i++ ] = second[ j ];
- }
-
- } else {
- while ( second[j] !== undefined ) {
- first[ i++ ] = second[ j++ ];
- }
- }
-
- first.length = i;
-
- return first;
- },
-
- grep: function( elems, callback, inv ) {
- var ret = [], retVal;
- inv = !!inv;
-
- // Go through the array, only saving the items
- // that pass the validator function
- for ( var i = 0, length = elems.length; i < length; i++ ) {
- retVal = !!callback( elems[ i ], i );
- if ( inv !== retVal ) {
- ret.push( elems[ i ] );
- }
- }
-
- return ret;
- },
-
- // arg is for internal usage only
- map: function( elems, callback, arg ) {
- var value, key, ret = [],
- i = 0,
- length = elems.length,
- // jquery objects are treated as arrays
- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
- // Go through the array, translating each of the items to their
- if ( isArray ) {
- for ( ; i < length; i++ ) {
- value = callback( elems[ i ], i, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
-
- // Go through every key on the object,
- } else {
- for ( key in elems ) {
- value = callback( elems[ key ], key, arg );
-
- if ( value != null ) {
- ret[ ret.length ] = value;
- }
- }
- }
-
- // Flatten any nested arrays
- return ret.concat.apply( [], ret );
- },
-
- // A global GUID counter for objects
- guid: 1,
-
- // Bind a function to a context, optionally partially applying any
- // arguments.
- proxy: function( fn, context ) {
- if ( typeof context === "string" ) {
- var tmp = fn[ context ];
- context = fn;
- fn = tmp;
- }
-
- // Quick check to determine if target is callable, in the spec
- // this throws a TypeError, but we will just return undefined.
- if ( !jQuery.isFunction( fn ) ) {
- return undefined;
- }
-
- // Simulated bind
- var args = slice.call( arguments, 2 ),
- proxy = function() {
- return fn.apply( context, args.concat( slice.call( arguments ) ) );
- };
-
- // Set the guid of unique handler to the same of original handler, so it can be removed
- proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
- return proxy;
- },
-
- // Mutifunctional method to get and set values to a collection
- // The value/s can optionally be executed if it's a function
- access: function( elems, key, value, exec, fn, pass ) {
- var length = elems.length;
-
- // Setting many attributes
- if ( typeof key === "object" ) {
- for ( var k in key ) {
- jQuery.access( elems, k, key[k], exec, fn, value );
- }
- return elems;
- }
-
- // Setting one attribute
- if ( value !== undefined ) {
- // Optionally, function values get executed if exec is true
- exec = !pass && exec && jQuery.isFunction(value);
-
- for ( var i = 0; i < length; i++ ) {
- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
- }
-
- return elems;
- }
-
- // Getting an attribute
- return length ? fn( elems[0], key ) : undefined;
- },
-
- now: function() {
- return ( new Date() ).getTime();
- },
-
- // Use of jQuery.browser is frowned upon.
- // More details: http://docs.jquery.com/Utilities/jQuery.browser
- uaMatch: function( ua ) {
- ua = ua.toLowerCase();
-
- var match = rwebkit.exec( ua ) ||
- ropera.exec( ua ) ||
- rmsie.exec( ua ) ||
- ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
- [];
-
- return { browser: match[1] || "", version: match[2] || "0" };
- },
-
- sub: function() {
- function jQuerySub( selector, context ) {
- return new jQuerySub.fn.init( selector, context );
- }
- jQuery.extend( true, jQuerySub, this );
- jQuerySub.superclass = this;
- jQuerySub.fn = jQuerySub.prototype = this();
- jQuerySub.fn.constructor = jQuerySub;
- jQuerySub.sub = this.sub;
- jQuerySub.fn.init = function init( selector, context ) {
- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
- context = jQuerySub( context );
- }
-
- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
- };
- jQuerySub.fn.init.prototype = jQuerySub.fn;
- var rootjQuerySub = jQuerySub(document);
- return jQuerySub;
- },
-
- browser: {}
-});
-
-// Populate the class2type map
-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
- class2type[ "[object " + name + "]" ] = name.toLowerCase();
-});
-
-browserMatch = jQuery.uaMatch( userAgent );
-if ( browserMatch.browser ) {
- jQuery.browser[ browserMatch.browser ] = true;
- jQuery.browser.version = browserMatch.version;
-}
-
-// Deprecated, use jQuery.browser.webkit instead
-if ( jQuery.browser.webkit ) {
- jQuery.browser.safari = true;
-}
-
-// IE doesn't match non-breaking spaces with \s
-if ( rnotwhite.test( "\xA0" ) ) {
- trimLeft = /^[\s\xA0]+/;
- trimRight = /[\s\xA0]+$/;
-}
-
-// All jQuery objects should point back to these
-rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-if ( document.addEventListener ) {
- DOMContentLoaded = function() {
- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
- jQuery.ready();
- };
-
-} else if ( document.attachEvent ) {
- DOMContentLoaded = function() {
- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
- if ( document.readyState === "complete" ) {
- document.detachEvent( "onreadystatechange", DOMContentLoaded );
- jQuery.ready();
- }
- };
-}
-
-// The DOM ready check for Internet Explorer
-function doScrollCheck() {
- if ( jQuery.isReady ) {
- return;
- }
-
- try {
- // If IE is used, use the trick by Diego Perini
- // http://javascript.nwbox.com/IEContentLoaded/
- document.documentElement.doScroll("left");
- } catch(e) {
- setTimeout( doScrollCheck, 1 );
- return;
- }
-
- // and execute any waiting functions
- jQuery.ready();
-}
-
-// Expose jQuery as an AMD module, but only for AMD loaders that
-// understand the issues with loading multiple versions of jQuery
-// in a page that all might call define(). The loader will indicate
-// they have special allowances for multiple jQuery versions by
-// specifying define.amd.jQuery = true. Register as a named module,
-// since jQuery can be concatenated with other files that may use define,
-// but not use a proper concatenation script that understands anonymous
-// AMD modules. A named AMD is safest and most robust way to register.
-// Lowercase jquery is used because AMD module names are derived from
-// file names, and jQuery is normally delivered in a lowercase file name.
-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
- define( "jquery", [], function () { return jQuery; } );
-}
-
-return jQuery;
-
-})();
-
-
-// String to Object flags format cache
-var flagsCache = {};
-
-// Convert String-formatted flags into Object-formatted ones and store in cache
-function createFlags( flags ) {
- var object = flagsCache[ flags ] = {},
- i, length;
- flags = flags.split( /\s+/ );
- for ( i = 0, length = flags.length; i < length; i++ ) {
- object[ flags[i] ] = true;
- }
- return object;
-}
-
-/*
- * Create a callback list using the following parameters:
- *
- * flags: an optional list of space-separated flags that will change how
- * the callback list behaves
- *
- * By default a callback list will act like an event callback list and can be
- * "fired" multiple times.
- *
- * Possible flags:
- *
- * once: will ensure the callback list can only be fired once (like a Deferred)
- *
- * memory: will keep track of previous values and will call any callback added
- * after the list has been fired right away with the latest "memorized"
- * values (like a Deferred)
- *
- * unique: will ensure a callback can only be added once (no duplicate in the list)
- *
- * stopOnFalse: interrupt callings when a callback returns false
- *
- */
-jQuery.Callbacks = function( flags ) {
-
- // Convert flags from String-formatted to Object-formatted
- // (we check in cache first)
- flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
-
- var // Actual callback list
- list = [],
- // Stack of fire calls for repeatable lists
- stack = [],
- // Last fire value (for non-forgettable lists)
- memory,
- // Flag to know if list is currently firing
- firing,
- // First callback to fire (used internally by add and fireWith)
- firingStart,
- // End of the loop when firing
- firingLength,
- // Index of currently firing callback (modified by remove if needed)
- firingIndex,
- // Add one or several callbacks to the list
- add = function( args ) {
- var i,
- length,
- elem,
- type,
- actual;
- for ( i = 0, length = args.length; i < length; i++ ) {
- elem = args[ i ];
- type = jQuery.type( elem );
- if ( type === "array" ) {
- // Inspect recursively
- add( elem );
- } else if ( type === "function" ) {
- // Add if not in unique mode and callback is not in
- if ( !flags.unique || !self.has( elem ) ) {
- list.push( elem );
- }
- }
- }
- },
- // Fire callbacks
- fire = function( context, args ) {
- args = args || [];
- memory = !flags.memory || [ context, args ];
- firing = true;
- firingIndex = firingStart || 0;
- firingStart = 0;
- firingLength = list.length;
- for ( ; list && firingIndex < firingLength; firingIndex++ ) {
- if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
- memory = true; // Mark as halted
- break;
- }
- }
- firing = false;
- if ( list ) {
- if ( !flags.once ) {
- if ( stack && stack.length ) {
- memory = stack.shift();
- self.fireWith( memory[ 0 ], memory[ 1 ] );
- }
- } else if ( memory === true ) {
- self.disable();
- } else {
- list = [];
- }
- }
- },
- // Actual Callbacks object
- self = {
- // Add a callback or a collection of callbacks to the list
- add: function() {
- if ( list ) {
- var length = list.length;
- add( arguments );
- // Do we need to add the callbacks to the
- // current firing batch?
- if ( firing ) {
- firingLength = list.length;
- // With memory, if we're not firing then
- // we should call right away, unless previous
- // firing was halted (stopOnFalse)
- } else if ( memory && memory !== true ) {
- firingStart = length;
- fire( memory[ 0 ], memory[ 1 ] );
- }
- }
- return this;
- },
- // Remove a callback from the list
- remove: function() {
- if ( list ) {
- var args = arguments,
- argIndex = 0,
- argLength = args.length;
- for ( ; argIndex < argLength ; argIndex++ ) {
- for ( var i = 0; i < list.length; i++ ) {
- if ( args[ argIndex ] === list[ i ] ) {
- // Handle firingIndex and firingLength
- if ( firing ) {
- if ( i <= firingLength ) {
- firingLength--;
- if ( i <= firingIndex ) {
- firingIndex--;
- }
- }
- }
- // Remove the element
- list.splice( i--, 1 );
- // If we have some unicity property then
- // we only need to do this once
- if ( flags.unique ) {
- break;
- }
- }
- }
- }
- }
- return this;
- },
- // Control if a given callback is in the list
- has: function( fn ) {
- if ( list ) {
- var i = 0,
- length = list.length;
- for ( ; i < length; i++ ) {
- if ( fn === list[ i ] ) {
- return true;
- }
- }
- }
- return false;
- },
- // Remove all callbacks from the list
- empty: function() {
- list = [];
- return this;
- },
- // Have the list do nothing anymore
- disable: function() {
- list = stack = memory = undefined;
- return this;
- },
- // Is it disabled?
- disabled: function() {
- return !list;
- },
- // Lock the list in its current state
- lock: function() {
- stack = undefined;
- if ( !memory || memory === true ) {
- self.disable();
- }
- return this;
- },
- // Is it locked?
- locked: function() {
- return !stack;
- },
- // Call all callbacks with the given context and arguments
- fireWith: function( context, args ) {
- if ( stack ) {
- if ( firing ) {
- if ( !flags.once ) {
- stack.push( [ context, args ] );
- }
- } else if ( !( flags.once && memory ) ) {
- fire( context, args );
- }
- }
- return this;
- },
- // Call all the callbacks with the given arguments
- fire: function() {
- self.fireWith( this, arguments );
- return this;
- },
- // To know if the callbacks have already been called at least once
- fired: function() {
- return !!memory;
- }
- };
-
- return self;
-};
-
-
-
-
-var // Static reference to slice
- sliceDeferred = [].slice;
-
-jQuery.extend({
-
- Deferred: function( func ) {
- var doneList = jQuery.Callbacks( "once memory" ),
- failList = jQuery.Callbacks( "once memory" ),
- progressList = jQuery.Callbacks( "memory" ),
- state = "pending",
- lists = {
- resolve: doneList,
- reject: failList,
- notify: progressList
- },
- promise = {
- done: doneList.add,
- fail: failList.add,
- progress: progressList.add,
-
- state: function() {
- return state;
- },
-
- // Deprecated
- isResolved: doneList.fired,
- isRejected: failList.fired,
-
- then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
- deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
- return this;
- },
- always: function() {
- return deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
- },
- pipe: function( fnDone, fnFail, fnProgress ) {
- return jQuery.Deferred(function( newDefer ) {
- jQuery.each( {
- done: [ fnDone, "resolve" ],
- fail: [ fnFail, "reject" ],
- progress: [ fnProgress, "notify" ]
- }, function( handler, data ) {
- var fn = data[ 0 ],
- action = data[ 1 ],
- returned;
- if ( jQuery.isFunction( fn ) ) {
- deferred[ handler ](function() {
- returned = fn.apply( this, arguments );
- if ( returned && jQuery.isFunction( returned.promise ) ) {
- returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
- } else {
- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
- }
- });
- } else {
- deferred[ handler ]( newDefer[ action ] );
- }
- });
- }).promise();
- },
- // Get a promise for this deferred
- // If obj is provided, the promise aspect is added to the object
- promise: function( obj ) {
- if ( obj == null ) {
- obj = promise;
- } else {
- for ( var key in promise ) {
- obj[ key ] = promise[ key ];
- }
- }
- return obj;
- }
- },
- deferred = promise.promise({}),
- key;
-
- for ( key in lists ) {
- deferred[ key ] = lists[ key ].fire;
- deferred[ key + "With" ] = lists[ key ].fireWith;
- }
-
- // Handle state
- deferred.done( function() {
- state = "resolved";
- }, failList.disable, progressList.lock ).fail( function() {
- state = "rejected";
- }, doneList.disable, progressList.lock );
-
- // Call given func if any
- if ( func ) {
- func.call( deferred, deferred );
- }
-
- // All done!
- return deferred;
- },
-
- // Deferred helper
- when: function( firstParam ) {
- var args = sliceDeferred.call( arguments, 0 ),
- i = 0,
- length = args.length,
- pValues = new Array( length ),
- count = length,
- pCount = length,
- deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
- firstParam :
- jQuery.Deferred(),
- promise = deferred.promise();
- function resolveFunc( i ) {
- return function( value ) {
- args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- if ( !( --count ) ) {
- deferred.resolveWith( deferred, args );
- }
- };
- }
- function progressFunc( i ) {
- return function( value ) {
- pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
- deferred.notifyWith( promise, pValues );
- };
- }
- if ( length > 1 ) {
- for ( ; i < length; i++ ) {
- if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
- args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
- } else {
- --count;
- }
- }
- if ( !count ) {
- deferred.resolveWith( deferred, args );
- }
- } else if ( deferred !== firstParam ) {
- deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
- }
- return promise;
- }
-});
-
-
-
-
-jQuery.support = (function() {
-
- var div = document.createElement( "div" ),
- documentElement = document.documentElement,
- all,
- a,
- select,
- opt,
- input,
- marginDiv,
- support,
- fragment,
- body,
- testElementParent,
- testElement,
- testElementStyle,
- tds,
- events,
- eventName,
- i,
- isSupported;
-
- // Preliminary tests
- div.setAttribute("className", "t");
- div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/><nav></nav>";
-
-
- all = div.getElementsByTagName( "*" );
- a = div.getElementsByTagName( "a" )[ 0 ];
-
- // Can't get basic test support
- if ( !all || !all.length || !a ) {
- return {};
- }
-
- // First batch of supports tests
- select = document.createElement( "select" );
- opt = select.appendChild( document.createElement("option") );
- input = div.getElementsByTagName( "input" )[ 0 ];
-
- support = {
- // IE strips leading whitespace when .innerHTML is used
- leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
- // Make sure that tbody elements aren't automatically inserted
- // IE will insert them into empty tables
- tbody: !div.getElementsByTagName( "tbody" ).length,
-
- // Make sure that link elements get serialized correctly by innerHTML
- // This requires a wrapper element in IE
- htmlSerialize: !!div.getElementsByTagName( "link" ).length,
-
- // Get the style information from getAttribute
- // (IE uses .cssText instead)
- style: /top/.test( a.getAttribute("style") ),
-
- // Make sure that URLs aren't manipulated
- // (IE normalizes it by default)
- hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
-
- // Make sure that element opacity exists
- // (IE uses filter instead)
- // Use a regex to work around a WebKit issue. See #5145
- opacity: /^0.55/.test( a.style.opacity ),
-
- // Verify style float existence
- // (IE uses styleFloat instead of cssFloat)
- cssFloat: !!a.style.cssFloat,
-
- // Make sure unknown elements (like HTML5 elems) are handled appropriately
- unknownElems: !!div.getElementsByTagName( "nav" ).length,
-
- // Make sure that if no value is specified for a checkbox
- // that it defaults to "on".
- // (WebKit defaults to "" instead)
- checkOn: ( input.value === "on" ),
-
- // Make sure that a selected-by-default option has a working selected property.
- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
- optSelected: opt.selected,
-
- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
- getSetAttribute: div.className !== "t",
-
- // Tests for enctype support on a form(#6743)
- enctype: !!document.createElement("form").enctype,
-
- // Will be defined later
- submitBubbles: true,
- changeBubbles: true,
- focusinBubbles: false,
- deleteExpando: true,
- noCloneEvent: true,
- inlineBlockNeedsLayout: false,
- shrinkWrapBlocks: false,
- reliableMarginRight: true
- };
-
- // Make sure checked status is properly cloned
- input.checked = true;
- support.noCloneChecked = input.cloneNode( true ).checked;
-
- // Make sure that the options inside disabled selects aren't marked as disabled
- // (WebKit marks them as disabled)
- select.disabled = true;
- support.optDisabled = !opt.disabled;
-
- // Test to see if it's possible to delete an expando from an element
- // Fails in Internet Explorer
- try {
- delete div.test;
- } catch( e ) {
- support.deleteExpando = false;
- }
-
- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
- div.attachEvent( "onclick", function() {
- // Cloning a node shouldn't copy over any
- // bound event handlers (IE does this)
- support.noCloneEvent = false;
- });
- div.cloneNode( true ).fireEvent( "onclick" );
- }
-
- // Check if a radio maintains its value
- // after being appended to the DOM
- input = document.createElement("input");
- input.value = "t";
- input.setAttribute("type", "radio");
- support.radioValue = input.value === "t";
-
- input.setAttribute("checked", "checked");
- div.appendChild( input );
- fragment = document.createDocumentFragment();
- fragment.appendChild( div.lastChild );
-
- // WebKit doesn't clone checked state correctly in fragments
- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
- div.innerHTML = "";
-
- // Figure out if the W3C box model works as expected
- div.style.width = div.style.paddingLeft = "1px";
-
- // We don't want to do body-related feature tests on frameset
- // documents, which lack a body. So we use
- // document.getElementsByTagName("body")[0], which is undefined in
- // frameset documents, while document.body isn’t. (7398)
- body = document.getElementsByTagName("body")[ 0 ];
- // We use our own, invisible, body unless the body is already present
- // in which case we use a div (#9239)
- testElement = document.createElement( body ? "div" : "body" );
- testElementStyle = {
- visibility: "hidden",
- width: 0,
- height: 0,
- border: 0,
- margin: 0,
- background: "none"
- };
- if ( body ) {
- jQuery.extend( testElementStyle, {
- position: "absolute",
- left: "-999px",
- top: "-999px"
- });
- }
- for ( i in testElementStyle ) {
- testElement.style[ i ] = testElementStyle[ i ];
- }
- testElement.appendChild( div );
- testElementParent = body || documentElement;
- testElementParent.insertBefore( testElement, testElementParent.firstChild );
-
- // Check if a disconnected checkbox will retain its checked
- // value of true after appended to the DOM (IE6/7)
- support.appendChecked = input.checked;
-
- support.boxModel = div.offsetWidth === 2;
-
- if ( "zoom" in div.style ) {
- // Check if natively block-level elements act like inline-block
- // elements when setting their display to 'inline' and giving
- // them layout
- // (IE < 8 does this)
- div.style.display = "inline";
- div.style.zoom = 1;
- support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
-
- // Check if elements with layout shrink-wrap their children
- // (IE 6 does this)
- div.style.display = "";
- div.innerHTML = "<div style='width:4px;'></div>";
- support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
- }
-
- div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
- tds = div.getElementsByTagName( "td" );
-
- // Check if table cells still have offsetWidth/Height when they are set
- // to display:none and there are still other visible table cells in a
- // table row; if so, offsetWidth/Height are not reliable for use when
- // determining if an element has been hidden directly using
- // display:none (it is still safe to use offsets if a parent element is
- // hidden; don safety goggles and see bug #4512 for more information).
- // (only IE 8 fails this test)
- isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
- tds[ 0 ].style.display = "";
- tds[ 1 ].style.display = "none";
-
- // Check if empty table cells still have offsetWidth/Height
- // (IE < 8 fail this test)
- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
- div.innerHTML = "";
-
- // Check if div with explicit width and no margin-right incorrectly
- // gets computed margin-right based on width of container. For more
- // info see bug #3333
- // Fails in WebKit before Feb 2011 nightlies
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- if ( document.defaultView && document.defaultView.getComputedStyle ) {
- marginDiv = document.createElement( "div" );
- marginDiv.style.width = "0";
- marginDiv.style.marginRight = "0";
- div.appendChild( marginDiv );
- support.reliableMarginRight =
- ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
- }
-
- // Technique from Juriy Zaytsev
- // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
- // We only care about the case where non-standard event systems
- // are used, namely in IE. Short-circuiting here helps us to
- // avoid an eval call (in setAttribute) which can cause CSP
- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
- if ( div.attachEvent ) {
- for( i in {
- submit: 1,
- change: 1,
- focusin: 1
- } ) {
- eventName = "on" + i;
- isSupported = ( eventName in div );
- if ( !isSupported ) {
- div.setAttribute( eventName, "return;" );
- isSupported = ( typeof div[ eventName ] === "function" );
- }
- support[ i + "Bubbles" ] = isSupported;
- }
- }
-
- // Run fixed position tests at doc ready to avoid a crash
- // related to the invisible body in IE8
- jQuery(function() {
- var container, outer, inner, table, td, offsetSupport,
- conMarginTop = 1,
- ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",
- vb = "visibility:hidden;border:0;",
- style = "style='" + ptlm + "border:5px solid #000;padding:0;'",
- html = "<div " + style + "><div></div></div>" +
- "<table " + style + " cellpadding='0' cellspacing='0'>" +
- "<tr><td></td></tr></table>";
-
- // Reconstruct a container
- body = document.getElementsByTagName("body")[0];
- if ( !body ) {
- // Return for frameset docs that don't have a body
- // These tests cannot be done
- return;
- }
-
- container = document.createElement("div");
- container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
- body.insertBefore( container, body.firstChild );
-
- // Construct a test element
- testElement = document.createElement("div");
- testElement.style.cssText = ptlm + vb;
-
- testElement.innerHTML = html;
- container.appendChild( testElement );
- outer = testElement.firstChild;
- inner = outer.firstChild;
- td = outer.nextSibling.firstChild.firstChild;
-
- offsetSupport = {
- doesNotAddBorder: ( inner.offsetTop !== 5 ),
- doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
- };
-
- inner.style.position = "fixed";
- inner.style.top = "20px";
-
- // safari subtracts parent border width here which is 5px
- offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
- inner.style.position = inner.style.top = "";
-
- outer.style.overflow = "hidden";
- outer.style.position = "relative";
-
- offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
- offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
-
- body.removeChild( container );
- testElement = container = null;
-
- jQuery.extend( support, offsetSupport );
- });
-
- testElement.innerHTML = "";
- testElementParent.removeChild( testElement );
-
- // Null connected elements to avoid leaks in IE
- testElement = fragment = select = opt = body = marginDiv = div = input = null;
-
- return support;
-})();
-
-// Keep track of boxModel
-jQuery.boxModel = jQuery.support.boxModel;
-
-
-
-
-var rbrace = /^(?:\{.*\}|\[.*\])$/,
- rmultiDash = /([A-Z])/g;
-
-jQuery.extend({
- cache: {},
-
- // Please use with caution
- uuid: 0,
-
- // Unique for each copy of jQuery on the page
- // Non-digits removed to match rinlinejQuery
- expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
-
- // The following elements throw uncatchable exceptions if you
- // attempt to add expando properties to them.
- noData: {
- "embed": true,
- // Ban all objects except for Flash (which handle expandos)
- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
- "applet": true
- },
-
- hasData: function( elem ) {
- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
- return !!elem && !isEmptyDataObject( elem );
- },
-
- data: function( elem, name, data, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var privateCache, thisCache, ret,
- internalKey = jQuery.expando,
- getByName = typeof name === "string",
-
- // We have to handle DOM nodes and JS objects differently because IE6-7
- // can't GC object references properly across the DOM-JS boundary
- isNode = elem.nodeType,
-
- // Only DOM nodes need the global jQuery cache; JS object data is
- // attached directly to the object so GC can occur automatically
- cache = isNode ? jQuery.cache : elem,
-
- // Only defining an ID for JS objects if its cache already exists allows
- // the code to shortcut on the same path as a DOM node with no cache
- id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando,
- isEvents = name === "events";
-
- // Avoid doing any more work than we need to when trying to get data on an
- // object that has no data at all
- if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
- return;
- }
-
- if ( !id ) {
- // Only DOM nodes need a new unique ID for each element since their data
- // ends up in the global cache
- if ( isNode ) {
- elem[ jQuery.expando ] = id = ++jQuery.uuid;
- } else {
- id = jQuery.expando;
- }
- }
-
- if ( !cache[ id ] ) {
- cache[ id ] = {};
-
- // Avoids exposing jQuery metadata on plain JS objects when the object
- // is serialized using JSON.stringify
- if ( !isNode ) {
- cache[ id ].toJSON = jQuery.noop;
- }
- }
-
- // An object can be passed to jQuery.data instead of a key/value pair; this gets
- // shallow copied over onto the existing cache
- if ( typeof name === "object" || typeof name === "function" ) {
- if ( pvt ) {
- cache[ id ] = jQuery.extend( cache[ id ], name );
- } else {
- cache[ id ].data = jQuery.extend( cache[ id ].data, name );
- }
- }
-
- privateCache = thisCache = cache[ id ];
-
- // jQuery data() is stored in a separate object inside the object's internal data
- // cache in order to avoid key collisions between internal data and user-defined
- // data.
- if ( !pvt ) {
- if ( !thisCache.data ) {
- thisCache.data = {};
- }
-
- thisCache = thisCache.data;
- }
-
- if ( data !== undefined ) {
- thisCache[ jQuery.camelCase( name ) ] = data;
- }
-
- // Users should not attempt to inspect the internal events object using jQuery.data,
- // it is undocumented and subject to change. But does anyone listen? No.
- if ( isEvents && !thisCache[ name ] ) {
- return privateCache.events;
- }
-
- // Check for both converted-to-camel and non-converted data property names
- // If a data property was specified
- if ( getByName ) {
-
- // First Try to find as-is property data
- ret = thisCache[ name ];
-
- // Test for null|undefined property data
- if ( ret == null ) {
-
- // Try to find the camelCased property
- ret = thisCache[ jQuery.camelCase( name ) ];
- }
- } else {
- ret = thisCache;
- }
-
- return ret;
- },
-
- removeData: function( elem, name, pvt /* Internal Use Only */ ) {
- if ( !jQuery.acceptData( elem ) ) {
- return;
- }
-
- var thisCache, i, l,
-
- // Reference to internal data cache key
- internalKey = jQuery.expando,
-
- isNode = elem.nodeType,
-
- // See jQuery.data for more information
- cache = isNode ? jQuery.cache : elem,
-
- // See jQuery.data for more information
- id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
-
- // If there is already no cache entry for this object, there is no
- // purpose in continuing
- if ( !cache[ id ] ) {
- return;
- }
-
- if ( name ) {
-
- thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
- if ( thisCache ) {
-
- // Support space separated names
- if ( jQuery.isArray( name ) ) {
- name = name;
- } else if ( name in thisCache ) {
- name = [ name ];
- } else {
-
- // split the camel cased version by spaces
- name = jQuery.camelCase( name );
- if ( name in thisCache ) {
- name = [ name ];
- } else {
- name = name.split( " " );
- }
- }
-
- for ( i = 0, l = name.length; i < l; i++ ) {
- delete thisCache[ name[i] ];
- }
-
- // If there is no data left in the cache, we want to continue
- // and let the cache object itself get destroyed
- if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
- return;
- }
- }
- }
-
- // See jQuery.data for more information
- if ( !pvt ) {
- delete cache[ id ].data;
-
- // Don't destroy the parent cache unless the internal data object
- // had been the only thing left in it
- if ( !isEmptyDataObject(cache[ id ]) ) {
- return;
- }
- }
-
- // Browsers that fail expando deletion also refuse to delete expandos on
- // the window, but it will allow it on all other JS objects; other browsers
- // don't care
- // Ensure that `cache` is not a window object #10080
- if ( jQuery.support.deleteExpando || !cache.setInterval ) {
- delete cache[ id ];
- } else {
- cache[ id ] = null;
- }
-
- // We destroyed the cache and need to eliminate the expando on the node to avoid
- // false lookups in the cache for entries that no longer exist
- if ( isNode ) {
- // IE does not allow us to delete expando properties from nodes,
- // nor does it have a removeAttribute function on Document nodes;
- // we must handle all of these cases
- if ( jQuery.support.deleteExpando ) {
- delete elem[ jQuery.expando ];
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( jQuery.expando );
- } else {
- elem[ jQuery.expando ] = null;
- }
- }
- },
-
- // For internal use only.
- _data: function( elem, name, data ) {
- return jQuery.data( elem, name, data, true );
- },
-
- // A method for determining if a DOM node can handle the data expando
- acceptData: function( elem ) {
- if ( elem.nodeName ) {
- var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
- if ( match ) {
- return !(match === true || elem.getAttribute("classid") !== match);
- }
- }
-
- return true;
- }
-});
-
-jQuery.fn.extend({
- data: function( key, value ) {
- var parts, attr, name,
- data = null;
-
- if ( typeof key === "undefined" ) {
- if ( this.length ) {
- data = jQuery.data( this[0] );
-
- if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
- attr = this[0].attributes;
- for ( var i = 0, l = attr.length; i < l; i++ ) {
- name = attr[i].name;
-
- if ( name.indexOf( "data-" ) === 0 ) {
- name = jQuery.camelCase( name.substring(5) );
-
- dataAttr( this[0], name, data[ name ] );
- }
- }
- jQuery._data( this[0], "parsedAttrs", true );
- }
- }
-
- return data;
-
- } else if ( typeof key === "object" ) {
- return this.each(function() {
- jQuery.data( this, key );
- });
- }
-
- parts = key.split(".");
- parts[1] = parts[1] ? "." + parts[1] : "";
-
- if ( value === undefined ) {
- data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
-
- // Try to fetch any internally stored data first
- if ( data === undefined && this.length ) {
- data = jQuery.data( this[0], key );
- data = dataAttr( this[0], key, data );
- }
-
- return data === undefined && parts[1] ?
- this.data( parts[0] ) :
- data;
-
- } else {
- return this.each(function() {
- var $this = jQuery( this ),
- args = [ parts[0], value ];
-
- $this.triggerHandler( "setData" + parts[1] + "!", args );
- jQuery.data( this, key, value );
- $this.triggerHandler( "changeData" + parts[1] + "!", args );
- });
- }
- },
-
- removeData: function( key ) {
- return this.each(function() {
- jQuery.removeData( this, key );
- });
- }
-});
-
-function dataAttr( elem, key, data ) {
- // If nothing was found internally, try to fetch any
- // data from the HTML5 data-* attribute
- if ( data === undefined && elem.nodeType === 1 ) {
-
- var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
- data = elem.getAttribute( name );
-
- if ( typeof data === "string" ) {
- try {
- data = data === "true" ? true :
- data === "false" ? false :
- data === "null" ? null :
- jQuery.isNumeric( data ) ? parseFloat( data ) :
- rbrace.test( data ) ? jQuery.parseJSON( data ) :
- data;
- } catch( e ) {}
-
- // Make sure we set the data so it isn't changed later
- jQuery.data( elem, key, data );
-
- } else {
- data = undefined;
- }
- }
-
- return data;
-}
-
-// checks a cache object for emptiness
-function isEmptyDataObject( obj ) {
- for ( var name in obj ) {
-
- // if the public data object is empty, the private is still empty
- if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
- continue;
- }
- if ( name !== "toJSON" ) {
- return false;
- }
- }
-
- return true;
-}
-
-
-
-
-function handleQueueMarkDefer( elem, type, src ) {
- var deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- defer = jQuery._data( elem, deferDataKey );
- if ( defer &&
- ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
- ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
- // Give room for hard-coded callbacks to fire first
- // and eventually mark/queue something else on the element
- setTimeout( function() {
- if ( !jQuery._data( elem, queueDataKey ) &&
- !jQuery._data( elem, markDataKey ) ) {
- jQuery.removeData( elem, deferDataKey, true );
- defer.fire();
- }
- }, 0 );
- }
-}
-
-jQuery.extend({
-
- _mark: function( elem, type ) {
- if ( elem ) {
- type = ( type || "fx" ) + "mark";
- jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
- }
- },
-
- _unmark: function( force, elem, type ) {
- if ( force !== true ) {
- type = elem;
- elem = force;
- force = false;
- }
- if ( elem ) {
- type = type || "fx";
- var key = type + "mark",
- count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
- if ( count ) {
- jQuery._data( elem, key, count );
- } else {
- jQuery.removeData( elem, key, true );
- handleQueueMarkDefer( elem, type, "mark" );
- }
- }
- },
-
- queue: function( elem, type, data ) {
- var q;
- if ( elem ) {
- type = ( type || "fx" ) + "queue";
- q = jQuery._data( elem, type );
-
- // Speed up dequeue by getting out quickly if this is just a lookup
- if ( data ) {
- if ( !q || jQuery.isArray(data) ) {
- q = jQuery._data( elem, type, jQuery.makeArray(data) );
- } else {
- q.push( data );
- }
- }
- return q || [];
- }
- },
-
- dequeue: function( elem, type ) {
- type = type || "fx";
-
- var queue = jQuery.queue( elem, type ),
- fn = queue.shift(),
- hooks = {};
-
- // If the fx queue is dequeued, always remove the progress sentinel
- if ( fn === "inprogress" ) {
- fn = queue.shift();
- }
-
- if ( fn ) {
- // Add a progress sentinel to prevent the fx queue from being
- // automatically dequeued
- if ( type === "fx" ) {
- queue.unshift( "inprogress" );
- }
-
- jQuery._data( elem, type + ".run", hooks );
- fn.call( elem, function() {
- jQuery.dequeue( elem, type );
- }, hooks );
- }
-
- if ( !queue.length ) {
- jQuery.removeData( elem, type + "queue " + type + ".run", true );
- handleQueueMarkDefer( elem, type, "queue" );
- }
- }
-});
-
-jQuery.fn.extend({
- queue: function( type, data ) {
- if ( typeof type !== "string" ) {
- data = type;
- type = "fx";
- }
-
- if ( data === undefined ) {
- return jQuery.queue( this[0], type );
- }
- return this.each(function() {
- var queue = jQuery.queue( this, type, data );
-
- if ( type === "fx" && queue[0] !== "inprogress" ) {
- jQuery.dequeue( this, type );
- }
- });
- },
- dequeue: function( type ) {
- return this.each(function() {
- jQuery.dequeue( this, type );
- });
- },
- // Based off of the plugin by Clint Helfers, with permission.
- // http://blindsignals.com/index.php/2009/07/jquery-delay/
- delay: function( time, type ) {
- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
- type = type || "fx";
-
- return this.queue( type, function( next, hooks ) {
- var timeout = setTimeout( next, time );
- hooks.stop = function() {
- clearTimeout( timeout );
- };
- });
- },
- clearQueue: function( type ) {
- return this.queue( type || "fx", [] );
- },
- // Get a promise resolved when queues of a certain type
- // are emptied (fx is the type by default)
- promise: function( type, object ) {
- if ( typeof type !== "string" ) {
- object = type;
- type = undefined;
- }
- type = type || "fx";
- var defer = jQuery.Deferred(),
- elements = this,
- i = elements.length,
- count = 1,
- deferDataKey = type + "defer",
- queueDataKey = type + "queue",
- markDataKey = type + "mark",
- tmp;
- function resolve() {
- if ( !( --count ) ) {
- defer.resolveWith( elements, [ elements ] );
- }
- }
- while( i-- ) {
- if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
- ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
- jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
- jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
- count++;
- tmp.add( resolve );
- }
- }
- resolve();
- return defer.promise();
- }
-});
-
-
-
-
-var rclass = /[\n\t\r]/g,
- rspace = /\s+/,
- rreturn = /\r/g,
- rtype = /^(?:button|input)$/i,
- rfocusable = /^(?:button|input|object|select|textarea)$/i,
- rclickable = /^a(?:rea)?$/i,
- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
- getSetAttribute = jQuery.support.getSetAttribute,
- nodeHook, boolHook, fixSpecified;
-
-jQuery.fn.extend({
- attr: function( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.attr );
- },
-
- removeAttr: function( name ) {
- return this.each(function() {
- jQuery.removeAttr( this, name );
- });
- },
-
- prop: function( name, value ) {
- return jQuery.access( this, name, value, true, jQuery.prop );
- },
-
- removeProp: function( name ) {
- name = jQuery.propFix[ name ] || name;
- return this.each(function() {
- // try/catch handles cases where IE balks (such as removing a property on window)
- try {
- this[ name ] = undefined;
- delete this[ name ];
- } catch( e ) {}
- });
- },
-
- addClass: function( value ) {
- var classNames, i, l, elem,
- setClass, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).addClass( value.call(this, j, this.className) );
- });
- }
-
- if ( value && typeof value === "string" ) {
- classNames = value.split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 ) {
- if ( !elem.className && classNames.length === 1 ) {
- elem.className = value;
-
- } else {
- setClass = " " + elem.className + " ";
-
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
- setClass += classNames[ c ] + " ";
- }
- }
- elem.className = jQuery.trim( setClass );
- }
- }
- }
- }
-
- return this;
- },
-
- removeClass: function( value ) {
- var classNames, i, l, elem, className, c, cl;
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( j ) {
- jQuery( this ).removeClass( value.call(this, j, this.className) );
- });
- }
-
- if ( (value && typeof value === "string") || value === undefined ) {
- classNames = ( value || "" ).split( rspace );
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- elem = this[ i ];
-
- if ( elem.nodeType === 1 && elem.className ) {
- if ( value ) {
- className = (" " + elem.className + " ").replace( rclass, " " );
- for ( c = 0, cl = classNames.length; c < cl; c++ ) {
- className = className.replace(" " + classNames[ c ] + " ", " ");
- }
- elem.className = jQuery.trim( className );
-
- } else {
- elem.className = "";
- }
- }
- }
- }
-
- return this;
- },
-
- toggleClass: function( value, stateVal ) {
- var type = typeof value,
- isBool = typeof stateVal === "boolean";
-
- if ( jQuery.isFunction( value ) ) {
- return this.each(function( i ) {
- jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
- });
- }
-
- return this.each(function() {
- if ( type === "string" ) {
- // toggle individual class names
- var className,
- i = 0,
- self = jQuery( this ),
- state = stateVal,
- classNames = value.split( rspace );
-
- while ( (className = classNames[ i++ ]) ) {
- // check each className given, space seperated list
- state = isBool ? state : !self.hasClass( className );
- self[ state ? "addClass" : "removeClass" ]( className );
- }
-
- } else if ( type === "undefined" || type === "boolean" ) {
- if ( this.className ) {
- // store className if set
- jQuery._data( this, "__className__", this.className );
- }
-
- // toggle whole className
- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
- }
- });
- },
-
- hasClass: function( selector ) {
- var className = " " + selector + " ",
- i = 0,
- l = this.length;
- for ( ; i < l; i++ ) {
- if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
- return true;
- }
- }
-
- return false;
- },
-
- val: function( value ) {
- var hooks, ret, isFunction,
- elem = this[0];
-
- if ( !arguments.length ) {
- if ( elem ) {
- hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
-
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
- return ret;
- }
-
- ret = elem.value;
-
- return typeof ret === "string" ?
- // handle most common string cases
- ret.replace(rreturn, "") :
- // handle cases where value is null/undef or number
- ret == null ? "" : ret;
- }
-
- return undefined;
- }
-
- isFunction = jQuery.isFunction( value );
-
- return this.each(function( i ) {
- var self = jQuery(this), val;
-
- if ( this.nodeType !== 1 ) {
- return;
- }
-
- if ( isFunction ) {
- val = value.call( this, i, self.val() );
- } else {
- val = value;
- }
-
- // Treat null/undefined as ""; convert numbers to string
- if ( val == null ) {
- val = "";
- } else if ( typeof val === "number" ) {
- val += "";
- } else if ( jQuery.isArray( val ) ) {
- val = jQuery.map(val, function ( value ) {
- return value == null ? "" : value + "";
- });
- }
-
- hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
-
- // If set returns undefined, fall back to normal setting
- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
- this.value = val;
- }
- });
- }
-});
-
-jQuery.extend({
- valHooks: {
- option: {
- get: function( elem ) {
- // attributes.value is undefined in Blackberry 4.7 but
- // uses .value. See #6932
- var val = elem.attributes.value;
- return !val || val.specified ? elem.value : elem.text;
- }
- },
- select: {
- get: function( elem ) {
- var value, i, max, option,
- index = elem.selectedIndex,
- values = [],
- options = elem.options,
- one = elem.type === "select-one";
-
- // Nothing was selected
- if ( index < 0 ) {
- return null;
- }
-
- // Loop through all the selected options
- i = one ? index : 0;
- max = one ? index + 1 : options.length;
- for ( ; i < max; i++ ) {
- option = options[ i ];
-
- // Don't return options that are disabled or in a disabled optgroup
- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
- // Get the specific value for the option
- value = jQuery( option ).val();
-
- // We don't need an array for one selects
- if ( one ) {
- return value;
- }
-
- // Multi-Selects return an array
- values.push( value );
- }
- }
-
- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
- if ( one && !values.length && options.length ) {
- return jQuery( options[ index ] ).val();
- }
-
- return values;
- },
-
- set: function( elem, value ) {
- var values = jQuery.makeArray( value );
-
- jQuery(elem).find("option").each(function() {
- this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
- });
-
- if ( !values.length ) {
- elem.selectedIndex = -1;
- }
- return values;
- }
- }
- },
-
- attrFn: {
- val: true,
- css: true,
- html: true,
- text: true,
- data: true,
- width: true,
- height: true,
- offset: true
- },
-
- attr: function( elem, name, value, pass ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set attributes on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
- }
-
- if ( pass && name in jQuery.attrFn ) {
- return jQuery( elem )[ name ]( value );
- }
-
- // Fallback to prop when attributes are not supported
- if ( !("getAttribute" in elem) ) {
- return jQuery.prop( elem, name, value );
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- // All attributes are lowercase
- // Grab necessary hook if one is defined
- if ( notxml ) {
- name = name.toLowerCase();
- hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
- }
-
- if ( value !== undefined ) {
-
- if ( value === null ) {
- jQuery.removeAttr( elem, name );
- return undefined;
-
- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- elem.setAttribute( name, "" + value );
- return value;
- }
-
- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
-
- ret = elem.getAttribute( name );
-
- // Non-existent attributes return null, we normalize to undefined
- return ret === null ?
- undefined :
- ret;
- }
- },
-
- removeAttr: function( elem, value ) {
- var propName, attrNames, name, l,
- i = 0;
-
- if ( elem.nodeType === 1 ) {
- attrNames = ( value || "" ).split( rspace );
- l = attrNames.length;
-
- for ( ; i < l; i++ ) {
- name = attrNames[ i ].toLowerCase();
- propName = jQuery.propFix[ name ] || name;
-
- // See #9699 for explanation of this approach (setting first, then removal)
- jQuery.attr( elem, name, "" );
- elem.removeAttribute( getSetAttribute ? name : propName );
-
- // Set corresponding property to false for boolean attributes
- if ( rboolean.test( name ) && propName in elem ) {
- elem[ propName ] = false;
- }
- }
- }
- },
-
- attrHooks: {
- type: {
- set: function( elem, value ) {
- // We can't allow the type property to be changed (since it causes problems in IE)
- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
- jQuery.error( "type property can't be changed" );
- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
- // Setting the type on a radio button after the value resets the value in IE6-9
- // Reset value to it's default in case type is set after value
- // This is for element creation
- var val = elem.value;
- elem.setAttribute( "type", value );
- if ( val ) {
- elem.value = val;
- }
- return value;
- }
- }
- },
- // Use the value property for back compat
- // Use the nodeHook for button elements in IE6/7 (#1954)
- value: {
- get: function( elem, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.get( elem, name );
- }
- return name in elem ?
- elem.value :
- null;
- },
- set: function( elem, value, name ) {
- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
- return nodeHook.set( elem, value, name );
- }
- // Does not return so that setAttribute is also used
- elem.value = value;
- }
- }
- },
-
- propFix: {
- tabindex: "tabIndex",
- readonly: "readOnly",
- "for": "htmlFor",
- "class": "className",
- maxlength: "maxLength",
- cellspacing: "cellSpacing",
- cellpadding: "cellPadding",
- rowspan: "rowSpan",
- colspan: "colSpan",
- usemap: "useMap",
- frameborder: "frameBorder",
- contenteditable: "contentEditable"
- },
-
- prop: function( elem, name, value ) {
- var ret, hooks, notxml,
- nType = elem.nodeType;
-
- // don't get/set properties on text, comment and attribute nodes
- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
- return undefined;
- }
-
- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
- if ( notxml ) {
- // Fix name and attach hooks
- name = jQuery.propFix[ name ] || name;
- hooks = jQuery.propHooks[ name ];
- }
-
- if ( value !== undefined ) {
- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
- return ret;
-
- } else {
- return ( elem[ name ] = value );
- }
-
- } else {
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
- return ret;
-
- } else {
- return elem[ name ];
- }
- }
- },
-
- propHooks: {
- tabIndex: {
- get: function( elem ) {
- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
- var attributeNode = elem.getAttributeNode("tabindex");
-
- return attributeNode && attributeNode.specified ?
- parseInt( attributeNode.value, 10 ) :
- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
- 0 :
- undefined;
- }
- }
- }
-});
-
-// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
-jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
-
-// Hook for boolean attributes
-boolHook = {
- get: function( elem, name ) {
- // Align boolean attributes with corresponding properties
- // Fall back to attribute presence where some booleans are not supported
- var attrNode,
- property = jQuery.prop( elem, name );
- return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
- name.toLowerCase() :
- undefined;
- },
- set: function( elem, value, name ) {
- var propName;
- if ( value === false ) {
- // Remove boolean attributes when set to false
- jQuery.removeAttr( elem, name );
- } else {
- // value is true since we know at this point it's type boolean and not false
- // Set boolean attributes to the same name and set the DOM property
- propName = jQuery.propFix[ name ] || name;
- if ( propName in elem ) {
- // Only set the IDL specifically if it already exists on the element
- elem[ propName ] = true;
- }
-
- elem.setAttribute( name, name.toLowerCase() );
- }
- return name;
- }
-};
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-if ( !getSetAttribute ) {
-
- fixSpecified = {
- name: true,
- id: true
- };
-
- // Use this for any attribute in IE6/7
- // This fixes almost every IE6/7 issue
- nodeHook = jQuery.valHooks.button = {
- get: function( elem, name ) {
- var ret;
- ret = elem.getAttributeNode( name );
- return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
- ret.nodeValue :
- undefined;
- },
- set: function( elem, value, name ) {
- // Set the existing or create a new attribute node
- var ret = elem.getAttributeNode( name );
- if ( !ret ) {
- ret = document.createAttribute( name );
- elem.setAttributeNode( ret );
- }
- return ( ret.nodeValue = value + "" );
- }
- };
-
- // Apply the nodeHook to tabindex
- jQuery.attrHooks.tabindex.set = nodeHook.set;
-
- // Set width and height to auto instead of 0 on empty string( Bug #8150 )
- // This is for removals
- jQuery.each([ "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- set: function( elem, value ) {
- if ( value === "" ) {
- elem.setAttribute( name, "auto" );
- return value;
- }
- }
- });
- });
-
- // Set contenteditable to false on removals(#10429)
- // Setting to empty string throws an error as an invalid value
- jQuery.attrHooks.contenteditable = {
- get: nodeHook.get,
- set: function( elem, value, name ) {
- if ( value === "" ) {
- value = "false";
- }
- nodeHook.set( elem, value, name );
- }
- };
-}
-
-
-// Some attributes require a special call on IE
-if ( !jQuery.support.hrefNormalized ) {
- jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
- get: function( elem ) {
- var ret = elem.getAttribute( name, 2 );
- return ret === null ? undefined : ret;
- }
- });
- });
-}
-
-if ( !jQuery.support.style ) {
- jQuery.attrHooks.style = {
- get: function( elem ) {
- // Return undefined in the case of empty string
- // Normalize to lowercase since IE uppercases css property names
- return elem.style.cssText.toLowerCase() || undefined;
- },
- set: function( elem, value ) {
- return ( elem.style.cssText = "" + value );
- }
- };
-}
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-if ( !jQuery.support.optSelected ) {
- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
- get: function( elem ) {
- var parent = elem.parentNode;
-
- if ( parent ) {
- parent.selectedIndex;
-
- // Make sure that it also works with optgroups, see #5701
- if ( parent.parentNode ) {
- parent.parentNode.selectedIndex;
- }
- }
- return null;
- }
- });
-}
-
-// IE6/7 call enctype encoding
-if ( !jQuery.support.enctype ) {
- jQuery.propFix.enctype = "encoding";
-}
-
-// Radios and checkboxes getter/setter
-if ( !jQuery.support.checkOn ) {
- jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = {
- get: function( elem ) {
- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
- return elem.getAttribute("value") === null ? "on" : elem.value;
- }
- };
- });
-}
-jQuery.each([ "radio", "checkbox" ], function() {
- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
- set: function( elem, value ) {
- if ( jQuery.isArray( value ) ) {
- return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
- }
- }
- });
-});
-
-
-
-
-var rnamespaces = /\.(.*)$/,
- rformElems = /^(?:textarea|input|select)$/i,
- rperiod = /\./g,
- rspaces = / /g,
- rescape = /[^\w\s.|`]/g,
- rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
- rhoverHack = /\bhover(\.\S+)?/,
- rkeyEvent = /^key/,
- rmouseEvent = /^(?:mouse|contextmenu)|click/,
- rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
- quickParse = function( selector ) {
- var quick = rquickIs.exec( selector );
- if ( quick ) {
- // 0 1 2 3
- // [ _, tag, id, class ]
- quick[1] = ( quick[1] || "" ).toLowerCase();
- quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
- }
- return quick;
- },
- quickIs = function( elem, m ) {
- return (
- (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
- (!m[2] || elem.id === m[2]) &&
- (!m[3] || m[3].test( elem.className ))
- );
- },
- hoverHack = function( events ) {
- return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
- };
-
-/*
- * Helper functions for managing events -- not part of the public interface.
- * Props to Dean Edwards' addEvent library for many of the ideas.
- */
-jQuery.event = {
-
- add: function( elem, types, handler, data, selector ) {
-
- var elemData, eventHandle, events,
- t, tns, type, namespaces, handleObj,
- handleObjIn, quick, handlers, special;
-
- // Don't attach events to noData or text/comment nodes (allow plain objects tho)
- if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
- return;
- }
-
- // Caller can pass in an object of custom data in lieu of the handler
- if ( handler.handler ) {
- handleObjIn = handler;
- handler = handleObjIn.handler;
- }
-
- // Make sure that the handler has a unique ID, used to find/remove it later
- if ( !handler.guid ) {
- handler.guid = jQuery.guid++;
- }
-
- // Init the element's event structure and main handler, if this is the first
- events = elemData.events;
- if ( !events ) {
- elemData.events = events = {};
- }
- eventHandle = elemData.handle;
- if ( !eventHandle ) {
- elemData.handle = eventHandle = function( e ) {
- // Discard the second event of a jQuery.event.trigger() and
- // when an event is called after a page has unloaded
- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
- undefined;
- };
- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
- eventHandle.elem = elem;
- }
-
- // Handle multiple events separated by a space
- // jQuery(...).bind("mouseover mouseout", fn);
- types = hoverHack(types).split( " " );
- for ( t = 0; t < types.length; t++ ) {
-
- tns = rtypenamespace.exec( types[t] ) || [];
- type = tns[1];
- namespaces = ( tns[2] || "" ).split( "." ).sort();
-
- // If event changes its type, use the special event handlers for the changed type
- special = jQuery.event.special[ type ] || {};
-
- // If selector defined, determine special event api type, otherwise given type
- type = ( selector ? special.delegateType : special.bindType ) || type;
-
- // Update special based on newly reset type
- special = jQuery.event.special[ type ] || {};
-
- // handleObj is passed to all event handlers
- handleObj = jQuery.extend({
- type: type,
- origType: tns[1],
- data: data,
- handler: handler,
- guid: handler.guid,
- selector: selector,
- namespace: namespaces.join(".")
- }, handleObjIn );
-
- // Delegated event; pre-analyze selector so it's processed quickly on event dispatch
- if ( selector ) {
- handleObj.quick = quickParse( selector );
- if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) {
- handleObj.isPositional = true;
- }
- }
-
- // Init the event handler queue if we're the first
- handlers = events[ type ];
- if ( !handlers ) {
- handlers = events[ type ] = [];
- handlers.delegateCount = 0;
-
- // Only use addEventListener/attachEvent if the special events handler returns false
- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
- // Bind the global event handler to the element
- if ( elem.addEventListener ) {
- elem.addEventListener( type, eventHandle, false );
-
- } else if ( elem.attachEvent ) {
- elem.attachEvent( "on" + type, eventHandle );
- }
- }
- }
-
- if ( special.add ) {
- special.add.call( elem, handleObj );
-
- if ( !handleObj.handler.guid ) {
- handleObj.handler.guid = handler.guid;
- }
- }
-
- // Add to the element's handler list, delegates in front
- if ( selector ) {
- handlers.splice( handlers.delegateCount++, 0, handleObj );
- } else {
- handlers.push( handleObj );
- }
-
- // Keep track of which events have ever been used, for event optimization
- jQuery.event.global[ type ] = true;
- }
-
- // Nullify elem to prevent memory leaks in IE
- elem = null;
- },
-
- global: {},
-
- // Detach an event or set of events from an element
- remove: function( elem, types, handler, selector ) {
-
- var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
- t, tns, type, namespaces, origCount,
- j, events, special, handle, eventType, handleObj;
-
- if ( !elemData || !(events = elemData.events) ) {
- return;
- }
-
- // Once for each type.namespace in types; type may be omitted
- types = hoverHack( types || "" ).split(" ");
- for ( t = 0; t < types.length; t++ ) {
- tns = rtypenamespace.exec( types[t] ) || [];
- type = tns[1];
- namespaces = tns[2];
-
- // Unbind all events (on this namespace, if provided) for the element
- if ( !type ) {
- namespaces = namespaces? "." + namespaces : "";
- for ( j in events ) {
- jQuery.event.remove( elem, j + namespaces, handler, selector );
- }
- return;
- }
-
- special = jQuery.event.special[ type ] || {};
- type = ( selector? special.delegateType : special.bindType ) || type;
- eventType = events[ type ] || [];
- origCount = eventType.length;
- namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
-
- // Only need to loop for special events or selective removal
- if ( handler || namespaces || selector || special.remove ) {
- for ( j = 0; j < eventType.length; j++ ) {
- handleObj = eventType[ j ];
-
- if ( !handler || handler.guid === handleObj.guid ) {
- if ( !namespaces || namespaces.test( handleObj.namespace ) ) {
- if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) {
- eventType.splice( j--, 1 );
-
- if ( handleObj.selector ) {
- eventType.delegateCount--;
- }
- if ( special.remove ) {
- special.remove.call( elem, handleObj );
- }
- }
- }
- }
- }
- } else {
- // Removing all events
- eventType.length = 0;
- }
-
- // Remove generic event handler if we removed something and no more handlers exist
- // (avoids potential for endless recursion during removal of special event handlers)
- if ( eventType.length === 0 && origCount !== eventType.length ) {
- if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
- jQuery.removeEvent( elem, type, elemData.handle );
- }
-
- delete events[ type ];
- }
- }
-
- // Remove the expando if it's no longer used
- if ( jQuery.isEmptyObject( events ) ) {
- handle = elemData.handle;
- if ( handle ) {
- handle.elem = null;
- }
-
- // removeData also checks for emptiness and clears the expando if empty
- // so use it instead of delete
- jQuery.removeData( elem, [ "events", "handle" ], true );
- }
- },
-
- // Events that are safe to short-circuit if no handlers are attached.
- // Native DOM events should not be added, they may have inline handlers.
- customEvent: {
- "getData": true,
- "setData": true,
- "changeData": true
- },
-
- trigger: function( event, data, elem, onlyHandlers ) {
- // Don't do events on text and comment nodes
- if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
- return;
- }
-
- // Event object or event type
- var type = event.type || event,
- namespaces = [],
- cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
-
- if ( type.indexOf( "!" ) >= 0 ) {
- // Exclusive events trigger only for the exact event (no namespaces)
- type = type.slice(0, -1);
- exclusive = true;
- }
-
- if ( type.indexOf( "." ) >= 0 ) {
- // Namespaced trigger; create a regexp to match event type in handle()
- namespaces = type.split(".");
- type = namespaces.shift();
- namespaces.sort();
- }
-
- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
- // No jQuery handlers for this event type, and it can't have inline handlers
- return;
- }
-
- // Caller can pass in an Event, Object, or just an event type string
- event = typeof event === "object" ?
- // jQuery.Event object
- event[ jQuery.expando ] ? event :
- // Object literal
- new jQuery.Event( type, event ) :
- // Just the event type (string)
- new jQuery.Event( type );
-
- event.type = type;
- event.isTrigger = true;
- event.exclusive = exclusive;
- event.namespace = namespaces.join( "." );
- event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
- ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
- // triggerHandler() and global events don't bubble or run the default action
- if ( onlyHandlers || !elem ) {
- event.preventDefault();
- }
-
- // Handle a global trigger
- if ( !elem ) {
-
- // TODO: Stop taunting the data cache; remove global events and always attach to document
- cache = jQuery.cache;
- for ( i in cache ) {
- if ( cache[ i ].events && cache[ i ].events[ type ] ) {
- jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
- }
- }
- return;
- }
-
- // Clean up the event in case it is being reused
- event.result = undefined;
- if ( !event.target ) {
- event.target = elem;
- }
-
- // Clone any incoming data and prepend the event, creating the handler arg list
- data = data != null ? jQuery.makeArray( data ) : [];
- data.unshift( event );
-
- // Allow special events to draw outside the lines
- special = jQuery.event.special[ type ] || {};
- if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
- return;
- }
-
- // Determine event propagation path in advance, per W3C events spec (#9951)
- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
- eventPath = [[ elem, special.bindType || type ]];
- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
- bubbleType = special.delegateType || type;
- old = null;
- for ( cur = elem.parentNode; cur; cur = cur.parentNode ) {
- eventPath.push([ cur, bubbleType ]);
- old = cur;
- }
-
- // Only add window if we got to document (e.g., not plain obj or detached DOM)
- if ( old && old === elem.ownerDocument ) {
- eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
- }
- }
-
- // Fire handlers on the event path
- for ( i = 0; i < eventPath.length; i++ ) {
-
- cur = eventPath[i][0];
- event.type = eventPath[i][1];
-
- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
- if ( handle ) {
- handle.apply( cur, data );
- }
- handle = ontype && cur[ ontype ];
- if ( handle && jQuery.acceptData( cur ) ) {
- handle.apply( cur, data );
- }
-
- if ( event.isPropagationStopped() ) {
- break;
- }
- }
- event.type = type;
-
- // If nobody prevented the default action, do it now
- if ( !event.isDefaultPrevented() ) {
-
- if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
- // Call a native DOM method on the target with the same name name as the event.
- // Can't use an .isFunction() check here because IE6/7 fails that test.
- // Don't do default actions on window, that's where global variables be (#6170)
- // IE<9 dies on focus/blur to hidden element (#1486)
- if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
- // Don't re-trigger an onFOO event when we call its FOO() method
- old = elem[ ontype ];
-
- if ( old ) {
- elem[ ontype ] = null;
- }
-
- // Prevent re-triggering of the same event, since we already bubbled it above
- jQuery.event.triggered = type;
- elem[ type ]();
- jQuery.event.triggered = undefined;
-
- if ( old ) {
- elem[ ontype ] = old;
- }
- }
- }
- }
-
- return event.result;
- },
-
- dispatch: function( event ) {
-
- // Make a writable jQuery.Event from the native event object
- event = jQuery.event.fix( event || window.event );
-
- var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
- delegateCount = handlers.delegateCount,
- args = [].slice.call( arguments, 0 ),
- run_all = !event.exclusive && !event.namespace,
- specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle,
- handlerQueue = [],
- i, j, cur, ret, selMatch, matched, matches, handleObj, sel, hit, related;
-
- // Use the fix-ed jQuery.Event rather than the (read-only) native event
- args[0] = event;
- event.delegateTarget = this;
-
- // Determine handlers that should run if there are delegated events
- // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
- if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
-
- for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
- selMatch = {};
- matches = [];
- for ( i = 0; i < delegateCount; i++ ) {
- handleObj = handlers[ i ];
- sel = handleObj.selector;
- hit = selMatch[ sel ];
-
- if ( handleObj.isPositional ) {
- // Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/
- hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0;
- } else if ( hit === undefined ) {
- hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) );
- }
- if ( hit ) {
- matches.push( handleObj );
- }
- }
- if ( matches.length ) {
- handlerQueue.push({ elem: cur, matches: matches });
- }
- }
- }
-
- // Add the remaining (directly-bound) handlers
- if ( handlers.length > delegateCount ) {
- handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
- }
-
- // Run delegates first; they may want to stop propagation beneath us
- for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
- matched = handlerQueue[ i ];
- event.currentTarget = matched.elem;
-
- for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
- handleObj = matched.matches[ j ];
-
- // Triggered event must either 1) be non-exclusive and have no namespace, or
- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
- if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
- event.data = handleObj.data;
- event.handleObj = handleObj;
-
- ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
-
- if ( ret !== undefined ) {
- event.result = ret;
- if ( ret === false ) {
- event.preventDefault();
- event.stopPropagation();
- }
- }
- }
- }
- }
-
- return event.result;
- },
-
- // Includes some event props shared by KeyEvent and MouseEvent
- // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
- props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
- fixHooks: {},
-
- keyHooks: {
- props: "char charCode key keyCode".split(" "),
- filter: function( event, original ) {
-
- // Add which for key events
- if ( event.which == null ) {
- event.which = original.charCode != null ? original.charCode : original.keyCode;
- }
-
- return event;
- }
- },
-
- mouseHooks: {
- props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement wheelDelta".split(" "),
- filter: function( event, original ) {
- var eventDoc, doc, body,
- button = original.button,
- fromElement = original.fromElement;
-
- // Calculate pageX/Y if missing and clientX/Y available
- if ( event.pageX == null && original.clientX != null ) {
- eventDoc = event.target.ownerDocument || document;
- doc = eventDoc.documentElement;
- body = eventDoc.body;
-
- event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
- event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
- }
-
- // Add relatedTarget, if necessary
- if ( !event.relatedTarget && fromElement ) {
- event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
- }
-
- // Add which for click: 1 === left; 2 === middle; 3 === right
- // Note: button is not normalized, so don't use it
- if ( !event.which && button !== undefined ) {
- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
- }
-
- return event;
- }
- },
-
- fix: function( event ) {
- if ( event[ jQuery.expando ] ) {
- return event;
- }
-
- // Create a writable copy of the event object and normalize some properties
- var i, prop,
- originalEvent = event,
- fixHook = jQuery.event.fixHooks[ event.type ] || {},
- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
- event = jQuery.Event( originalEvent );
-
- for ( i = copy.length; i; ) {
- prop = copy[ --i ];
- event[ prop ] = originalEvent[ prop ];
- }
-
- // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
- if ( !event.target ) {
- event.target = originalEvent.srcElement || document;
- }
-
- // Target should not be a text node (#504, Safari)
- if ( event.target.nodeType === 3 ) {
- event.target = event.target.parentNode;
- }
-
- // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
- if ( event.metaKey === undefined ) {
- event.metaKey = event.ctrlKey;
- }
-
- return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
- },
-
- special: {
- ready: {
- // Make sure the ready event is setup
- setup: jQuery.bindReady
- },
-
- focus: {
- delegateType: "focusin",
- noBubble: true
- },
- blur: {
- delegateType: "focusout",
- noBubble: true
- },
-
- beforeunload: {
- setup: function( data, namespaces, eventHandle ) {
- // We only want to do this special case on windows
- if ( jQuery.isWindow( this ) ) {
- this.onbeforeunload = eventHandle;
- }
- },
-
- teardown: function( namespaces, eventHandle ) {
- if ( this.onbeforeunload === eventHandle ) {
- this.onbeforeunload = null;
- }
- }
- }
- },
-
- simulate: function( type, elem, event, bubble ) {
- // Piggyback on a donor event to simulate a different one.
- // Fake originalEvent to avoid donor's stopPropagation, but if the
- // simulated event prevents default then we do the same on the donor.
- var e = jQuery.extend(
- new jQuery.Event(),
- event,
- { type: type,
- isSimulated: true,
- originalEvent: {}
- }
- );
- if ( bubble ) {
- jQuery.event.trigger( e, null, elem );
- } else {
- jQuery.event.dispatch.call( elem, e );
- }
- if ( e.isDefaultPrevented() ) {
- event.preventDefault();
- }
- }
-};
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-jQuery.event.handle = jQuery.event.dispatch;
-
-jQuery.removeEvent = document.removeEventListener ?
- function( elem, type, handle ) {
- if ( elem.removeEventListener ) {
- elem.removeEventListener( type, handle, false );
- }
- } :
- function( elem, type, handle ) {
- if ( elem.detachEvent ) {
- elem.detachEvent( "on" + type, handle );
- }
- };
-
-jQuery.Event = function( src, props ) {
- // Allow instantiation without the 'new' keyword
- if ( !(this instanceof jQuery.Event) ) {
- return new jQuery.Event( src, props );
- }
-
- // Event object
- if ( src && src.type ) {
- this.originalEvent = src;
- this.type = src.type;
-
- // Events bubbling up the document may have been marked as prevented
- // by a handler lower down the tree; reflect the correct value.
- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
- // Event type
- } else {
- this.type = src;
- }
-
- // Put explicitly provided properties onto the event object
- if ( props ) {
- jQuery.extend( this, props );
- }
-
- // Create a timestamp if incoming event doesn't have one
- this.timeStamp = src && src.timeStamp || jQuery.now();
-
- // Mark it as fixed
- this[ jQuery.expando ] = true;
-};
-
-function returnFalse() {
- return false;
-}
-function returnTrue() {
- return true;
-}
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-jQuery.Event.prototype = {
- preventDefault: function() {
- this.isDefaultPrevented = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
-
- // if preventDefault exists run it on the original event
- if ( e.preventDefault ) {
- e.preventDefault();
-
- // otherwise set the returnValue property of the original event to false (IE)
- } else {
- e.returnValue = false;
- }
- },
- stopPropagation: function() {
- this.isPropagationStopped = returnTrue;
-
- var e = this.originalEvent;
- if ( !e ) {
- return;
- }
- // if stopPropagation exists run it on the original event
- if ( e.stopPropagation ) {
- e.stopPropagation();
- }
- // otherwise set the cancelBubble property of the original event to true (IE)
- e.cancelBubble = true;
- },
- stopImmediatePropagation: function() {
- this.isImmediatePropagationStopped = returnTrue;
- this.stopPropagation();
- },
- isDefaultPrevented: returnFalse,
- isPropagationStopped: returnFalse,
- isImmediatePropagationStopped: returnFalse
-};
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-jQuery.each({
- mouseenter: "mouseover",
- mouseleave: "mouseout"
-}, function( orig, fix ) {
- jQuery.event.special[ orig ] = jQuery.event.special[ fix ] = {
- delegateType: fix,
- bindType: fix,
-
- handle: function( event ) {
- var target = this,
- related = event.relatedTarget,
- handleObj = event.handleObj,
- selector = handleObj.selector,
- oldType, ret;
-
- // For a real mouseover/out, always call the handler; for
- // mousenter/leave call the handler if related is outside the target.
- // NB: No relatedTarget if the mouse left/entered the browser window
- if ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) {
- oldType = event.type;
- event.type = handleObj.origType;
- ret = handleObj.handler.apply( this, arguments );
- event.type = oldType;
- }
- return ret;
- }
- };
-});
-
-// IE submit delegation
-if ( !jQuery.support.submitBubbles ) {
-
- jQuery.event.special.submit = {
- setup: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Lazy-add a submit handler when a descendant form may potentially be submitted
- jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
- // Node name check avoids a VML-related crash in IE (#9807)
- var elem = e.target,
- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
- if ( form && !form._submit_attached ) {
- jQuery.event.add( form, "submit._submit", function( event ) {
- // Form was submitted, bubble the event up the tree
- if ( this.parentNode ) {
- jQuery.event.simulate( "submit", this.parentNode, event, true );
- }
- });
- form._submit_attached = true;
- }
- });
- // return undefined since we don't need an event listener
- },
-
- teardown: function() {
- // Only need this for delegated form submit events
- if ( jQuery.nodeName( this, "form" ) ) {
- return false;
- }
-
- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
- jQuery.event.remove( this, "._submit" );
- }
- };
-}
-
-// IE change delegation and checkbox/radio fix
-if ( !jQuery.support.changeBubbles ) {
-
- jQuery.event.special.change = {
-
- setup: function() {
-
- if ( rformElems.test( this.nodeName ) ) {
- // IE doesn't fire change on a check/radio until blur; trigger it on click
- // after a propertychange. Eat the blur-change in special.change.handle.
- // This still fires onchange a second time for check/radio after blur.
- if ( this.type === "checkbox" || this.type === "radio" ) {
- jQuery.event.add( this, "propertychange._change", function( event ) {
- if ( event.originalEvent.propertyName === "checked" ) {
- this._just_changed = true;
- }
- });
- jQuery.event.add( this, "click._change", function( event ) {
- if ( this._just_changed ) {
- this._just_changed = false;
- jQuery.event.simulate( "change", this, event, true );
- }
- });
- }
- return false;
- }
- // Delegated event; lazy-add a change handler on descendant inputs
- jQuery.event.add( this, "beforeactivate._change", function( e ) {
- var elem = e.target;
-
- if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
- jQuery.event.add( elem, "change._change", function( event ) {
- if ( this.parentNode && !event.isSimulated ) {
- jQuery.event.simulate( "change", this.parentNode, event, true );
- }
- });
- elem._change_attached = true;
- }
- });
- },
-
- handle: function( event ) {
- var elem = event.target;
-
- // Swallow native change events from checkbox/radio, we already triggered them above
- if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
- return event.handleObj.handler.apply( this, arguments );
- }
- },
-
- teardown: function() {
- jQuery.event.remove( this, "._change" );
-
- return rformElems.test( this.nodeName );
- }
- };
-}
-
-// Create "bubbling" focus and blur events
-if ( !jQuery.support.focusinBubbles ) {
- jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
- // Attach a single capturing handler while someone wants focusin/focusout
- var attaches = 0,
- handler = function( event ) {
- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
- };
-
- jQuery.event.special[ fix ] = {
- setup: function() {
- if ( attaches++ === 0 ) {
- document.addEventListener( orig, handler, true );
- }
- },
- teardown: function() {
- if ( --attaches === 0 ) {
- document.removeEventListener( orig, handler, true );
- }
- }
- };
- });
-}
-
-jQuery.fn.extend({
-
- on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
- var origFn, type;
-
- // Types can be a map of types/handlers
- if ( typeof types === "object" ) {
- // ( types-Object, selector, data )
- if ( typeof selector !== "string" ) {
- // ( types-Object, data )
- data = selector;
- selector = undefined;
- }
- for ( type in types ) {
- this.on( type, selector, data, types[ type ], one );
- }
- return this;
- }
-
- if ( data == null && fn == null ) {
- // ( types, fn )
- fn = selector;
- data = selector = undefined;
- } else if ( fn == null ) {
- if ( typeof selector === "string" ) {
- // ( types, selector, fn )
- fn = data;
- data = undefined;
- } else {
- // ( types, data, fn )
- fn = data;
- data = selector;
- selector = undefined;
- }
- }
- if ( fn === false ) {
- fn = returnFalse;
- } else if ( !fn ) {
- return this;
- }
-
- if ( one === 1 ) {
- origFn = fn;
- fn = function( event ) {
- // Can use an empty set, since event contains the info
- jQuery().off( event );
- return origFn.apply( this, arguments );
- };
- // Use same guid so caller can remove using origFn
- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
- }
- return this.each( function() {
- jQuery.event.add( this, types, fn, data, selector );
- });
- },
- one: function( types, selector, data, fn ) {
- return this.on.call( this, types, selector, data, fn, 1 );
- },
- off: function( types, selector, fn ) {
- if ( types && types.preventDefault && types.handleObj ) {
- // ( event ) dispatched jQuery.Event
- var handleObj = types.handleObj;
- jQuery( types.delegateTarget ).off(
- handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
- handleObj.selector,
- handleObj.handler
- );
- return this;
- }
- if ( typeof types === "object" ) {
- // ( types-object [, selector] )
- for ( var type in types ) {
- this.off( type, selector, types[ type ] );
- }
- return this;
- }
- if ( selector === false || typeof selector === "function" ) {
- // ( types [, fn] )
- fn = selector;
- selector = undefined;
- }
- if ( fn === false ) {
- fn = returnFalse;
- }
- return this.each(function() {
- jQuery.event.remove( this, types, fn, selector );
- });
- },
-
- bind: function( types, data, fn ) {
- return this.on( types, null, data, fn );
- },
- unbind: function( types, fn ) {
- return this.off( types, null, fn );
- },
-
- live: function( types, data, fn ) {
- jQuery( this.context ).on( types, this.selector, data, fn );
- return this;
- },
- die: function( types, fn ) {
- jQuery( this.context ).off( types, this.selector || "**", fn );
- return this;
- },
-
- delegate: function( selector, types, data, fn ) {
- return this.on( types, selector, data, fn );
- },
- undelegate: function( selector, types, fn ) {
- // ( namespace ) or ( selector, types [, fn] )
- return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
- },
-
- trigger: function( type, data ) {
- return this.each(function() {
- jQuery.event.trigger( type, data, this );
- });
- },
- triggerHandler: function( type, data ) {
- if ( this[0] ) {
- return jQuery.event.trigger( type, data, this[0], true );
- }
- },
-
- toggle: function( fn ) {
- // Save reference to arguments for access in closure
- var args = arguments,
- guid = fn.guid || jQuery.guid++,
- i = 0,
- toggler = function( event ) {
- // Figure out which function to execute
- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
- // Make sure that clicks stop
- event.preventDefault();
-
- // and execute the function
- return args[ lastToggle ].apply( this, arguments ) || false;
- };
-
- // link all the functions, so any of them can unbind this click handler
- toggler.guid = guid;
- while ( i < args.length ) {
- args[ i++ ].guid = guid;
- }
-
- return this.click( toggler );
- },
-
- hover: function( fnOver, fnOut ) {
- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
- }
-});
-
-jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
- "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
- // Handle event binding
- jQuery.fn[ name ] = function( data, fn ) {
- if ( fn == null ) {
- fn = data;
- data = null;
- }
-
- return arguments.length > 0 ?
- this.bind( name, data, fn ) :
- this.trigger( name );
- };
-
- if ( jQuery.attrFn ) {
- jQuery.attrFn[ name ] = true;
- }
-
- if ( rkeyEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
- }
-
- if ( rmouseEvent.test( name ) ) {
- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
- }
-});
-
-
-
-/*!
- * Sizzle CSS Selector Engine
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
- * More information: http://sizzlejs.com/
- */
-(function(){
-
-var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
- expando = "sizcache" + (Math.random() + '').replace('.', ''),
- done = 0,
- toString = Object.prototype.toString,
- hasDuplicate = false,
- baseHasDuplicate = true,
- rBackslash = /\\/g,
- rReturn = /\r\n/g,
- rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-// Thus far that includes Google Chrome.
-[0, 0].sort(function() {
- baseHasDuplicate = false;
- return 0;
-});
-
-var Sizzle = function( selector, context, results, seed ) {
- results = results || [];
- context = context || document;
-
- var origContext = context;
-
- if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
- return [];
- }
-
- if ( !selector || typeof selector !== "string" ) {
- return results;
- }
-
- var m, set, checkSet, extra, ret, cur, pop, i,
- prune = true,
- contextXML = Sizzle.isXML( context ),
- parts = [],
- soFar = selector;
-
- // Reset the position of the chunker regexp (start from head)
- do {
- chunker.exec( "" );
- m = chunker.exec( soFar );
-
- if ( m ) {
- soFar = m[3];
-
- parts.push( m[1] );
-
- if ( m[2] ) {
- extra = m[3];
- break;
- }
- }
- } while ( m );
-
- if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
- set = posProcess( parts[0] + parts[1], context, seed );
-
- } else {
- set = Expr.relative[ parts[0] ] ?
- [ context ] :
- Sizzle( parts.shift(), context );
-
- while ( parts.length ) {
- selector = parts.shift();
-
- if ( Expr.relative[ selector ] ) {
- selector += parts.shift();
- }
-
- set = posProcess( selector, set, seed );
- }
- }
-
- } else {
- // Take a shortcut and set the context if the root selector is an ID
- // (but not if it'll be faster if the inner selector is an ID)
- if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
- Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
- ret = Sizzle.find( parts.shift(), context, contextXML );
- context = ret.expr ?
- Sizzle.filter( ret.expr, ret.set )[0] :
- ret.set[0];
- }
-
- if ( context ) {
- ret = seed ?
- { expr: parts.pop(), set: makeArray(seed) } :
- Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
- set = ret.expr ?
- Sizzle.filter( ret.expr, ret.set ) :
- ret.set;
-
- if ( parts.length > 0 ) {
- checkSet = makeArray( set );
-
- } else {
- prune = false;
- }
-
- while ( parts.length ) {
- cur = parts.pop();
- pop = cur;
-
- if ( !Expr.relative[ cur ] ) {
- cur = "";
- } else {
- pop = parts.pop();
- }
-
- if ( pop == null ) {
- pop = context;
- }
-
- Expr.relative[ cur ]( checkSet, pop, contextXML );
- }
-
- } else {
- checkSet = parts = [];
- }
- }
-
- if ( !checkSet ) {
- checkSet = set;
- }
-
- if ( !checkSet ) {
- Sizzle.error( cur || selector );
- }
-
- if ( toString.call(checkSet) === "[object Array]" ) {
- if ( !prune ) {
- results.push.apply( results, checkSet );
-
- } else if ( context && context.nodeType === 1 ) {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
- results.push( set[i] );
- }
- }
-
- } else {
- for ( i = 0; checkSet[i] != null; i++ ) {
- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
- results.push( set[i] );
- }
- }
- }
-
- } else {
- makeArray( checkSet, results );
- }
-
- if ( extra ) {
- Sizzle( extra, origContext, results, seed );
- Sizzle.uniqueSort( results );
- }
-
- return results;
-};
-
-Sizzle.uniqueSort = function( results ) {
- if ( sortOrder ) {
- hasDuplicate = baseHasDuplicate;
- results.sort( sortOrder );
-
- if ( hasDuplicate ) {
- for ( var i = 1; i < results.length; i++ ) {
- if ( results[i] === results[ i - 1 ] ) {
- results.splice( i--, 1 );
- }
- }
- }
- }
-
- return results;
-};
-
-Sizzle.matches = function( expr, set ) {
- return Sizzle( expr, null, null, set );
-};
-
-Sizzle.matchesSelector = function( node, expr ) {
- return Sizzle( expr, null, null, [node] ).length > 0;
-};
-
-Sizzle.find = function( expr, context, isXML ) {
- var set, i, len, match, type, left;
-
- if ( !expr ) {
- return [];
- }
-
- for ( i = 0, len = Expr.order.length; i < len; i++ ) {
- type = Expr.order[i];
-
- if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
- left = match[1];
- match.splice( 1, 1 );
-
- if ( left.substr( left.length - 1 ) !== "\\" ) {
- match[1] = (match[1] || "").replace( rBackslash, "" );
- set = Expr.find[ type ]( match, context, isXML );
-
- if ( set != null ) {
- expr = expr.replace( Expr.match[ type ], "" );
- break;
- }
- }
- }
- }
-
- if ( !set ) {
- set = typeof context.getElementsByTagName !== "undefined" ?
- context.getElementsByTagName( "*" ) :
- [];
- }
-
- return { set: set, expr: expr };
-};
-
-Sizzle.filter = function( expr, set, inplace, not ) {
- var match, anyFound,
- type, found, item, filter, left,
- i, pass,
- old = expr,
- result = [],
- curLoop = set,
- isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
- while ( expr && set.length ) {
- for ( type in Expr.filter ) {
- if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
- filter = Expr.filter[ type ];
- left = match[1];
-
- anyFound = false;
-
- match.splice(1,1);
-
- if ( left.substr( left.length - 1 ) === "\\" ) {
- continue;
- }
-
- if ( curLoop === result ) {
- result = [];
- }
-
- if ( Expr.preFilter[ type ] ) {
- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
- if ( !match ) {
- anyFound = found = true;
-
- } else if ( match === true ) {
- continue;
- }
- }
-
- if ( match ) {
- for ( i = 0; (item = curLoop[i]) != null; i++ ) {
- if ( item ) {
- found = filter( item, match, i, curLoop );
- pass = not ^ found;
-
- if ( inplace && found != null ) {
- if ( pass ) {
- anyFound = true;
-
- } else {
- curLoop[i] = false;
- }
-
- } else if ( pass ) {
- result.push( item );
- anyFound = true;
- }
- }
- }
- }
-
- if ( found !== undefined ) {
- if ( !inplace ) {
- curLoop = result;
- }
-
- expr = expr.replace( Expr.match[ type ], "" );
-
- if ( !anyFound ) {
- return [];
- }
-
- break;
- }
- }
- }
-
- // Improper expression
- if ( expr === old ) {
- if ( anyFound == null ) {
- Sizzle.error( expr );
-
- } else {
- break;
- }
- }
-
- old = expr;
- }
-
- return curLoop;
-};
-
-Sizzle.error = function( msg ) {
- throw "Syntax error, unrecognized expression: " + msg;
-};
-
-/**
- * Utility function for retreiving the text value of an array of DOM nodes
- * @param {Array|Element} elem
- */
-var getText = Sizzle.getText = function( elem ) {
- var i, node,
- nodeType = elem.nodeType,
- ret = "";
-
- if ( nodeType ) {
- if ( nodeType === 1 ) {
- // Use textContent || innerText for elements
- if ( typeof elem.textContent === 'string' ) {
- return elem.textContent;
- } else if ( typeof elem.innerText === 'string' ) {
- // Replace IE's carriage returns
- return elem.innerText.replace( rReturn, '' );
- } else {
- // Traverse it's children
- for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
- ret += getText( elem );
- }
- }
- } else if ( nodeType === 3 || nodeType === 4 ) {
- return elem.nodeValue;
- }
- } else {
-
- // If no nodeType, this is expected to be an array
- for ( i = 0; (node = elem[i]); i++ ) {
- // Do not traverse comment nodes
- if ( node.nodeType !== 8 ) {
- ret += getText( node );
- }
- }
- }
- return ret;
-};
-
-var Expr = Sizzle.selectors = {
- order: [ "ID", "NAME", "TAG" ],
-
- match: {
- ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
- NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
- ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
- TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
- CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
- POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
- PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
- },
-
- leftMatch: {},
-
- attrMap: {
- "class": "className",
- "for": "htmlFor"
- },
-
- attrHandle: {
- href: function( elem ) {
- return elem.getAttribute( "href" );
- },
- type: function( elem ) {
- return elem.getAttribute( "type" );
- }
- },
-
- relative: {
- "+": function(checkSet, part){
- var isPartStr = typeof part === "string",
- isTag = isPartStr && !rNonWord.test( part ),
- isPartStrNotTag = isPartStr && !isTag;
-
- if ( isTag ) {
- part = part.toLowerCase();
- }
-
- for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
- if ( (elem = checkSet[i]) ) {
- while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
- checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
- elem || false :
- elem === part;
- }
- }
-
- if ( isPartStrNotTag ) {
- Sizzle.filter( part, checkSet, true );
- }
- },
-
- ">": function( checkSet, part ) {
- var elem,
- isPartStr = typeof part === "string",
- i = 0,
- l = checkSet.length;
-
- if ( isPartStr && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
-
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- var parent = elem.parentNode;
- checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
- }
- }
-
- } else {
- for ( ; i < l; i++ ) {
- elem = checkSet[i];
-
- if ( elem ) {
- checkSet[i] = isPartStr ?
- elem.parentNode :
- elem.parentNode === part;
- }
- }
-
- if ( isPartStr ) {
- Sizzle.filter( part, checkSet, true );
- }
- }
- },
-
- "": function(checkSet, part, isXML){
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
- },
-
- "~": function( checkSet, part, isXML ) {
- var nodeCheck,
- doneName = done++,
- checkFn = dirCheck;
-
- if ( typeof part === "string" && !rNonWord.test( part ) ) {
- part = part.toLowerCase();
- nodeCheck = part;
- checkFn = dirNodeCheck;
- }
-
- checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
- }
- },
-
- find: {
- ID: function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- return m && m.parentNode ? [m] : [];
- }
- },
-
- NAME: function( match, context ) {
- if ( typeof context.getElementsByName !== "undefined" ) {
- var ret = [],
- results = context.getElementsByName( match[1] );
-
- for ( var i = 0, l = results.length; i < l; i++ ) {
- if ( results[i].getAttribute("name") === match[1] ) {
- ret.push( results[i] );
- }
- }
-
- return ret.length === 0 ? null : ret;
- }
- },
-
- TAG: function( match, context ) {
- if ( typeof context.getElementsByTagName !== "undefined" ) {
- return context.getElementsByTagName( match[1] );
- }
- }
- },
- preFilter: {
- CLASS: function( match, curLoop, inplace, result, not, isXML ) {
- match = " " + match[1].replace( rBackslash, "" ) + " ";
-
- if ( isXML ) {
- return match;
- }
-
- for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
- if ( elem ) {
- if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
- if ( !inplace ) {
- result.push( elem );
- }
-
- } else if ( inplace ) {
- curLoop[i] = false;
- }
- }
- }
-
- return false;
- },
-
- ID: function( match ) {
- return match[1].replace( rBackslash, "" );
- },
-
- TAG: function( match, curLoop ) {
- return match[1].replace( rBackslash, "" ).toLowerCase();
- },
-
- CHILD: function( match ) {
- if ( match[1] === "nth" ) {
- if ( !match[2] ) {
- Sizzle.error( match[0] );
- }
-
- match[2] = match[2].replace(/^\+|\s*/g, '');
-
- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
- var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
- match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
- // calculate the numbers (first)n+(last) including if they are negative
- match[2] = (test[1] + (test[2] || 1)) - 0;
- match[3] = test[3] - 0;
- }
- else if ( match[2] ) {
- Sizzle.error( match[0] );
- }
-
- // TODO: Move to normal caching system
- match[0] = done++;
-
- return match;
- },
-
- ATTR: function( match, curLoop, inplace, result, not, isXML ) {
- var name = match[1] = match[1].replace( rBackslash, "" );
-
- if ( !isXML && Expr.attrMap[name] ) {
- match[1] = Expr.attrMap[name];
- }
-
- // Handle if an un-quoted value was used
- match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
-
- if ( match[2] === "~=" ) {
- match[4] = " " + match[4] + " ";
- }
-
- return match;
- },
-
- PSEUDO: function( match, curLoop, inplace, result, not ) {
- if ( match[1] === "not" ) {
- // If we're dealing with a complex expression, or a simple one
- if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
- match[3] = Sizzle(match[3], null, null, curLoop);
-
- } else {
- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
-
- if ( !inplace ) {
- result.push.apply( result, ret );
- }
-
- return false;
- }
-
- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
- return true;
- }
-
- return match;
- },
-
- POS: function( match ) {
- match.unshift( true );
-
- return match;
- }
- },
-
- filters: {
- enabled: function( elem ) {
- return elem.disabled === false && elem.type !== "hidden";
- },
-
- disabled: function( elem ) {
- return elem.disabled === true;
- },
-
- checked: function( elem ) {
- return elem.checked === true;
- },
-
- selected: function( elem ) {
- // Accessing this property makes selected-by-default
- // options in Safari work properly
- if ( elem.parentNode ) {
- elem.parentNode.selectedIndex;
- }
-
- return elem.selected === true;
- },
-
- parent: function( elem ) {
- return !!elem.firstChild;
- },
-
- empty: function( elem ) {
- return !elem.firstChild;
- },
-
- has: function( elem, i, match ) {
- return !!Sizzle( match[3], elem ).length;
- },
-
- header: function( elem ) {
- return (/h\d/i).test( elem.nodeName );
- },
-
- text: function( elem ) {
- var attr = elem.getAttribute( "type" ), type = elem.type;
- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
- // use getAttribute instead to test this case
- return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
- },
-
- radio: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
- },
-
- checkbox: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
- },
-
- file: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
- },
-
- password: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
- },
-
- submit: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "submit" === elem.type;
- },
-
- image: function( elem ) {
- return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
- },
-
- reset: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return (name === "input" || name === "button") && "reset" === elem.type;
- },
-
- button: function( elem ) {
- var name = elem.nodeName.toLowerCase();
- return name === "input" && "button" === elem.type || name === "button";
- },
-
- input: function( elem ) {
- return (/input|select|textarea|button/i).test( elem.nodeName );
- },
-
- focus: function( elem ) {
- return elem === elem.ownerDocument.activeElement;
- }
- },
- setFilters: {
- first: function( elem, i ) {
- return i === 0;
- },
-
- last: function( elem, i, match, array ) {
- return i === array.length - 1;
- },
-
- even: function( elem, i ) {
- return i % 2 === 0;
- },
-
- odd: function( elem, i ) {
- return i % 2 === 1;
- },
-
- lt: function( elem, i, match ) {
- return i < match[3] - 0;
- },
-
- gt: function( elem, i, match ) {
- return i > match[3] - 0;
- },
-
- nth: function( elem, i, match ) {
- return match[3] - 0 === i;
- },
-
- eq: function( elem, i, match ) {
- return match[3] - 0 === i;
- }
- },
- filter: {
- PSEUDO: function( elem, match, i, array ) {
- var name = match[1],
- filter = Expr.filters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
-
- } else if ( name === "contains" ) {
- return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
-
- } else if ( name === "not" ) {
- var not = match[3];
-
- for ( var j = 0, l = not.length; j < l; j++ ) {
- if ( not[j] === elem ) {
- return false;
- }
- }
-
- return true;
-
- } else {
- Sizzle.error( name );
- }
- },
-
- CHILD: function( elem, match ) {
- var first, last,
- doneName, parent, cache,
- count, diff,
- type = match[1],
- node = elem;
-
- switch ( type ) {
- case "only":
- case "first":
- while ( (node = node.previousSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- if ( type === "first" ) {
- return true;
- }
-
- node = elem;
-
- case "last":
- while ( (node = node.nextSibling) ) {
- if ( node.nodeType === 1 ) {
- return false;
- }
- }
-
- return true;
-
- case "nth":
- first = match[2];
- last = match[3];
-
- if ( first === 1 && last === 0 ) {
- return true;
- }
-
- doneName = match[0];
- parent = elem.parentNode;
-
- if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
- count = 0;
-
- for ( node = parent.firstChild; node; node = node.nextSibling ) {
- if ( node.nodeType === 1 ) {
- node.nodeIndex = ++count;
- }
- }
-
- parent[ expando ] = doneName;
- }
-
- diff = elem.nodeIndex - last;
-
- if ( first === 0 ) {
- return diff === 0;
-
- } else {
- return ( diff % first === 0 && diff / first >= 0 );
- }
- }
- },
-
- ID: function( elem, match ) {
- return elem.nodeType === 1 && elem.getAttribute("id") === match;
- },
-
- TAG: function( elem, match ) {
- return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
- },
-
- CLASS: function( elem, match ) {
- return (" " + (elem.className || elem.getAttribute("class")) + " ")
- .indexOf( match ) > -1;
- },
-
- ATTR: function( elem, match ) {
- var name = match[1],
- result = Sizzle.attr ?
- Sizzle.attr( elem, name ) :
- Expr.attrHandle[ name ] ?
- Expr.attrHandle[ name ]( elem ) :
- elem[ name ] != null ?
- elem[ name ] :
- elem.getAttribute( name ),
- value = result + "",
- type = match[2],
- check = match[4];
-
- return result == null ?
- type === "!=" :
- !type && Sizzle.attr ?
- result != null :
- type === "=" ?
- value === check :
- type === "*=" ?
- value.indexOf(check) >= 0 :
- type === "~=" ?
- (" " + value + " ").indexOf(check) >= 0 :
- !check ?
- value && result !== false :
- type === "!=" ?
- value !== check :
- type === "^=" ?
- value.indexOf(check) === 0 :
- type === "$=" ?
- value.substr(value.length - check.length) === check :
- type === "|=" ?
- value === check || value.substr(0, check.length + 1) === check + "-" :
- false;
- },
-
- POS: function( elem, match, i, array ) {
- var name = match[2],
- filter = Expr.setFilters[ name ];
-
- if ( filter ) {
- return filter( elem, i, match, array );
- }
- }
- }
-};
-
-var origPOS = Expr.match.POS,
- fescape = function(all, num){
- return "\\" + (num - 0 + 1);
- };
-
-for ( var type in Expr.match ) {
- Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
- Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
-}
-
-var makeArray = function( array, results ) {
- array = Array.prototype.slice.call( array, 0 );
-
- if ( results ) {
- results.push.apply( results, array );
- return results;
- }
-
- return array;
-};
-
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-try {
- Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
-
-// Provide a fallback method if it does not work
-} catch( e ) {
- makeArray = function( array, results ) {
- var i = 0,
- ret = results || [];
-
- if ( toString.call(array) === "[object Array]" ) {
- Array.prototype.push.apply( ret, array );
-
- } else {
- if ( typeof array.length === "number" ) {
- for ( var l = array.length; i < l; i++ ) {
- ret.push( array[i] );
- }
-
- } else {
- for ( ; array[i]; i++ ) {
- ret.push( array[i] );
- }
- }
- }
-
- return ret;
- };
-}
-
-var sortOrder, siblingCheck;
-
-if ( document.documentElement.compareDocumentPosition ) {
- sortOrder = function( a, b ) {
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
- }
-
- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
- return a.compareDocumentPosition ? -1 : 1;
- }
-
- return a.compareDocumentPosition(b) & 4 ? -1 : 1;
- };
-
-} else {
- sortOrder = function( a, b ) {
- // The nodes are identical, we can exit early
- if ( a === b ) {
- hasDuplicate = true;
- return 0;
-
- // Fallback to using sourceIndex (in IE) if it's available on both nodes
- } else if ( a.sourceIndex && b.sourceIndex ) {
- return a.sourceIndex - b.sourceIndex;
- }
-
- var al, bl,
- ap = [],
- bp = [],
- aup = a.parentNode,
- bup = b.parentNode,
- cur = aup;
-
- // If the nodes are siblings (or identical) we can do a quick check
- if ( aup === bup ) {
- return siblingCheck( a, b );
-
- // If no parents were found then the nodes are disconnected
- } else if ( !aup ) {
- return -1;
-
- } else if ( !bup ) {
- return 1;
- }
-
- // Otherwise they're somewhere else in the tree so we need
- // to build up a full list of the parentNodes for comparison
- while ( cur ) {
- ap.unshift( cur );
- cur = cur.parentNode;
- }
-
- cur = bup;
-
- while ( cur ) {
- bp.unshift( cur );
- cur = cur.parentNode;
- }
-
- al = ap.length;
- bl = bp.length;
-
- // Start walking down the tree looking for a discrepancy
- for ( var i = 0; i < al && i < bl; i++ ) {
- if ( ap[i] !== bp[i] ) {
- return siblingCheck( ap[i], bp[i] );
- }
- }
-
- // We ended someplace up the tree so do a sibling check
- return i === al ?
- siblingCheck( a, bp[i], -1 ) :
- siblingCheck( ap[i], b, 1 );
- };
-
- siblingCheck = function( a, b, ret ) {
- if ( a === b ) {
- return ret;
- }
-
- var cur = a.nextSibling;
-
- while ( cur ) {
- if ( cur === b ) {
- return -1;
- }
-
- cur = cur.nextSibling;
- }
-
- return 1;
- };
-}
-
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-(function(){
- // We're going to inject a fake input element with a specified name
- var form = document.createElement("div"),
- id = "script" + (new Date()).getTime(),
- root = document.documentElement;
-
- form.innerHTML = "<a name='" + id + "'/>";
-
- // Inject it into the root element, check its status, and remove it quickly
- root.insertBefore( form, root.firstChild );
-
- // The workaround has to do additional checks after a getElementById
- // Which slows things down for other browsers (hence the branching)
- if ( document.getElementById( id ) ) {
- Expr.find.ID = function( match, context, isXML ) {
- if ( typeof context.getElementById !== "undefined" && !isXML ) {
- var m = context.getElementById(match[1]);
-
- return m ?
- m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
- [m] :
- undefined :
- [];
- }
- };
-
- Expr.filter.ID = function( elem, match ) {
- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
-
- return elem.nodeType === 1 && node && node.nodeValue === match;
- };
- }
-
- root.removeChild( form );
-
- // release memory in IE
- root = form = null;
-})();
-
-(function(){
- // Check to see if the browser returns only elements
- // when doing getElementsByTagName("*")
-
- // Create a fake element
- var div = document.createElement("div");
- div.appendChild( document.createComment("") );
-
- // Make sure no comments are found
- if ( div.getElementsByTagName("*").length > 0 ) {
- Expr.find.TAG = function( match, context ) {
- var results = context.getElementsByTagName( match[1] );
-
- // Filter out possible comments
- if ( match[1] === "*" ) {
- var tmp = [];
-
- for ( var i = 0; results[i]; i++ ) {
- if ( results[i].nodeType === 1 ) {
- tmp.push( results[i] );
- }
- }
-
- results = tmp;
- }
-
- return results;
- };
- }
-
- // Check to see if an attribute returns normalized href attributes
- div.innerHTML = "<a href='#'></a>";
-
- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
- div.firstChild.getAttribute("href") !== "#" ) {
-
- Expr.attrHandle.href = function( elem ) {
- return elem.getAttribute( "href", 2 );
- };
- }
-
- // release memory in IE
- div = null;
-})();
-
-if ( document.querySelectorAll ) {
- (function(){
- var oldSizzle = Sizzle,
- div = document.createElement("div"),
- id = "__sizzle__";
-
- div.innerHTML = "<p class='TEST'></p>";
-
- // Safari can't handle uppercase or unicode characters when
- // in quirks mode.
- if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
- return;
- }
-
- Sizzle = function( query, context, extra, seed ) {
- context = context || document;
-
- // Only use querySelectorAll on non-XML documents
- // (ID selectors don't work in non-HTML documents)
- if ( !seed && !Sizzle.isXML(context) ) {
- // See if we find a selector to speed up
- var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
-
- if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
- // Speed-up: Sizzle("TAG")
- if ( match[1] ) {
- return makeArray( context.getElementsByTagName( query ), extra );
-
- // Speed-up: Sizzle(".CLASS")
- } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
- return makeArray( context.getElementsByClassName( match[2] ), extra );
- }
- }
-
- if ( context.nodeType === 9 ) {
- // Speed-up: Sizzle("body")
- // The body element only exists once, optimize finding it
- if ( query === "body" && context.body ) {
- return makeArray( [ context.body ], extra );
-
- // Speed-up: Sizzle("#ID")
- } else if ( match && match[3] ) {
- var elem = context.getElementById( match[3] );
-
- // Check parentNode to catch when Blackberry 4.6 returns
- // nodes that are no longer in the document #6963
- if ( elem && elem.parentNode ) {
- // Handle the case where IE and Opera return items
- // by name instead of ID
- if ( elem.id === match[3] ) {
- return makeArray( [ elem ], extra );
- }
-
- } else {
- return makeArray( [], extra );
- }
- }
-
- try {
- return makeArray( context.querySelectorAll(query), extra );
- } catch(qsaError) {}
-
- // qSA works strangely on Element-rooted queries
- // We can work around this by specifying an extra ID on the root
- // and working up from there (Thanks to Andrew Dupont for the technique)
- // IE 8 doesn't work on object elements
- } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
- var oldContext = context,
- old = context.getAttribute( "id" ),
- nid = old || id,
- hasParent = context.parentNode,
- relativeHierarchySelector = /^\s*[+~]/.test( query );
-
- if ( !old ) {
- context.setAttribute( "id", nid );
- } else {
- nid = nid.replace( /'/g, "\\$&" );
- }
- if ( relativeHierarchySelector && hasParent ) {
- context = context.parentNode;
- }
-
- try {
- if ( !relativeHierarchySelector || hasParent ) {
- return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
- }
-
- } catch(pseudoError) {
- } finally {
- if ( !old ) {
- oldContext.removeAttribute( "id" );
- }
- }
- }
- }
-
- return oldSizzle(query, context, extra, seed);
- };
-
- for ( var prop in oldSizzle ) {
- Sizzle[ prop ] = oldSizzle[ prop ];
- }
-
- // release memory in IE
- div = null;
- })();
-}
-
-(function(){
- var html = document.documentElement,
- matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
-
- if ( matches ) {
- // Check to see if it's possible to do matchesSelector
- // on a disconnected node (IE 9 fails this)
- var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
- pseudoWorks = false;
-
- try {
- // This should fail with an exception
- // Gecko does not error, returns false instead
- matches.call( document.documentElement, "[test!='']:sizzle" );
-
- } catch( pseudoError ) {
- pseudoWorks = true;
- }
-
- Sizzle.matchesSelector = function( node, expr ) {
- // Make sure that attribute selectors are quoted
- expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
-
- if ( !Sizzle.isXML( node ) ) {
- try {
- if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
- var ret = matches.call( node, expr );
-
- // IE 9's matchesSelector returns false on disconnected nodes
- if ( ret || !disconnectedMatch ||
- // As well, disconnected nodes are said to be in a document
- // fragment in IE 9, so check for that
- node.document && node.document.nodeType !== 11 ) {
- return ret;
- }
- }
- } catch(e) {}
- }
-
- return Sizzle(expr, null, null, [node]).length > 0;
- };
- }
-})();
-
-(function(){
- var div = document.createElement("div");
-
- div.innerHTML = "<div class='test e'></div><div class='test'></div>";
-
- // Opera can't find a second classname (in 9.6)
- // Also, make sure that getElementsByClassName actually exists
- if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
- return;
- }
-
- // Safari caches class attributes, doesn't catch changes (in 3.2)
- div.lastChild.className = "e";
-
- if ( div.getElementsByClassName("e").length === 1 ) {
- return;
- }
-
- Expr.order.splice(1, 0, "CLASS");
- Expr.find.CLASS = function( match, context, isXML ) {
- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
- return context.getElementsByClassName(match[1]);
- }
- };
-
- // release memory in IE
- div = null;
-})();
-
-function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem[ expando ] === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 && !isXML ){
- elem[ expando ] = doneName;
- elem.sizset = i;
- }
-
- if ( elem.nodeName.toLowerCase() === cur ) {
- match = elem;
- break;
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
- for ( var i = 0, l = checkSet.length; i < l; i++ ) {
- var elem = checkSet[i];
-
- if ( elem ) {
- var match = false;
-
- elem = elem[dir];
-
- while ( elem ) {
- if ( elem[ expando ] === doneName ) {
- match = checkSet[elem.sizset];
- break;
- }
-
- if ( elem.nodeType === 1 ) {
- if ( !isXML ) {
- elem[ expando ] = doneName;
- elem.sizset = i;
- }
-
- if ( typeof cur !== "string" ) {
- if ( elem === cur ) {
- match = true;
- break;
- }
-
- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
- match = elem;
- break;
- }
- }
-
- elem = elem[dir];
- }
-
- checkSet[i] = match;
- }
- }
-}
-
-if ( document.documentElement.contains ) {
- Sizzle.contains = function( a, b ) {
- return a !== b && (a.contains ? a.contains(b) : true);
- };
-
-} else if ( document.documentElement.compareDocumentPosition ) {
- Sizzle.contains = function( a, b ) {
- return !!(a.compareDocumentPosition(b) & 16);
- };
-
-} else {
- Sizzle.contains = function() {
- return false;
- };
-}
-
-Sizzle.isXML = function( elem ) {
- // documentElement is verified for cases where it doesn't yet exist
- // (such as loading iframes in IE - #4833)
- var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
-
- return documentElement ? documentElement.nodeName !== "HTML" : false;
-};
-
-var posProcess = function( selector, context, seed ) {
- var match,
- tmpSet = [],
- later = "",
- root = context.nodeType ? [context] : context;
-
- // Position selectors must be done after the filter
- // And so must :not(positional) so we move all PSEUDOs to the end
- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
- later += match[0];
- selector = selector.replace( Expr.match.PSEUDO, "" );
- }
-
- selector = Expr.relative[selector] ? selector + "*" : selector;
-
- for ( var i = 0, l = root.length; i < l; i++ ) {
- Sizzle( selector, root[i], tmpSet, seed );
- }
-
- return Sizzle.filter( later, tmpSet );
-};
-
-// EXPOSE
-// Override sizzle attribute retrieval
-Sizzle.attr = jQuery.attr;
-Sizzle.selectors.attrMap = {};
-jQuery.find = Sizzle;
-jQuery.expr = Sizzle.selectors;
-jQuery.expr[":"] = jQuery.expr.filters;
-jQuery.unique = Sizzle.uniqueSort;
-jQuery.text = Sizzle.getText;
-jQuery.isXMLDoc = Sizzle.isXML;
-jQuery.contains = Sizzle.contains;
-
-
-})();
-
-
-var runtil = /Until$/,
- rparentsprev = /^(?:parents|prevUntil|prevAll)/,
- // Note: This RegExp should be improved, or likely pulled from Sizzle
- rmultiselector = /,/,
- isSimple = /^.[^:#\[\.,]*$/,
- slice = Array.prototype.slice,
- POS = jQuery.expr.match.POS,
- // methods guaranteed to produce a unique set when starting from a unique set
- guaranteedUnique = {
- children: true,
- contents: true,
- next: true,
- prev: true
- };
-
-jQuery.fn.extend({
- find: function( selector ) {
- var self = this,
- i, l;
-
- if ( typeof selector !== "string" ) {
- return jQuery( selector ).filter(function() {
- for ( i = 0, l = self.length; i < l; i++ ) {
- if ( jQuery.contains( self[ i ], this ) ) {
- return true;
- }
- }
- });
- }
-
- var ret = this.pushStack( "", "find", selector ),
- length, n, r;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- length = ret.length;
- jQuery.find( selector, this[i], ret );
-
- if ( i > 0 ) {
- // Make sure that the results are unique
- for ( n = length; n < ret.length; n++ ) {
- for ( r = 0; r < length; r++ ) {
- if ( ret[r] === ret[n] ) {
- ret.splice(n--, 1);
- break;
- }
- }
- }
- }
- }
-
- return ret;
- },
-
- has: function( target ) {
- var targets = jQuery( target );
- return this.filter(function() {
- for ( var i = 0, l = targets.length; i < l; i++ ) {
- if ( jQuery.contains( this, targets[i] ) ) {
- return true;
- }
- }
- });
- },
-
- not: function( selector ) {
- return this.pushStack( winnow(this, selector, false), "not", selector);
- },
-
- filter: function( selector ) {
- return this.pushStack( winnow(this, selector, true), "filter", selector );
- },
-
- is: function( selector ) {
- return !!selector && (
- typeof selector === "string" ?
- // If this is a positional selector, check membership in the returned set
- // so $("p:first").is("p:last") won't return true for a doc with two "p".
- POS.test( selector ) ?
- jQuery( selector, this.context ).index( this[0] ) >= 0 :
- jQuery.filter( selector, this ).length > 0 :
- this.filter( selector ).length > 0 );
- },
-
- closest: function( selectors, context ) {
- var ret = [], i, l, cur = this[0];
-
- // Array (deprecated as of jQuery 1.7)
- if ( jQuery.isArray( selectors ) ) {
- var level = 1;
-
- while ( cur && cur.ownerDocument && cur !== context ) {
- for ( i = 0; i < selectors.length; i++ ) {
-
- if ( jQuery( cur ).is( selectors[ i ] ) ) {
- ret.push({ selector: selectors[ i ], elem: cur, level: level });
- }
- }
-
- cur = cur.parentNode;
- level++;
- }
-
- return ret;
- }
-
- // String
- var pos = POS.test( selectors ) || typeof selectors !== "string" ?
- jQuery( selectors, context || this.context ) :
- 0;
-
- for ( i = 0, l = this.length; i < l; i++ ) {
- cur = this[i];
-
- while ( cur ) {
- if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
- ret.push( cur );
- break;
-
- } else {
- cur = cur.parentNode;
- if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
- break;
- }
- }
- }
- }
-
- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
-
- return this.pushStack( ret, "closest", selectors );
- },
-
- // Determine the position of an element within
- // the matched set of elements
- index: function( elem ) {
-
- // No argument, return index in parent
- if ( !elem ) {
- return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
- }
-
- // index in selector
- if ( typeof elem === "string" ) {
- return jQuery.inArray( this[0], jQuery( elem ) );
- }
-
- // Locate the position of the desired element
- return jQuery.inArray(
- // If it receives a jQuery object, the first element is used
- elem.jquery ? elem[0] : elem, this );
- },
-
- add: function( selector, context ) {
- var set = typeof selector === "string" ?
- jQuery( selector, context ) :
- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
- all = jQuery.merge( this.get(), set );
-
- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
- all :
- jQuery.unique( all ) );
- },
-
- andSelf: function() {
- return this.add( this.prevObject );
- }
-});
-
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-function isDisconnected( node ) {
- return !node || !node.parentNode || node.parentNode.nodeType === 11;
-}
-
-jQuery.each({
- parent: function( elem ) {
- var parent = elem.parentNode;
- return parent && parent.nodeType !== 11 ? parent : null;
- },
- parents: function( elem ) {
- return jQuery.dir( elem, "parentNode" );
- },
- parentsUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "parentNode", until );
- },
- next: function( elem ) {
- return jQuery.nth( elem, 2, "nextSibling" );
- },
- prev: function( elem ) {
- return jQuery.nth( elem, 2, "previousSibling" );
- },
- nextAll: function( elem ) {
- return jQuery.dir( elem, "nextSibling" );
- },
- prevAll: function( elem ) {
- return jQuery.dir( elem, "previousSibling" );
- },
- nextUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "nextSibling", until );
- },
- prevUntil: function( elem, i, until ) {
- return jQuery.dir( elem, "previousSibling", until );
- },
- siblings: function( elem ) {
- return jQuery.sibling( elem.parentNode.firstChild, elem );
- },
- children: function( elem ) {
- return jQuery.sibling( elem.firstChild );
- },
- contents: function( elem ) {
- return jQuery.nodeName( elem, "iframe" ) ?
- elem.contentDocument || elem.contentWindow.document :
- jQuery.makeArray( elem.childNodes );
- }
-}, function( name, fn ) {
- jQuery.fn[ name ] = function( until, selector ) {
- var ret = jQuery.map( this, fn, until ),
- // The variable 'args' was introduced in
- // https://github.com/jquery/jquery/commit/52a0238
- // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
- // http://code.google.com/p/v8/issues/detail?id=1050
- args = slice.call(arguments);
-
- if ( !runtil.test( name ) ) {
- selector = until;
- }
-
- if ( selector && typeof selector === "string" ) {
- ret = jQuery.filter( selector, ret );
- }
-
- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
-
- if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
- ret = ret.reverse();
- }
-
- return this.pushStack( ret, name, args.join(",") );
- };
-});
-
-jQuery.extend({
- filter: function( expr, elems, not ) {
- if ( not ) {
- expr = ":not(" + expr + ")";
- }
-
- return elems.length === 1 ?
- jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
- jQuery.find.matches(expr, elems);
- },
-
- dir: function( elem, dir, until ) {
- var matched = [],
- cur = elem[ dir ];
-
- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
- if ( cur.nodeType === 1 ) {
- matched.push( cur );
- }
- cur = cur[dir];
- }
- return matched;
- },
-
- nth: function( cur, result, dir, elem ) {
- result = result || 1;
- var num = 0;
-
- for ( ; cur; cur = cur[dir] ) {
- if ( cur.nodeType === 1 && ++num === result ) {
- break;
- }
- }
-
- return cur;
- },
-
- sibling: function( n, elem ) {
- var r = [];
-
- for ( ; n; n = n.nextSibling ) {
- if ( n.nodeType === 1 && n !== elem ) {
- r.push( n );
- }
- }
-
- return r;
- }
-});
-
-// Implement the identical functionality for filter and not
-function winnow( elements, qualifier, keep ) {
-
- // Can't pass null or undefined to indexOf in Firefox 4
- // Set to 0 to skip string check
- qualifier = qualifier || 0;
-
- if ( jQuery.isFunction( qualifier ) ) {
- return jQuery.grep(elements, function( elem, i ) {
- var retVal = !!qualifier.call( elem, i, elem );
- return retVal === keep;
- });
-
- } else if ( qualifier.nodeType ) {
- return jQuery.grep(elements, function( elem, i ) {
- return ( elem === qualifier ) === keep;
- });
-
- } else if ( typeof qualifier === "string" ) {
- var filtered = jQuery.grep(elements, function( elem ) {
- return elem.nodeType === 1;
- });
-
- if ( isSimple.test( qualifier ) ) {
- return jQuery.filter(qualifier, filtered, !keep);
- } else {
- qualifier = jQuery.filter( qualifier, filtered );
- }
- }
-
- return jQuery.grep(elements, function( elem, i ) {
- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
- });
-}
-
-
-
-
-function createSafeFragment( document ) {
- var list = nodeNames.split( " " ),
- safeFrag = document.createDocumentFragment();
-
- if ( safeFrag.createElement ) {
- while ( list.length ) {
- safeFrag.createElement(
- list.pop()
- );
- }
- }
- return safeFrag;
-}
-
-var nodeNames = "abbr article aside audio canvas datalist details figcaption figure footer " +
- "header hgroup mark meter nav output progress section summary time video",
- rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
- rleadingWhitespace = /^\s+/,
- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
- rtagName = /<([\w:]+)/,
- rtbody = /<tbody/i,
- rhtml = /<|&#?\w+;/,
- rnoInnerhtml = /<(?:script|style)/i,
- rnocache = /<(?:script|object|embed|option|style)/i,
- rnoshimcache = new RegExp("<(?:" + nodeNames.replace(" ", "|") + ")", "i"),
- // checked="checked" or checked
- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
- rscriptType = /\/(java|ecma)script/i,
- rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
- wrapMap = {
- option: [ 1, "<select multiple='multiple'>", "</select>" ],
- legend: [ 1, "<fieldset>", "</fieldset>" ],
- thead: [ 1, "<table>", "</table>" ],
- tr: [ 2, "<table><tbody>", "</tbody></table>" ],
- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
- col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
- area: [ 1, "<map>", "</map>" ],
- _default: [ 0, "", "" ]
- },
- safeFragment = createSafeFragment( document );
-
-wrapMap.optgroup = wrapMap.option;
-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-wrapMap.th = wrapMap.td;
-
-// IE can't serialize <link> and <script> tags normally
-if ( !jQuery.support.htmlSerialize ) {
- wrapMap._default = [ 1, "div<div>", "</div>" ];
-}
-
-jQuery.fn.extend({
- text: function( text ) {
- if ( jQuery.isFunction(text) ) {
- return this.each(function(i) {
- var self = jQuery( this );
-
- self.text( text.call(this, i, self.text()) );
- });
- }
-
- if ( typeof text !== "object" && text !== undefined ) {
- return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
- }
-
- return jQuery.text( this );
- },
-
- wrapAll: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapAll( html.call(this, i) );
- });
- }
-
- if ( this[0] ) {
- // The elements to wrap the target around
- var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
-
- if ( this[0].parentNode ) {
- wrap.insertBefore( this[0] );
- }
-
- wrap.map(function() {
- var elem = this;
-
- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
- elem = elem.firstChild;
- }
-
- return elem;
- }).append( this );
- }
-
- return this;
- },
-
- wrapInner: function( html ) {
- if ( jQuery.isFunction( html ) ) {
- return this.each(function(i) {
- jQuery(this).wrapInner( html.call(this, i) );
- });
- }
-
- return this.each(function() {
- var self = jQuery( this ),
- contents = self.contents();
-
- if ( contents.length ) {
- contents.wrapAll( html );
-
- } else {
- self.append( html );
- }
- });
- },
-
- wrap: function( html ) {
- return this.each(function() {
- jQuery( this ).wrapAll( html );
- });
- },
-
- unwrap: function() {
- return this.parent().each(function() {
- if ( !jQuery.nodeName( this, "body" ) ) {
- jQuery( this ).replaceWith( this.childNodes );
- }
- }).end();
- },
-
- append: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 ) {
- this.appendChild( elem );
- }
- });
- },
-
- prepend: function() {
- return this.domManip(arguments, true, function( elem ) {
- if ( this.nodeType === 1 ) {
- this.insertBefore( elem, this.firstChild );
- }
- });
- },
-
- before: function() {
- if ( this[0] && this[0].parentNode ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this );
- });
- } else if ( arguments.length ) {
- var set = jQuery(arguments[0]);
- set.push.apply( set, this.toArray() );
- return this.pushStack( set, "before", arguments );
- }
- },
-
- after: function() {
- if ( this[0] && this[0].parentNode ) {
- return this.domManip(arguments, false, function( elem ) {
- this.parentNode.insertBefore( elem, this.nextSibling );
- });
- } else if ( arguments.length ) {
- var set = this.pushStack( this, "after", arguments );
- set.push.apply( set, jQuery(arguments[0]).toArray() );
- return set;
- }
- },
-
- // keepData is for internal use only--do not document
- remove: function( selector, keepData ) {
- for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
- if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
- if ( !keepData && elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- jQuery.cleanData( [ elem ] );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
- }
- }
-
- return this;
- },
-
- empty: function() {
- for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
- // Remove element nodes and prevent memory leaks
- if ( elem.nodeType === 1 ) {
- jQuery.cleanData( elem.getElementsByTagName("*") );
- }
-
- // Remove any remaining nodes
- while ( elem.firstChild ) {
- elem.removeChild( elem.firstChild );
- }
- }
-
- return this;
- },
-
- clone: function( dataAndEvents, deepDataAndEvents ) {
- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
-
- return this.map( function () {
- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
- });
- },
-
- html: function( value ) {
- if ( value === undefined ) {
- return this[0] && this[0].nodeType === 1 ?
- this[0].innerHTML.replace(rinlinejQuery, "") :
- null;
-
- // See if we can take a shortcut and just use innerHTML
- } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
- (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
- !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
-
- value = value.replace(rxhtmlTag, "<$1></$2>");
-
- try {
- for ( var i = 0, l = this.length; i < l; i++ ) {
- // Remove element nodes and prevent memory leaks
- if ( this[i].nodeType === 1 ) {
- jQuery.cleanData( this[i].getElementsByTagName("*") );
- this[i].innerHTML = value;
- }
- }
-
- // If using innerHTML throws an exception, use the fallback method
- } catch(e) {
- this.empty().append( value );
- }
-
- } else if ( jQuery.isFunction( value ) ) {
- this.each(function(i){
- var self = jQuery( this );
-
- self.html( value.call(this, i, self.html()) );
- });
-
- } else {
- this.empty().append( value );
- }
-
- return this;
- },
-
- replaceWith: function( value ) {
- if ( this[0] && this[0].parentNode ) {
- // Make sure that the elements are removed from the DOM before they are inserted
- // this can help fix replacing a parent with child elements
- if ( jQuery.isFunction( value ) ) {
- return this.each(function(i) {
- var self = jQuery(this), old = self.html();
- self.replaceWith( value.call( this, i, old ) );
- });
- }
-
- if ( typeof value !== "string" ) {
- value = jQuery( value ).detach();
- }
-
- return this.each(function() {
- var next = this.nextSibling,
- parent = this.parentNode;
-
- jQuery( this ).remove();
-
- if ( next ) {
- jQuery(next).before( value );
- } else {
- jQuery(parent).append( value );
- }
- });
- } else {
- return this.length ?
- this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
- this;
- }
- },
-
- detach: function( selector ) {
- return this.remove( selector, true );
- },
-
- domManip: function( args, table, callback ) {
- var results, first, fragment, parent,
- value = args[0],
- scripts = [];
-
- // We can't cloneNode fragments that contain checked, in WebKit
- if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
- return this.each(function() {
- jQuery(this).domManip( args, table, callback, true );
- });
- }
-
- if ( jQuery.isFunction(value) ) {
- return this.each(function(i) {
- var self = jQuery(this);
- args[0] = value.call(this, i, table ? self.html() : undefined);
- self.domManip( args, table, callback );
- });
- }
-
- if ( this[0] ) {
- parent = value && value.parentNode;
-
- // If we're in a fragment, just use that instead of building a new one
- if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
- results = { fragment: parent };
-
- } else {
- results = jQuery.buildFragment( args, this, scripts );
- }
-
- fragment = results.fragment;
-
- if ( fragment.childNodes.length === 1 ) {
- first = fragment = fragment.firstChild;
- } else {
- first = fragment.firstChild;
- }
-
- if ( first ) {
- table = table && jQuery.nodeName( first, "tr" );
-
- for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
- callback.call(
- table ?
- root(this[i], first) :
- this[i],
- // Make sure that we do not leak memory by inadvertently discarding
- // the original fragment (which might have attached data) instead of
- // using it; in addition, use the original fragment object for the last
- // item instead of first because it can end up being emptied incorrectly
- // in certain situations (Bug #8070).
- // Fragments from the fragment cache must always be cloned and never used
- // in place.
- results.cacheable || ( l > 1 && i < lastIndex ) ?
- jQuery.clone( fragment, true, true ) :
- fragment
- );
- }
- }
-
- if ( scripts.length ) {
- jQuery.each( scripts, evalScript );
- }
- }
-
- return this;
- }
-});
-
-function root( elem, cur ) {
- return jQuery.nodeName(elem, "table") ?
- (elem.getElementsByTagName("tbody")[0] ||
- elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
- elem;
-}
-
-function cloneCopyEvent( src, dest ) {
-
- if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
- return;
- }
-
- var type, i, l,
- oldData = jQuery._data( src ),
- curData = jQuery._data( dest, oldData ),
- events = oldData.events;
-
- if ( events ) {
- delete curData.handle;
- curData.events = {};
-
- for ( type in events ) {
- for ( i = 0, l = events[ type ].length; i < l; i++ ) {
- jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
- }
- }
- }
-
- // make the cloned public data object a copy from the original
- if ( curData.data ) {
- curData.data = jQuery.extend( {}, curData.data );
- }
-}
-
-function cloneFixAttributes( src, dest ) {
- var nodeName;
-
- // We do not need to do anything for non-Elements
- if ( dest.nodeType !== 1 ) {
- return;
- }
-
- // clearAttributes removes the attributes, which we don't want,
- // but also removes the attachEvent events, which we *do* want
- if ( dest.clearAttributes ) {
- dest.clearAttributes();
- }
-
- // mergeAttributes, in contrast, only merges back on the
- // original attributes, not the events
- if ( dest.mergeAttributes ) {
- dest.mergeAttributes( src );
- }
-
- nodeName = dest.nodeName.toLowerCase();
-
- // IE6-8 fail to clone children inside object elements that use
- // the proprietary classid attribute value (rather than the type
- // attribute) to identify the type of content to display
- if ( nodeName === "object" ) {
- dest.outerHTML = src.outerHTML;
-
- } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
- // IE6-8 fails to persist the checked state of a cloned checkbox
- // or radio button. Worse, IE6-7 fail to give the cloned element
- // a checked appearance if the defaultChecked value isn't also set
- if ( src.checked ) {
- dest.defaultChecked = dest.checked = src.checked;
- }
-
- // IE6-7 get confused and end up setting the value of a cloned
- // checkbox/radio button to an empty string instead of "on"
- if ( dest.value !== src.value ) {
- dest.value = src.value;
- }
-
- // IE6-8 fails to return the selected option to the default selected
- // state when cloning options
- } else if ( nodeName === "option" ) {
- dest.selected = src.defaultSelected;
-
- // IE6-8 fails to set the defaultValue to the correct value when
- // cloning other types of input fields
- } else if ( nodeName === "input" || nodeName === "textarea" ) {
- dest.defaultValue = src.defaultValue;
- }
-
- // Event data gets referenced instead of copied if the expando
- // gets copied too
- dest.removeAttribute( jQuery.expando );
-}
-
-jQuery.buildFragment = function( args, nodes, scripts ) {
- var fragment, cacheable, cacheresults, doc,
- first = args[ 0 ];
-
- // nodes may contain either an explicit document object,
- // a jQuery collection or context object.
- // If nodes[0] contains a valid object to assign to doc
- if ( nodes && nodes[0] ) {
- doc = nodes[0].ownerDocument || nodes[0];
- }
-
- // Ensure that an attr object doesn't incorrectly stand in as a document object
- // Chrome and Firefox seem to allow this to occur and will throw exception
- // Fixes #8950
- if ( !doc.createDocumentFragment ) {
- doc = document;
- }
-
- // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
- // Cloning options loses the selected state, so don't cache them
- // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
- // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
- // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
- if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
- first.charAt(0) === "<" && !rnocache.test( first ) &&
- (jQuery.support.checkClone || !rchecked.test( first )) &&
- (!jQuery.support.unknownElems && rnoshimcache.test( first )) ) {
-
- cacheable = true;
-
- cacheresults = jQuery.fragments[ first ];
- if ( cacheresults && cacheresults !== 1 ) {
- fragment = cacheresults;
- }
- }
-
- if ( !fragment ) {
- fragment = doc.createDocumentFragment();
- jQuery.clean( args, doc, fragment, scripts );
- }
-
- if ( cacheable ) {
- jQuery.fragments[ first ] = cacheresults ? fragment : 1;
- }
-
- return { fragment: fragment, cacheable: cacheable };
-};
-
-jQuery.fragments = {};
-
-jQuery.each({
- appendTo: "append",
- prependTo: "prepend",
- insertBefore: "before",
- insertAfter: "after",
- replaceAll: "replaceWith"
-}, function( name, original ) {
- jQuery.fn[ name ] = function( selector ) {
- var ret = [],
- insert = jQuery( selector ),
- parent = this.length === 1 && this[0].parentNode;
-
- if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
- insert[ original ]( this[0] );
- return this;
-
- } else {
- for ( var i = 0, l = insert.length; i < l; i++ ) {
- var elems = ( i > 0 ? this.clone(true) : this ).get();
- jQuery( insert[i] )[ original ]( elems );
- ret = ret.concat( elems );
- }
-
- return this.pushStack( ret, name, insert.selector );
- }
- };
-});
-
-function getAll( elem ) {
- if ( typeof elem.getElementsByTagName !== "undefined" ) {
- return elem.getElementsByTagName( "*" );
-
- } else if ( typeof elem.querySelectorAll !== "undefined" ) {
- return elem.querySelectorAll( "*" );
-
- } else {
- return [];
- }
-}
-
-// Used in clean, fixes the defaultChecked property
-function fixDefaultChecked( elem ) {
- if ( elem.type === "checkbox" || elem.type === "radio" ) {
- elem.defaultChecked = elem.checked;
- }
-}
-// Finds all inputs and passes them to fixDefaultChecked
-function findInputs( elem ) {
- var nodeName = ( elem.nodeName || "" ).toLowerCase();
- if ( nodeName === "input" ) {
- fixDefaultChecked( elem );
- // Skip scripts, get other children
- } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
- jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
- }
-}
-
-jQuery.extend({
- clone: function( elem, dataAndEvents, deepDataAndEvents ) {
- var clone = elem.cloneNode(true),
- srcElements,
- destElements,
- i;
-
- if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
- (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
- // IE copies events bound via attachEvent when using cloneNode.
- // Calling detachEvent on the clone will also remove the events
- // from the original. In order to get around this, we use some
- // proprietary methods to clear the events. Thanks to MooTools
- // guys for this hotness.
-
- cloneFixAttributes( elem, clone );
-
- // Using Sizzle here is crazy slow, so we use getElementsByTagName
- // instead
- srcElements = getAll( elem );
- destElements = getAll( clone );
-
- // Weird iteration because IE will replace the length property
- // with an element if you are cloning the body and one of the
- // elements on the page has a name or id of "length"
- for ( i = 0; srcElements[i]; ++i ) {
- // Ensure that the destination node is not null; Fixes #9587
- if ( destElements[i] ) {
- cloneFixAttributes( srcElements[i], destElements[i] );
- }
- }
- }
-
- // Copy the events from the original to the clone
- if ( dataAndEvents ) {
- cloneCopyEvent( elem, clone );
-
- if ( deepDataAndEvents ) {
- srcElements = getAll( elem );
- destElements = getAll( clone );
-
- for ( i = 0; srcElements[i]; ++i ) {
- cloneCopyEvent( srcElements[i], destElements[i] );
- }
- }
- }
-
- srcElements = destElements = null;
-
- // Return the cloned set
- return clone;
- },
-
- clean: function( elems, context, fragment, scripts ) {
- var checkScriptType;
-
- context = context || document;
-
- // !context.createElement fails in IE with an error but returns typeof 'object'
- if ( typeof context.createElement === "undefined" ) {
- context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
- }
-
- var ret = [], j;
-
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
- if ( typeof elem === "number" ) {
- elem += "";
- }
-
- if ( !elem ) {
- continue;
- }
-
- // Convert html string into DOM nodes
- if ( typeof elem === "string" ) {
- if ( !rhtml.test( elem ) ) {
- elem = context.createTextNode( elem );
- } else {
- // Fix "XHTML"-style tags in all browsers
- elem = elem.replace(rxhtmlTag, "<$1></$2>");
-
- // Trim whitespace, otherwise indexOf won't work as expected
- var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
- wrap = wrapMap[ tag ] || wrapMap._default,
- depth = wrap[0],
- div = context.createElement("div");
-
- // Append wrapper element to unknown element safe doc fragment
- if ( context === document ) {
- // Use the fragment we've already created for this document
- safeFragment.appendChild( div );
- } else {
- // Use a fragment created with the owner document
- createSafeFragment( context ).appendChild( div );
- }
-
- // Go to html and back, then peel off extra wrappers
- div.innerHTML = wrap[1] + elem + wrap[2];
-
- // Move to the right depth
- while ( depth-- ) {
- div = div.lastChild;
- }
-
- // Remove IE's autoinserted <tbody> from table fragments
- if ( !jQuery.support.tbody ) {
-
- // String was a <table>, *may* have spurious <tbody>
- var hasBody = rtbody.test(elem),
- tbody = tag === "table" && !hasBody ?
- div.firstChild && div.firstChild.childNodes :
-
- // String was a bare <thead> or <tfoot>
- wrap[1] === "<table>" && !hasBody ?
- div.childNodes :
- [];
-
- for ( j = tbody.length - 1; j >= 0 ; --j ) {
- if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
- tbody[ j ].parentNode.removeChild( tbody[ j ] );
- }
- }
- }
-
- // IE completely kills leading whitespace when innerHTML is used
- if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
- div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
- }
-
- elem = div.childNodes;
- }
- }
-
- // Resets defaultChecked for any radios and checkboxes
- // about to be appended to the DOM in IE 6/7 (#8060)
- var len;
- if ( !jQuery.support.appendChecked ) {
- if ( elem[0] && typeof (len = elem.length) === "number" ) {
- for ( j = 0; j < len; j++ ) {
- findInputs( elem[j] );
- }
- } else {
- findInputs( elem );
- }
- }
-
- if ( elem.nodeType ) {
- ret.push( elem );
- } else {
- ret = jQuery.merge( ret, elem );
- }
- }
-
- if ( fragment ) {
- checkScriptType = function( elem ) {
- return !elem.type || rscriptType.test( elem.type );
- };
- for ( i = 0; ret[i]; i++ ) {
- if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
- scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
-
- } else {
- if ( ret[i].nodeType === 1 ) {
- var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
-
- ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
- }
- fragment.appendChild( ret[i] );
- }
- }
- }
-
- return ret;
- },
-
- cleanData: function( elems ) {
- var data, id,
- cache = jQuery.cache,
- special = jQuery.event.special,
- deleteExpando = jQuery.support.deleteExpando;
-
- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
- if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
- continue;
- }
-
- id = elem[ jQuery.expando ];
-
- if ( id ) {
- data = cache[ id ];
-
- if ( data && data.events ) {
- for ( var type in data.events ) {
- if ( special[ type ] ) {
- jQuery.event.remove( elem, type );
-
- // This is a shortcut to avoid jQuery.event.remove's overhead
- } else {
- jQuery.removeEvent( elem, type, data.handle );
- }
- }
-
- // Null the DOM reference to avoid IE6/7/8 leak (#7054)
- if ( data.handle ) {
- data.handle.elem = null;
- }
- }
-
- if ( deleteExpando ) {
- delete elem[ jQuery.expando ];
-
- } else if ( elem.removeAttribute ) {
- elem.removeAttribute( jQuery.expando );
- }
-
- delete cache[ id ];
- }
- }
- }
-});
-
-function evalScript( i, elem ) {
- if ( elem.src ) {
- jQuery.ajax({
- url: elem.src,
- async: false,
- dataType: "script"
- });
- } else {
- jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
- }
-
- if ( elem.parentNode ) {
- elem.parentNode.removeChild( elem );
- }
-}
-
-
-
-
-var ralpha = /alpha\([^)]*\)/i,
- ropacity = /opacity=([^)]*)/,
- // fixed for IE9, see #8346
- rupper = /([A-Z]|^ms)/g,
- rnumpx = /^-?\d+(?:px)?$/i,
- rnum = /^-?\d/,
- rrelNum = /^([\-+])=([\-+.\de]+)/,
-
- cssShow = { position: "absolute", visibility: "hidden", display: "block" },
- cssWidth = [ "Left", "Right" ],
- cssHeight = [ "Top", "Bottom" ],
- curCSS,
-
- getComputedStyle,
- currentStyle;
-
-jQuery.fn.css = function( name, value ) {
- // Setting 'undefined' is a no-op
- if ( arguments.length === 2 && value === undefined ) {
- return this;
- }
-
- return jQuery.access( this, name, value, true, function( elem, name, value ) {
- return value !== undefined ?
- jQuery.style( elem, name, value ) :
- jQuery.css( elem, name );
- });
-};
-
-jQuery.extend({
- // Add in style property hooks for overriding the default
- // behavior of getting and setting a style property
- cssHooks: {
- opacity: {
- get: function( elem, computed ) {
- if ( computed ) {
- // We should always get a number back from opacity
- var ret = curCSS( elem, "opacity", "opacity" );
- return ret === "" ? "1" : ret;
-
- } else {
- return elem.style.opacity;
- }
- }
- }
- },
-
- // Exclude the following css properties to add px
- cssNumber: {
- "fillOpacity": true,
- "fontWeight": true,
- "lineHeight": true,
- "opacity": true,
- "orphans": true,
- "widows": true,
- "zIndex": true,
- "zoom": true
- },
-
- // Add in properties whose names you wish to fix before
- // setting or getting the value
- cssProps: {
- // normalize float css property
- "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
- },
-
- // Get and set the style property on a DOM Node
- style: function( elem, name, value, extra ) {
- // Don't set styles on text and comment nodes
- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
- return;
- }
-
- // Make sure that we're working with the right name
- var ret, type, origName = jQuery.camelCase( name ),
- style = elem.style, hooks = jQuery.cssHooks[ origName ];
-
- name = jQuery.cssProps[ origName ] || origName;
-
- // Check if we're setting a value
- if ( value !== undefined ) {
- type = typeof value;
-
- // convert relative number strings (+= or -=) to relative numbers. #7345
- if ( type === "string" && (ret = rrelNum.exec( value )) ) {
- value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
- // Fixes bug #9237
- type = "number";
- }
-
- // Make sure that NaN and null values aren't set. See: #7116
- if ( value == null || type === "number" && isNaN( value ) ) {
- return;
- }
-
- // If a number was passed in, add 'px' to the (except for certain CSS properties)
- if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
- value += "px";
- }
-
- // If a hook was provided, use that value, otherwise just set the specified value
- if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
- // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
- // Fixes bug #5509
- try {
- style[ name ] = value;
- } catch(e) {}
- }
-
- } else {
- // If a hook was provided get the non-computed value from there
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
- return ret;
- }
-
- // Otherwise just get the value from the style object
- return style[ name ];
- }
- },
-
- css: function( elem, name, extra ) {
- var ret, hooks;
-
- // Make sure that we're working with the right name
- name = jQuery.camelCase( name );
- hooks = jQuery.cssHooks[ name ];
- name = jQuery.cssProps[ name ] || name;
-
- // cssFloat needs a special treatment
- if ( name === "cssFloat" ) {
- name = "float";
- }
-
- // If a hook was provided get the computed value from there
- if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
- return ret;
-
- // Otherwise, if a way to get the computed value exists, use that
- } else if ( curCSS ) {
- return curCSS( elem, name );
- }
- },
-
- // A method for quickly swapping in/out CSS properties to get correct calculations
- swap: function( elem, options, callback ) {
- var old = {};
-
- // Remember the old values, and insert the new ones
- for ( var name in options ) {
- old[ name ] = elem.style[ name ];
- elem.style[ name ] = options[ name ];
- }
-
- callback.call( elem );
-
- // Revert the old values
- for ( name in options ) {
- elem.style[ name ] = old[ name ];
- }
- }
-});
-
-// DEPRECATED, Use jQuery.css() instead
-jQuery.curCSS = jQuery.css;
-
-jQuery.each(["height", "width"], function( i, name ) {
- jQuery.cssHooks[ name ] = {
- get: function( elem, computed, extra ) {
- var val;
-
- if ( computed ) {
- if ( elem.offsetWidth !== 0 ) {
- return getWH( elem, name, extra );
- } else {
- jQuery.swap( elem, cssShow, function() {
- val = getWH( elem, name, extra );
- });
- }
-
- return val;
- }
- },
-
- set: function( elem, value ) {
- if ( rnumpx.test( value ) ) {
- // ignore negative width and height values #1599
- value = parseFloat( value );
-
- if ( value >= 0 ) {
- return value + "px";
- }
-
- } else {
- return value;
- }
- }
- };
-});
-
-if ( !jQuery.support.opacity ) {
- jQuery.cssHooks.opacity = {
- get: function( elem, computed ) {
- // IE uses filters for opacity
- return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
- ( parseFloat( RegExp.$1 ) / 100 ) + "" :
- computed ? "1" : "";
- },
-
- set: function( elem, value ) {
- var style = elem.style,
- currentStyle = elem.currentStyle,
- opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
- filter = currentStyle && currentStyle.filter || style.filter || "";
-
- // IE has trouble with opacity if it does not have layout
- // Force it by setting the zoom level
- style.zoom = 1;
-
- // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
- if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
-
- // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
- // if "filter:" is present at all, clearType is disabled, we want to avoid this
- // style.removeAttribute is IE Only, but so apparently is this code path...
- style.removeAttribute( "filter" );
-
- // if there there is no filter style applied in a css rule, we are done
- if ( currentStyle && !currentStyle.filter ) {
- return;
- }
- }
-
- // otherwise, set new filter values
- style.filter = ralpha.test( filter ) ?
- filter.replace( ralpha, opacity ) :
- filter + " " + opacity;
- }
- };
-}
-
-jQuery(function() {
- // This hook cannot be added until DOM ready because the support test
- // for it is not run until after DOM ready
- if ( !jQuery.support.reliableMarginRight ) {
- jQuery.cssHooks.marginRight = {
- get: function( elem, computed ) {
- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
- // Work around by temporarily setting element display to inline-block
- var ret;
- jQuery.swap( elem, { "display": "inline-block" }, function() {
- if ( computed ) {
- ret = curCSS( elem, "margin-right", "marginRight" );
- } else {
- ret = elem.style.marginRight;
- }
- });
- return ret;
- }
- };
- }
-});
-
-if ( document.defaultView && document.defaultView.getComputedStyle ) {
- getComputedStyle = function( elem, name ) {
- var ret, defaultView, computedStyle;
-
- name = name.replace( rupper, "-$1" ).toLowerCase();
-
- if ( !(defaultView = elem.ownerDocument.defaultView) ) {
- return undefined;
- }
-
- if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
- ret = computedStyle.getPropertyValue( name );
- if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
- ret = jQuery.style( elem, name );
- }
- }
-
- return ret;
- };
-}
-
-if ( document.documentElement.currentStyle ) {
- currentStyle = function( elem, name ) {
- var left, rsLeft, uncomputed,
- ret = elem.currentStyle && elem.currentStyle[ name ],
- style = elem.style;
-
- // Avoid setting ret to empty string here
- // so we don't default to auto
- if ( ret === null && style && (uncomputed = style[ name ]) ) {
- ret = uncomputed;
- }
-
- // From the awesome hack by Dean Edwards
- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
-
- // If we're not dealing with a regular pixel number
- // but a number that has a weird ending, we need to convert it to pixels
- if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
-
- // Remember the original values
- left = style.left;
- rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
-
- // Put in the new values to get a computed value out
- if ( rsLeft ) {
- elem.runtimeStyle.left = elem.currentStyle.left;
- }
- style.left = name === "fontSize" ? "1em" : ( ret || 0 );
- ret = style.pixelLeft + "px";
-
- // Revert the changed values
- style.left = left;
- if ( rsLeft ) {
- elem.runtimeStyle.left = rsLeft;
- }
- }
-
- return ret === "" ? "auto" : ret;
- };
-}
-
-curCSS = getComputedStyle || currentStyle;
-
-function getWH( elem, name, extra ) {
-
- // Start with offset property
- var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
- which = name === "width" ? cssWidth : cssHeight;
-
- if ( val > 0 ) {
- if ( extra !== "border" ) {
- jQuery.each( which, function() {
- if ( !extra ) {
- val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
- }
- if ( extra === "margin" ) {
- val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
- } else {
- val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
- }
- });
- }
-
- return val + "px";
- }
-
- // Fall back to computed then uncomputed css if necessary
- val = curCSS( elem, name, name );
- if ( val < 0 || val == null ) {
- val = elem.style[ name ] || 0;
- }
- // Normalize "", auto, and prepare for extra
- val = parseFloat( val ) || 0;
-
- // Add padding, border, margin
- if ( extra ) {
- jQuery.each( which, function() {
- val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
- if ( extra !== "padding" ) {
- val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
- }
- if ( extra === "margin" ) {
- val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
- }
- });
- }
-
- return val + "px";
-}
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.hidden = function( elem ) {
- var width = elem.offsetWidth,
- height = elem.offsetHeight;
-
- return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
- };
-
- jQuery.expr.filters.visible = function( elem ) {
- return !jQuery.expr.filters.hidden( elem );
- };
-}
-
-
-
-
-var r20 = /%20/g,
- rbracket = /\[\]$/,
- rCRLF = /\r?\n/g,
- rhash = /#.*$/,
- rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
- // #7653, #8125, #8152: local protocol detection
- rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
- rnoContent = /^(?:GET|HEAD)$/,
- rprotocol = /^\/\//,
- rquery = /\?/,
- rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
- rselectTextarea = /^(?:select|textarea)/i,
- rspacesAjax = /\s+/,
- rts = /([?&])_=[^&]*/,
- rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
-
- // Keep a copy of the old load method
- _load = jQuery.fn.load,
-
- /* Prefilters
- * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
- * 2) These are called:
- * - BEFORE asking for a transport
- * - AFTER param serialization (s.data is a string if s.processData is true)
- * 3) key is the dataType
- * 4) the catchall symbol "*" can be used
- * 5) execution will start with transport dataType and THEN continue down to "*" if needed
- */
- prefilters = {},
-
- /* Transports bindings
- * 1) key is the dataType
- * 2) the catchall symbol "*" can be used
- * 3) selection will start with transport dataType and THEN go to "*" if needed
- */
- transports = {},
-
- // Document location
- ajaxLocation,
-
- // Document location segments
- ajaxLocParts,
-
- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
- allTypes = ["*/"] + ["*"];
-
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-try {
- ajaxLocation = location.href;
-} catch( e ) {
- // Use the href attribute of an A element
- // since IE will modify it given document.location
- ajaxLocation = document.createElement( "a" );
- ajaxLocation.href = "";
- ajaxLocation = ajaxLocation.href;
-}
-
-// Segment location into parts
-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
-
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-function addToPrefiltersOrTransports( structure ) {
-
- // dataTypeExpression is optional and defaults to "*"
- return function( dataTypeExpression, func ) {
-
- if ( typeof dataTypeExpression !== "string" ) {
- func = dataTypeExpression;
- dataTypeExpression = "*";
- }
-
- if ( jQuery.isFunction( func ) ) {
- var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
- i = 0,
- length = dataTypes.length,
- dataType,
- list,
- placeBefore;
-
- // For each dataType in the dataTypeExpression
- for ( ; i < length; i++ ) {
- dataType = dataTypes[ i ];
- // We control if we're asked to add before
- // any existing element
- placeBefore = /^\+/.test( dataType );
- if ( placeBefore ) {
- dataType = dataType.substr( 1 ) || "*";
- }
- list = structure[ dataType ] = structure[ dataType ] || [];
- // then we add to the structure accordingly
- list[ placeBefore ? "unshift" : "push" ]( func );
- }
- }
- };
-}
-
-// Base inspection function for prefilters and transports
-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
- dataType /* internal */, inspected /* internal */ ) {
-
- dataType = dataType || options.dataTypes[ 0 ];
- inspected = inspected || {};
-
- inspected[ dataType ] = true;
-
- var list = structure[ dataType ],
- i = 0,
- length = list ? list.length : 0,
- executeOnly = ( structure === prefilters ),
- selection;
-
- for ( ; i < length && ( executeOnly || !selection ); i++ ) {
- selection = list[ i ]( options, originalOptions, jqXHR );
- // If we got redirected to another dataType
- // we try there if executing only and not done already
- if ( typeof selection === "string" ) {
- if ( !executeOnly || inspected[ selection ] ) {
- selection = undefined;
- } else {
- options.dataTypes.unshift( selection );
- selection = inspectPrefiltersOrTransports(
- structure, options, originalOptions, jqXHR, selection, inspected );
- }
- }
- }
- // If we're only executing or nothing was selected
- // we try the catchall dataType if not done already
- if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
- selection = inspectPrefiltersOrTransports(
- structure, options, originalOptions, jqXHR, "*", inspected );
- }
- // unnecessary when only executing (prefilters)
- // but it'll be ignored by the caller in that case
- return selection;
-}
-
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-function ajaxExtend( target, src ) {
- var key, deep,
- flatOptions = jQuery.ajaxSettings.flatOptions || {};
- for ( key in src ) {
- if ( src[ key ] !== undefined ) {
- ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
- }
- }
- if ( deep ) {
- jQuery.extend( true, target, deep );
- }
-}
-
-jQuery.fn.extend({
- load: function( url, params, callback ) {
- if ( typeof url !== "string" && _load ) {
- return _load.apply( this, arguments );
-
- // Don't do a request if no elements are being requested
- } else if ( !this.length ) {
- return this;
- }
-
- var off = url.indexOf( " " );
- if ( off >= 0 ) {
- var selector = url.slice( off, url.length );
- url = url.slice( 0, off );
- }
-
- // Default to a GET request
- var type = "GET";
-
- // If the second parameter was provided
- if ( params ) {
- // If it's a function
- if ( jQuery.isFunction( params ) ) {
- // We assume that it's the callback
- callback = params;
- params = undefined;
-
- // Otherwise, build a param string
- } else if ( typeof params === "object" ) {
- params = jQuery.param( params, jQuery.ajaxSettings.traditional );
- type = "POST";
- }
- }
-
- var self = this;
-
- // Request the remote document
- jQuery.ajax({
- url: url,
- type: type,
- dataType: "html",
- data: params,
- // Complete callback (responseText is used internally)
- complete: function( jqXHR, status, responseText ) {
- // Store the response as specified by the jqXHR object
- responseText = jqXHR.responseText;
- // If successful, inject the HTML into all the matched elements
- if ( jqXHR.isResolved() ) {
- // #4825: Get the actual response in case
- // a dataFilter is present in ajaxSettings
- jqXHR.done(function( r ) {
- responseText = r;
- });
- // See if a selector was specified
- self.html( selector ?
- // Create a dummy div to hold the results
- jQuery("<div>")
- // inject the contents of the document in, removing the scripts
- // to avoid any 'Permission Denied' errors in IE
- .append(responseText.replace(rscript, ""))
-
- // Locate the specified elements
- .find(selector) :
-
- // If not, just inject the full result
- responseText );
- }
-
- if ( callback ) {
- self.each( callback, [ responseText, status, jqXHR ] );
- }
- }
- });
-
- return this;
- },
-
- serialize: function() {
- return jQuery.param( this.serializeArray() );
- },
-
- serializeArray: function() {
- return this.map(function(){
- return this.elements ? jQuery.makeArray( this.elements ) : this;
- })
- .filter(function(){
- return this.name && !this.disabled &&
- ( this.checked || rselectTextarea.test( this.nodeName ) ||
- rinput.test( this.type ) );
- })
- .map(function( i, elem ){
- var val = jQuery( this ).val();
-
- return val == null ?
- null :
- jQuery.isArray( val ) ?
- jQuery.map( val, function( val, i ){
- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }) :
- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
- }).get();
- }
-});
-
-// Attach a bunch of functions for handling common AJAX events
-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
- jQuery.fn[ o ] = function( f ){
- return this.bind( o, f );
- };
-});
-
-jQuery.each( [ "get", "post" ], function( i, method ) {
- jQuery[ method ] = function( url, data, callback, type ) {
- // shift arguments if data argument was omitted
- if ( jQuery.isFunction( data ) ) {
- type = type || callback;
- callback = data;
- data = undefined;
- }
-
- return jQuery.ajax({
- type: method,
- url: url,
- data: data,
- success: callback,
- dataType: type
- });
- };
-});
-
-jQuery.extend({
-
- getScript: function( url, callback ) {
- return jQuery.get( url, undefined, callback, "script" );
- },
-
- getJSON: function( url, data, callback ) {
- return jQuery.get( url, data, callback, "json" );
- },
-
- // Creates a full fledged settings object into target
- // with both ajaxSettings and settings fields.
- // If target is omitted, writes into ajaxSettings.
- ajaxSetup: function( target, settings ) {
- if ( settings ) {
- // Building a settings object
- ajaxExtend( target, jQuery.ajaxSettings );
- } else {
- // Extending ajaxSettings
- settings = target;
- target = jQuery.ajaxSettings;
- }
- ajaxExtend( target, settings );
- return target;
- },
-
- ajaxSettings: {
- url: ajaxLocation,
- isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
- global: true,
- type: "GET",
- contentType: "application/x-www-form-urlencoded",
- processData: true,
- async: true,
- /*
- timeout: 0,
- data: null,
- dataType: null,
- username: null,
- password: null,
- cache: null,
- traditional: false,
- headers: {},
- */
-
- accepts: {
- xml: "application/xml, text/xml",
- html: "text/html",
- text: "text/plain",
- json: "application/json, text/javascript",
- "*": allTypes
- },
-
- contents: {
- xml: /xml/,
- html: /html/,
- json: /json/
- },
-
- responseFields: {
- xml: "responseXML",
- text: "responseText"
- },
-
- // List of data converters
- // 1) key format is "source_type destination_type" (a single space in-between)
- // 2) the catchall symbol "*" can be used for source_type
- converters: {
-
- // Convert anything to text
- "* text": window.String,
-
- // Text to html (true = no transformation)
- "text html": true,
-
- // Evaluate text as a json expression
- "text json": jQuery.parseJSON,
-
- // Parse text as xml
- "text xml": jQuery.parseXML
- },
-
- // For options that shouldn't be deep extended:
- // you can add your own custom options here if
- // and when you create one that shouldn't be
- // deep extended (see ajaxExtend)
- flatOptions: {
- context: true,
- url: true
- }
- },
-
- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
- ajaxTransport: addToPrefiltersOrTransports( transports ),
-
- // Main method
- ajax: function( url, options ) {
-
- // If url is an object, simulate pre-1.5 signature
- if ( typeof url === "object" ) {
- options = url;
- url = undefined;
- }
-
- // Force options to be an object
- options = options || {};
-
- var // Create the final options object
- s = jQuery.ajaxSetup( {}, options ),
- // Callbacks context
- callbackContext = s.context || s,
- // Context for global events
- // It's the callbackContext if one was provided in the options
- // and if it's a DOM node or a jQuery collection
- globalEventContext = callbackContext !== s &&
- ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
- jQuery( callbackContext ) : jQuery.event,
- // Deferreds
- deferred = jQuery.Deferred(),
- completeDeferred = jQuery.Callbacks( "once memory" ),
- // Status-dependent callbacks
- statusCode = s.statusCode || {},
- // ifModified key
- ifModifiedKey,
- // Headers (they are sent all at once)
- requestHeaders = {},
- requestHeadersNames = {},
- // Response headers
- responseHeadersString,
- responseHeaders,
- // transport
- transport,
- // timeout handle
- timeoutTimer,
- // Cross-domain detection vars
- parts,
- // The jqXHR state
- state = 0,
- // To know if global events are to be dispatched
- fireGlobals,
- // Loop variable
- i,
- // Fake xhr
- jqXHR = {
-
- readyState: 0,
-
- // Caches the header
- setRequestHeader: function( name, value ) {
- if ( !state ) {
- var lname = name.toLowerCase();
- name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
- requestHeaders[ name ] = value;
- }
- return this;
- },
-
- // Raw string
- getAllResponseHeaders: function() {
- return state === 2 ? responseHeadersString : null;
- },
-
- // Builds headers hashtable if needed
- getResponseHeader: function( key ) {
- var match;
- if ( state === 2 ) {
- if ( !responseHeaders ) {
- responseHeaders = {};
- while( ( match = rheaders.exec( responseHeadersString ) ) ) {
- responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
- }
- }
- match = responseHeaders[ key.toLowerCase() ];
- }
- return match === undefined ? null : match;
- },
-
- // Overrides response content-type header
- overrideMimeType: function( type ) {
- if ( !state ) {
- s.mimeType = type;
- }
- return this;
- },
-
- // Cancel the request
- abort: function( statusText ) {
- statusText = statusText || "abort";
- if ( transport ) {
- transport.abort( statusText );
- }
- done( 0, statusText );
- return this;
- }
- };
-
- // Callback for when everything is done
- // It is defined here because jslint complains if it is declared
- // at the end of the function (which would be more logical and readable)
- function done( status, nativeStatusText, responses, headers ) {
-
- // Called once
- if ( state === 2 ) {
- return;
- }
-
- // State is "done" now
- state = 2;
-
- // Clear timeout if it exists
- if ( timeoutTimer ) {
- clearTimeout( timeoutTimer );
- }
-
- // Dereference transport for early garbage collection
- // (no matter how long the jqXHR object will be used)
- transport = undefined;
-
- // Cache response headers
- responseHeadersString = headers || "";
-
- // Set readyState
- jqXHR.readyState = status > 0 ? 4 : 0;
-
- var isSuccess,
- success,
- error,
- statusText = nativeStatusText,
- response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
- lastModified,
- etag;
-
- // If successful, handle type chaining
- if ( status >= 200 && status < 300 || status === 304 ) {
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
-
- if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
- jQuery.lastModified[ ifModifiedKey ] = lastModified;
- }
- if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
- jQuery.etag[ ifModifiedKey ] = etag;
- }
- }
-
- // If not modified
- if ( status === 304 ) {
-
- statusText = "notmodified";
- isSuccess = true;
-
- // If we have data
- } else {
-
- try {
- success = ajaxConvert( s, response );
- statusText = "success";
- isSuccess = true;
- } catch(e) {
- // We have a parsererror
- statusText = "parsererror";
- error = e;
- }
- }
- } else {
- // We extract error from statusText
- // then normalize statusText and status for non-aborts
- error = statusText;
- if ( !statusText || status ) {
- statusText = "error";
- if ( status < 0 ) {
- status = 0;
- }
- }
- }
-
- // Set data for the fake xhr object
- jqXHR.status = status;
- jqXHR.statusText = "" + ( nativeStatusText || statusText );
-
- // Success/Error
- if ( isSuccess ) {
- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
- } else {
- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
- }
-
- // Status-dependent callbacks
- jqXHR.statusCode( statusCode );
- statusCode = undefined;
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
- [ jqXHR, s, isSuccess ? success : error ] );
- }
-
- // Complete
- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
-
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
- // Handle the global AJAX counter
- if ( !( --jQuery.active ) ) {
- jQuery.event.trigger( "ajaxStop" );
- }
- }
- }
-
- // Attach deferreds
- deferred.promise( jqXHR );
- jqXHR.success = jqXHR.done;
- jqXHR.error = jqXHR.fail;
- jqXHR.complete = completeDeferred.add;
-
- // Status-dependent callbacks
- jqXHR.statusCode = function( map ) {
- if ( map ) {
- var tmp;
- if ( state < 2 ) {
- for ( tmp in map ) {
- statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
- }
- } else {
- tmp = map[ jqXHR.status ];
- jqXHR.then( tmp, tmp );
- }
- }
- return this;
- };
-
- // Remove hash character (#7531: and string promotion)
- // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
- // We also use the url parameter if available
- s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
- // Extract dataTypes list
- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
-
- // Determine if a cross-domain request is in order
- if ( s.crossDomain == null ) {
- parts = rurl.exec( s.url.toLowerCase() );
- s.crossDomain = !!( parts &&
- ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
- ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
- ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
- );
- }
-
- // Convert data if not already a string
- if ( s.data && s.processData && typeof s.data !== "string" ) {
- s.data = jQuery.param( s.data, s.traditional );
- }
-
- // Apply prefilters
- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
- // If request was aborted inside a prefiler, stop there
- if ( state === 2 ) {
- return false;
- }
-
- // We can fire global events as of now if asked to
- fireGlobals = s.global;
-
- // Uppercase the type
- s.type = s.type.toUpperCase();
-
- // Determine if request has content
- s.hasContent = !rnoContent.test( s.type );
-
- // Watch for a new set of requests
- if ( fireGlobals && jQuery.active++ === 0 ) {
- jQuery.event.trigger( "ajaxStart" );
- }
-
- // More options handling for requests with no content
- if ( !s.hasContent ) {
-
- // If data is available, append data to url
- if ( s.data ) {
- s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
- // #9682: remove data so that it's not used in an eventual retry
- delete s.data;
- }
-
- // Get ifModifiedKey before adding the anti-cache parameter
- ifModifiedKey = s.url;
-
- // Add anti-cache in url if needed
- if ( s.cache === false ) {
-
- var ts = jQuery.now(),
- // try replacing _= if it is there
- ret = s.url.replace( rts, "$1_=" + ts );
-
- // if nothing was replaced, add timestamp to the end
- s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
- }
- }
-
- // Set the correct header, if data is being sent
- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
- jqXHR.setRequestHeader( "Content-Type", s.contentType );
- }
-
- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
- if ( s.ifModified ) {
- ifModifiedKey = ifModifiedKey || s.url;
- if ( jQuery.lastModified[ ifModifiedKey ] ) {
- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
- }
- if ( jQuery.etag[ ifModifiedKey ] ) {
- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
- }
- }
-
- // Set the Accepts header for the server, depending on the dataType
- jqXHR.setRequestHeader(
- "Accept",
- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
- s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
- s.accepts[ "*" ]
- );
-
- // Check for headers option
- for ( i in s.headers ) {
- jqXHR.setRequestHeader( i, s.headers[ i ] );
- }
-
- // Allow custom headers/mimetypes and early abort
- if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
- // Abort if not done already
- jqXHR.abort();
- return false;
-
- }
-
- // Install callbacks on deferreds
- for ( i in { success: 1, error: 1, complete: 1 } ) {
- jqXHR[ i ]( s[ i ] );
- }
-
- // Get transport
- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
-
- // If no transport, we auto-abort
- if ( !transport ) {
- done( -1, "No Transport" );
- } else {
- jqXHR.readyState = 1;
- // Send global event
- if ( fireGlobals ) {
- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
- }
- // Timeout
- if ( s.async && s.timeout > 0 ) {
- timeoutTimer = setTimeout( function(){
- jqXHR.abort( "timeout" );
- }, s.timeout );
- }
-
- try {
- state = 1;
- transport.send( requestHeaders, done );
- } catch (e) {
- // Propagate exception as error if not done
- if ( state < 2 ) {
- done( -1, e );
- // Simply rethrow otherwise
- } else {
- jQuery.error( e );
- }
- }
- }
-
- return jqXHR;
- },
-
- // Serialize an array of form elements or a set of
- // key/values into a query string
- param: function( a, traditional ) {
- var s = [],
- add = function( key, value ) {
- // If value is a function, invoke it and return its value
- value = jQuery.isFunction( value ) ? value() : value;
- s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
- };
-
- // Set traditional to true for jQuery <= 1.3.2 behavior.
- if ( traditional === undefined ) {
- traditional = jQuery.ajaxSettings.traditional;
- }
-
- // If an array was passed in, assume that it is an array of form elements.
- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
- // Serialize the form elements
- jQuery.each( a, function() {
- add( this.name, this.value );
- });
-
- } else {
- // If traditional, encode the "old" way (the way 1.3.2 or older
- // did it), otherwise encode params recursively.
- for ( var prefix in a ) {
- buildParams( prefix, a[ prefix ], traditional, add );
- }
- }
-
- // Return the resulting serialization
- return s.join( "&" ).replace( r20, "+" );
- }
-});
-
-function buildParams( prefix, obj, traditional, add ) {
- if ( jQuery.isArray( obj ) ) {
- // Serialize array item.
- jQuery.each( obj, function( i, v ) {
- if ( traditional || rbracket.test( prefix ) ) {
- // Treat each array item as a scalar.
- add( prefix, v );
-
- } else {
- // If array item is non-scalar (array or object), encode its
- // numeric index to resolve deserialization ambiguity issues.
- // Note that rack (as of 1.0.0) can't currently deserialize
- // nested arrays properly, and attempting to do so may cause
- // a server error. Possible fixes are to modify rack's
- // deserialization algorithm or to provide an option or flag
- // to force array serialization to be shallow.
- buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
- }
- });
-
- } else if ( !traditional && obj != null && typeof obj === "object" ) {
- // Serialize object item.
- for ( var name in obj ) {
- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
- }
-
- } else {
- // Serialize scalar item.
- add( prefix, obj );
- }
-}
-
-// This is still on the jQuery object... for now
-// Want to move this to jQuery.ajax some day
-jQuery.extend({
-
- // Counter for holding the number of active queries
- active: 0,
-
- // Last-Modified header cache for next request
- lastModified: {},
- etag: {}
-
-});
-
-/* Handles responses to an ajax request:
- * - sets all responseXXX fields accordingly
- * - finds the right dataType (mediates between content-type and expected dataType)
- * - returns the corresponding response
- */
-function ajaxHandleResponses( s, jqXHR, responses ) {
-
- var contents = s.contents,
- dataTypes = s.dataTypes,
- responseFields = s.responseFields,
- ct,
- type,
- finalDataType,
- firstDataType;
-
- // Fill responseXXX fields
- for ( type in responseFields ) {
- if ( type in responses ) {
- jqXHR[ responseFields[type] ] = responses[ type ];
- }
- }
-
- // Remove auto dataType and get content-type in the process
- while( dataTypes[ 0 ] === "*" ) {
- dataTypes.shift();
- if ( ct === undefined ) {
- ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
- }
- }
-
- // Check if we're dealing with a known content-type
- if ( ct ) {
- for ( type in contents ) {
- if ( contents[ type ] && contents[ type ].test( ct ) ) {
- dataTypes.unshift( type );
- break;
- }
- }
- }
-
- // Check to see if we have a response for the expected dataType
- if ( dataTypes[ 0 ] in responses ) {
- finalDataType = dataTypes[ 0 ];
- } else {
- // Try convertible dataTypes
- for ( type in responses ) {
- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
- finalDataType = type;
- break;
- }
- if ( !firstDataType ) {
- firstDataType = type;
- }
- }
- // Or just use first one
- finalDataType = finalDataType || firstDataType;
- }
-
- // If we found a dataType
- // We add the dataType to the list if needed
- // and return the corresponding response
- if ( finalDataType ) {
- if ( finalDataType !== dataTypes[ 0 ] ) {
- dataTypes.unshift( finalDataType );
- }
- return responses[ finalDataType ];
- }
-}
-
-// Chain conversions given the request and the original response
-function ajaxConvert( s, response ) {
-
- // Apply the dataFilter if provided
- if ( s.dataFilter ) {
- response = s.dataFilter( response, s.dataType );
- }
-
- var dataTypes = s.dataTypes,
- converters = {},
- i,
- key,
- length = dataTypes.length,
- tmp,
- // Current and previous dataTypes
- current = dataTypes[ 0 ],
- prev,
- // Conversion expression
- conversion,
- // Conversion function
- conv,
- // Conversion functions (transitive conversion)
- conv1,
- conv2;
-
- // For each dataType in the chain
- for ( i = 1; i < length; i++ ) {
-
- // Create converters map
- // with lowercased keys
- if ( i === 1 ) {
- for ( key in s.converters ) {
- if ( typeof key === "string" ) {
- converters[ key.toLowerCase() ] = s.converters[ key ];
- }
- }
- }
-
- // Get the dataTypes
- prev = current;
- current = dataTypes[ i ];
-
- // If current is auto dataType, update it to prev
- if ( current === "*" ) {
- current = prev;
- // If no auto and dataTypes are actually different
- } else if ( prev !== "*" && prev !== current ) {
-
- // Get the converter
- conversion = prev + " " + current;
- conv = converters[ conversion ] || converters[ "* " + current ];
-
- // If there is no direct converter, search transitively
- if ( !conv ) {
- conv2 = undefined;
- for ( conv1 in converters ) {
- tmp = conv1.split( " " );
- if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
- conv2 = converters[ tmp[1] + " " + current ];
- if ( conv2 ) {
- conv1 = converters[ conv1 ];
- if ( conv1 === true ) {
- conv = conv2;
- } else if ( conv2 === true ) {
- conv = conv1;
- }
- break;
- }
- }
- }
- }
- // If we found no converter, dispatch an error
- if ( !( conv || conv2 ) ) {
- jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
- }
- // If found converter is not an equivalence
- if ( conv !== true ) {
- // Convert with 1 or 2 converters accordingly
- response = conv ? conv( response ) : conv2( conv1(response) );
- }
- }
- }
- return response;
-}
-
-
-
-
-var jsc = jQuery.now(),
- jsre = /(\=)\?(&|$)|\?\?/i;
-
-// Default jsonp settings
-jQuery.ajaxSetup({
- jsonp: "callback",
- jsonpCallback: function() {
- return jQuery.expando + "_" + ( jsc++ );
- }
-});
-
-// Detect, normalize options and install callbacks for jsonp requests
-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
- var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
- ( typeof s.data === "string" );
-
- if ( s.dataTypes[ 0 ] === "jsonp" ||
- s.jsonp !== false && ( jsre.test( s.url ) ||
- inspectData && jsre.test( s.data ) ) ) {
-
- var responseContainer,
- jsonpCallback = s.jsonpCallback =
- jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
- previous = window[ jsonpCallback ],
- url = s.url,
- data = s.data,
- replace = "$1" + jsonpCallback + "$2";
-
- if ( s.jsonp !== false ) {
- url = url.replace( jsre, replace );
- if ( s.url === url ) {
- if ( inspectData ) {
- data = data.replace( jsre, replace );
- }
- if ( s.data === data ) {
- // Add callback manually
- url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
- }
- }
- }
-
- s.url = url;
- s.data = data;
-
- // Install callback
- window[ jsonpCallback ] = function( response ) {
- responseContainer = [ response ];
- };
-
- // Clean-up function
- jqXHR.always(function() {
- // Set callback back to previous value
- window[ jsonpCallback ] = previous;
- // Call if it was a function and we have a response
- if ( responseContainer && jQuery.isFunction( previous ) ) {
- window[ jsonpCallback ]( responseContainer[ 0 ] );
- }
- });
-
- // Use data converter to retrieve json after script execution
- s.converters["script json"] = function() {
- if ( !responseContainer ) {
- jQuery.error( jsonpCallback + " was not called" );
- }
- return responseContainer[ 0 ];
- };
-
- // force json dataType
- s.dataTypes[ 0 ] = "json";
-
- // Delegate to script
- return "script";
- }
-});
-
-
-
-
-// Install script dataType
-jQuery.ajaxSetup({
- accepts: {
- script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
- },
- contents: {
- script: /javascript|ecmascript/
- },
- converters: {
- "text script": function( text ) {
- jQuery.globalEval( text );
- return text;
- }
- }
-});
-
-// Handle cache's special case and global
-jQuery.ajaxPrefilter( "script", function( s ) {
- if ( s.cache === undefined ) {
- s.cache = false;
- }
- if ( s.crossDomain ) {
- s.type = "GET";
- s.global = false;
- }
-});
-
-// Bind script tag hack transport
-jQuery.ajaxTransport( "script", function(s) {
-
- // This transport only deals with cross domain requests
- if ( s.crossDomain ) {
-
- var script,
- head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
-
- return {
-
- send: function( _, callback ) {
-
- script = document.createElement( "script" );
-
- script.async = "async";
-
- if ( s.scriptCharset ) {
- script.charset = s.scriptCharset;
- }
-
- script.src = s.url;
-
- // Attach handlers for all browsers
- script.onload = script.onreadystatechange = function( _, isAbort ) {
-
- if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
- // Handle memory leak in IE
- script.onload = script.onreadystatechange = null;
-
- // Remove the script
- if ( head && script.parentNode ) {
- head.removeChild( script );
- }
-
- // Dereference the script
- script = undefined;
-
- // Callback if not abort
- if ( !isAbort ) {
- callback( 200, "success" );
- }
- }
- };
- // Use insertBefore instead of appendChild to circumvent an IE6 bug.
- // This arises when a base node is used (#2709 and #4378).
- head.insertBefore( script, head.firstChild );
- },
-
- abort: function() {
- if ( script ) {
- script.onload( 0, 1 );
- }
- }
- };
- }
-});
-
-
-
-
-var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
- xhrOnUnloadAbort = window.ActiveXObject ? function() {
- // Abort all pending requests
- for ( var key in xhrCallbacks ) {
- xhrCallbacks[ key ]( 0, 1 );
- }
- } : false,
- xhrId = 0,
- xhrCallbacks;
-
-// Functions to create xhrs
-function createStandardXHR() {
- try {
- return new window.XMLHttpRequest();
- } catch( e ) {}
-}
-
-function createActiveXHR() {
- try {
- return new window.ActiveXObject( "Microsoft.XMLHTTP" );
- } catch( e ) {}
-}
-
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-jQuery.ajaxSettings.xhr = window.ActiveXObject ?
- /* Microsoft failed to properly
- * implement the XMLHttpRequest in IE7 (can't request local files),
- * so we use the ActiveXObject when it is available
- * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
- * we need a fallback.
- */
- function() {
- return !this.isLocal && createStandardXHR() || createActiveXHR();
- } :
- // For all other browsers, use the standard XMLHttpRequest object
- createStandardXHR;
-
-// Determine support properties
-(function( xhr ) {
- jQuery.extend( jQuery.support, {
- ajax: !!xhr,
- cors: !!xhr && ( "withCredentials" in xhr )
- });
-})( jQuery.ajaxSettings.xhr() );
-
-// Create transport if the browser can provide an xhr
-if ( jQuery.support.ajax ) {
-
- jQuery.ajaxTransport(function( s ) {
- // Cross domain only allowed if supported through XMLHttpRequest
- if ( !s.crossDomain || jQuery.support.cors ) {
-
- var callback;
-
- return {
- send: function( headers, complete ) {
-
- // Get a new xhr
- var xhr = s.xhr(),
- handle,
- i;
-
- // Open the socket
- // Passing null username, generates a login popup on Opera (#2865)
- if ( s.username ) {
- xhr.open( s.type, s.url, s.async, s.username, s.password );
- } else {
- xhr.open( s.type, s.url, s.async );
- }
-
- // Apply custom fields if provided
- if ( s.xhrFields ) {
- for ( i in s.xhrFields ) {
- xhr[ i ] = s.xhrFields[ i ];
- }
- }
-
- // Override mime type if needed
- if ( s.mimeType && xhr.overrideMimeType ) {
- xhr.overrideMimeType( s.mimeType );
- }
-
- // X-Requested-With header
- // For cross-domain requests, seeing as conditions for a preflight are
- // akin to a jigsaw puzzle, we simply never set it to be sure.
- // (it can always be set on a per-request basis or even using ajaxSetup)
- // For same-domain requests, won't change header if already provided.
- if ( !s.crossDomain && !headers["X-Requested-With"] ) {
- headers[ "X-Requested-With" ] = "XMLHttpRequest";
- }
-
- // Need an extra try/catch for cross domain requests in Firefox 3
- try {
- for ( i in headers ) {
- xhr.setRequestHeader( i, headers[ i ] );
- }
- } catch( _ ) {}
-
- // Do send the request
- // This may raise an exception which is actually
- // handled in jQuery.ajax (so no try/catch here)
- xhr.send( ( s.hasContent && s.data ) || null );
-
- // Listener
- callback = function( _, isAbort ) {
-
- var status,
- statusText,
- responseHeaders,
- responses,
- xml;
-
- // Firefox throws exceptions when accessing properties
- // of an xhr when a network error occured
- // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
- try {
-
- // Was never called and is aborted or complete
- if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
- // Only called once
- callback = undefined;
-
- // Do not keep as active anymore
- if ( handle ) {
- xhr.onreadystatechange = jQuery.noop;
- if ( xhrOnUnloadAbort ) {
- delete xhrCallbacks[ handle ];
- }
- }
-
- // If it's an abort
- if ( isAbort ) {
- // Abort it manually if needed
- if ( xhr.readyState !== 4 ) {
- xhr.abort();
- }
- } else {
- status = xhr.status;
- responseHeaders = xhr.getAllResponseHeaders();
- responses = {};
- xml = xhr.responseXML;
-
- // Construct response list
- if ( xml && xml.documentElement /* #4958 */ ) {
- responses.xml = xml;
- }
- responses.text = xhr.responseText;
-
- // Firefox throws an exception when accessing
- // statusText for faulty cross-domain requests
- try {
- statusText = xhr.statusText;
- } catch( e ) {
- // We normalize with Webkit giving an empty statusText
- statusText = "";
- }
-
- // Filter status for non standard behaviors
-
- // If the request is local and we have data: assume a success
- // (success with no data won't get notified, that's the best we
- // can do given current implementations)
- if ( !status && s.isLocal && !s.crossDomain ) {
- status = responses.text ? 200 : 404;
- // IE - #1450: sometimes returns 1223 when it should be 204
- } else if ( status === 1223 ) {
- status = 204;
- }
- }
- }
- } catch( firefoxAccessException ) {
- if ( !isAbort ) {
- complete( -1, firefoxAccessException );
- }
- }
-
- // Call complete if needed
- if ( responses ) {
- complete( status, statusText, responses, responseHeaders );
- }
- };
-
- // if we're in sync mode or it's in cache
- // and has been retrieved directly (IE6 & IE7)
- // we need to manually fire the callback
- if ( !s.async || xhr.readyState === 4 ) {
- callback();
- } else {
- handle = ++xhrId;
- if ( xhrOnUnloadAbort ) {
- // Create the active xhrs callbacks list if needed
- // and attach the unload handler
- if ( !xhrCallbacks ) {
- xhrCallbacks = {};
- jQuery( window ).unload( xhrOnUnloadAbort );
- }
- // Add to list of active xhrs callbacks
- xhrCallbacks[ handle ] = callback;
- }
- xhr.onreadystatechange = callback;
- }
- },
-
- abort: function() {
- if ( callback ) {
- callback(0,1);
- }
- }
- };
- }
- });
-}
-
-
-
-
-var elemdisplay = {},
- iframe, iframeDoc,
- rfxtypes = /^(?:toggle|show|hide)$/,
- rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
- timerId,
- fxAttrs = [
- // height animations
- [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
- // width animations
- [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
- // opacity animations
- [ "opacity" ]
- ],
- fxNow;
-
-jQuery.fn.extend({
- show: function( speed, easing, callback ) {
- var elem, display;
-
- if ( speed || speed === 0 ) {
- return this.animate( genFx("show", 3), speed, easing, callback );
-
- } else {
- for ( var i = 0, j = this.length; i < j; i++ ) {
- elem = this[ i ];
-
- if ( elem.style ) {
- display = elem.style.display;
-
- // Reset the inline display of this element to learn if it is
- // being hidden by cascaded rules or not
- if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
- display = elem.style.display = "";
- }
-
- // Set elements which have been overridden with display: none
- // in a stylesheet to whatever the default browser style is
- // for such an element
- if ( display === "" && jQuery.css(elem, "display") === "none" ) {
- jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
- }
- }
- }
-
- // Set the display of most of the elements in a second loop
- // to avoid the constant reflow
- for ( i = 0; i < j; i++ ) {
- elem = this[ i ];
-
- if ( elem.style ) {
- display = elem.style.display;
-
- if ( display === "" || display === "none" ) {
- elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
- }
- }
- }
-
- return this;
- }
- },
-
- hide: function( speed, easing, callback ) {
- if ( speed || speed === 0 ) {
- return this.animate( genFx("hide", 3), speed, easing, callback);
-
- } else {
- var elem, display,
- i = 0,
- j = this.length;
-
- for ( ; i < j; i++ ) {
- elem = this[i];
- if ( elem.style ) {
- display = jQuery.css( elem, "display" );
-
- if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
- jQuery._data( elem, "olddisplay", display );
- }
- }
- }
-
- // Set the display of the elements in a second loop
- // to avoid the constant reflow
- for ( i = 0; i < j; i++ ) {
- if ( this[i].style ) {
- this[i].style.display = "none";
- }
- }
-
- return this;
- }
- },
-
- // Save the old toggle function
- _toggle: jQuery.fn.toggle,
-
- toggle: function( fn, fn2, callback ) {
- var bool = typeof fn === "boolean";
-
- if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
- this._toggle.apply( this, arguments );
-
- } else if ( fn == null || bool ) {
- this.each(function() {
- var state = bool ? fn : jQuery(this).is(":hidden");
- jQuery(this)[ state ? "show" : "hide" ]();
- });
-
- } else {
- this.animate(genFx("toggle", 3), fn, fn2, callback);
- }
-
- return this;
- },
-
- fadeTo: function( speed, to, easing, callback ) {
- return this.filter(":hidden").css("opacity", 0).show().end()
- .animate({opacity: to}, speed, easing, callback);
- },
-
- animate: function( prop, speed, easing, callback ) {
- var optall = jQuery.speed( speed, easing, callback );
-
- if ( jQuery.isEmptyObject( prop ) ) {
- return this.each( optall.complete, [ false ] );
- }
-
- // Do not change referenced properties as per-property easing will be lost
- prop = jQuery.extend( {}, prop );
-
- function doAnimation() {
- // XXX 'this' does not always have a nodeName when running the
- // test suite
-
- if ( optall.queue === false ) {
- jQuery._mark( this );
- }
-
- var opt = jQuery.extend( {}, optall ),
- isElement = this.nodeType === 1,
- hidden = isElement && jQuery(this).is(":hidden"),
- name, val, p, e,
- parts, start, end, unit,
- method;
-
- // will store per property easing and be used to determine when an animation is complete
- opt.animatedProperties = {};
-
- for ( p in prop ) {
-
- // property name normalization
- name = jQuery.camelCase( p );
- if ( p !== name ) {
- prop[ name ] = prop[ p ];
- delete prop[ p ];
- }
-
- val = prop[ name ];
-
- // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
- if ( jQuery.isArray( val ) ) {
- opt.animatedProperties[ name ] = val[ 1 ];
- val = prop[ name ] = val[ 0 ];
- } else {
- opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
- }
-
- if ( val === "hide" && hidden || val === "show" && !hidden ) {
- return opt.complete.call( this );
- }
-
- if ( isElement && ( name === "height" || name === "width" ) ) {
- // Make sure that nothing sneaks out
- // Record all 3 overflow attributes because IE does not
- // change the overflow attribute when overflowX and
- // overflowY are set to the same value
- opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
-
- // Set display property to inline-block for height/width
- // animations on inline elements that are having width/height animated
- if ( jQuery.css( this, "display" ) === "inline" &&
- jQuery.css( this, "float" ) === "none" ) {
-
- // inline-level elements accept inline-block;
- // block-level elements need to be inline with layout
- if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
- this.style.display = "inline-block";
-
- } else {
- this.style.zoom = 1;
- }
- }
- }
- }
-
- if ( opt.overflow != null ) {
- this.style.overflow = "hidden";
- }
-
- for ( p in prop ) {
- e = new jQuery.fx( this, opt, p );
- val = prop[ p ];
-
- if ( rfxtypes.test( val ) ) {
-
- // Tracks whether to show or hide based on private
- // data attached to the element
- method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
- if ( method ) {
- jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
- e[ method ]();
- } else {
- e[ val ]();
- }
-
- } else {
- parts = rfxnum.exec( val );
- start = e.cur();
-
- if ( parts ) {
- end = parseFloat( parts[2] );
- unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
-
- // We need to compute starting value
- if ( unit !== "px" ) {
- jQuery.style( this, p, (end || 1) + unit);
- start = ( (end || 1) / e.cur() ) * start;
- jQuery.style( this, p, start + unit);
- }
-
- // If a +=/-= token was provided, we're doing a relative animation
- if ( parts[1] ) {
- end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
- }
-
- e.custom( start, end, unit );
-
- } else {
- e.custom( start, val, "" );
- }
- }
- }
-
- // For JS strict compliance
- return true;
- }
-
- return optall.queue === false ?
- this.each( doAnimation ) :
- this.queue( optall.queue, doAnimation );
- },
-
- stop: function( type, clearQueue, gotoEnd ) {
- if ( typeof type !== "string" ) {
- gotoEnd = clearQueue;
- clearQueue = type;
- type = undefined;
- }
- if ( clearQueue && type !== false ) {
- this.queue( type || "fx", [] );
- }
-
- return this.each(function() {
- var i,
- hadTimers = false,
- timers = jQuery.timers,
- data = jQuery._data( this );
-
- // clear marker counters if we know they won't be
- if ( !gotoEnd ) {
- jQuery._unmark( true, this );
- }
-
- function stopQueue( elem, data, i ) {
- var hooks = data[ i ];
- jQuery.removeData( elem, i, true );
- hooks.stop( gotoEnd );
- }
-
- if ( type == null ) {
- for ( i in data ) {
- if ( data[ i ].stop && i.indexOf(".run") === i.length - 4 ) {
- stopQueue( this, data, i );
- }
- }
- } else if ( data[ i = type + ".run" ] && data[ i ].stop ){
- stopQueue( this, data, i );
- }
-
- for ( i = timers.length; i--; ) {
- if ( timers[ i ].elem === this && (type == null || timers[ i ].queue === type) ) {
- if ( gotoEnd ) {
-
- // force the next step to be the last
- timers[ i ]( true );
- } else {
- timers[ i ].saveState();
- }
- hadTimers = true;
- timers.splice( i, 1 );
- }
- }
-
- // start the next in the queue if the last step wasn't forced
- // timers currently will call their complete callbacks, which will dequeue
- // but only if they were gotoEnd
- if ( !( gotoEnd && hadTimers ) ) {
- jQuery.dequeue( this, type );
- }
- });
- }
-
-});
-
-// Animations created synchronously will run synchronously
-function createFxNow() {
- setTimeout( clearFxNow, 0 );
- return ( fxNow = jQuery.now() );
-}
-
-function clearFxNow() {
- fxNow = undefined;
-}
-
-// Generate parameters to create a standard animation
-function genFx( type, num ) {
- var obj = {};
-
- jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
- obj[ this ] = type;
- });
-
- return obj;
-}
-
-// Generate shortcuts for custom animations
-jQuery.each({
- slideDown: genFx( "show", 1 ),
- slideUp: genFx( "hide", 1 ),
- slideToggle: genFx( "toggle", 1 ),
- fadeIn: { opacity: "show" },
- fadeOut: { opacity: "hide" },
- fadeToggle: { opacity: "toggle" }
-}, function( name, props ) {
- jQuery.fn[ name ] = function( speed, easing, callback ) {
- return this.animate( props, speed, easing, callback );
- };
-});
-
-jQuery.extend({
- speed: function( speed, easing, fn ) {
- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
- complete: fn || !fn && easing ||
- jQuery.isFunction( speed ) && speed,
- duration: speed,
- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
- };
-
- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
- opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
-
- // normalize opt.queue - true/undefined/null -> "fx"
- if ( opt.queue == null || opt.queue === true ) {
- opt.queue = "fx";
- }
-
- // Queueing
- opt.old = opt.complete;
-
- opt.complete = function( noUnmark ) {
- if ( jQuery.isFunction( opt.old ) ) {
- opt.old.call( this );
- }
-
- if ( opt.queue ) {
- jQuery.dequeue( this, opt.queue );
- } else if ( noUnmark !== false ) {
- jQuery._unmark( this );
- }
- };
-
- return opt;
- },
-
- easing: {
- linear: function( p, n, firstNum, diff ) {
- return firstNum + diff * p;
- },
- swing: function( p, n, firstNum, diff ) {
- return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
- }
- },
-
- timers: [],
-
- fx: function( elem, options, prop ) {
- this.options = options;
- this.elem = elem;
- this.prop = prop;
-
- options.orig = options.orig || {};
- }
-
-});
-
-jQuery.fx.prototype = {
- // Simple function for setting a style value
- update: function() {
- if ( this.options.step ) {
- this.options.step.call( this.elem, this.now, this );
- }
-
- ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
- },
-
- // Get the current size
- cur: function() {
- if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
- return this.elem[ this.prop ];
- }
-
- var parsed,
- r = jQuery.css( this.elem, this.prop );
- // Empty strings, null, undefined and "auto" are converted to 0,
- // complex values such as "rotate(1rad)" are returned as is,
- // simple values such as "10px" are parsed to Float.
- return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
- },
-
- // Start an animation from one number to another
- custom: function( from, to, unit ) {
- var self = this,
- fx = jQuery.fx;
-
- this.startTime = fxNow || createFxNow();
- this.end = to;
- this.now = this.start = from;
- this.pos = this.state = 0;
- this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
-
- function t( gotoEnd ) {
- return self.step( gotoEnd );
- }
-
- t.queue = this.options.queue;
- t.elem = this.elem;
- t.saveState = function() {
- if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
- jQuery._data( self.elem, "fxshow" + self.prop, self.start );
- }
- };
-
- if ( t() && jQuery.timers.push(t) && !timerId ) {
- timerId = setInterval( fx.tick, fx.interval );
- }
- },
-
- // Simple 'show' function
- show: function() {
- var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
-
- // Remember where we started, so that we can go back to it later
- this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
- this.options.show = true;
-
- // Begin the animation
- // Make sure that we start at a small width/height to avoid any flash of content
- if ( dataShow !== undefined ) {
- // This show is picking up where a previous hide or show left off
- this.custom( this.cur(), dataShow );
- } else {
- this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
- }
-
- // Start by showing the element
- jQuery( this.elem ).show();
- },
-
- // Simple 'hide' function
- hide: function() {
- // Remember where we started, so that we can go back to it later
- this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
- this.options.hide = true;
-
- // Begin the animation
- this.custom( this.cur(), 0 );
- },
-
- // Each step of an animation
- step: function( gotoEnd ) {
- var p, n, complete,
- t = fxNow || createFxNow(),
- done = true,
- elem = this.elem,
- options = this.options;
-
- if ( gotoEnd || t >= options.duration + this.startTime ) {
- this.now = this.end;
- this.pos = this.state = 1;
- this.update();
-
- options.animatedProperties[ this.prop ] = true;
-
- for ( p in options.animatedProperties ) {
- if ( options.animatedProperties[ p ] !== true ) {
- done = false;
- }
- }
-
- if ( done ) {
- // Reset the overflow
- if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
-
- jQuery.each( [ "", "X", "Y" ], function( index, value ) {
- elem.style[ "overflow" + value ] = options.overflow[ index ];
- });
- }
-
- // Hide the element if the "hide" operation was done
- if ( options.hide ) {
- jQuery( elem ).hide();
- }
-
- // Reset the properties, if the item has been hidden or shown
- if ( options.hide || options.show ) {
- for ( p in options.animatedProperties ) {
- jQuery.style( elem, p, options.orig[ p ] );
- jQuery.removeData( elem, "fxshow" + p, true );
- // Toggle data is no longer needed
- jQuery.removeData( elem, "toggle" + p, true );
- }
- }
-
- // Execute the complete function
- // in the event that the complete function throws an exception
- // we must ensure it won't be called twice. #5684
-
- complete = options.complete;
- if ( complete ) {
-
- options.complete = false;
- complete.call( elem );
- }
- }
-
- return false;
-
- } else {
- // classical easing cannot be used with an Infinity duration
- if ( options.duration == Infinity ) {
- this.now = t;
- } else {
- n = t - this.startTime;
- this.state = n / options.duration;
-
- // Perform the easing function, defaults to swing
- this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
- this.now = this.start + ( (this.end - this.start) * this.pos );
- }
- // Perform the next step of the animation
- this.update();
- }
-
- return true;
- }
-};
-
-jQuery.extend( jQuery.fx, {
- tick: function() {
- var timer,
- timers = jQuery.timers,
- i = 0;
-
- for ( ; i < timers.length; i++ ) {
- timer = timers[ i ];
- // Checks the timer has not already been removed
- if ( !timer() && timers[ i ] === timer ) {
- timers.splice( i--, 1 );
- }
- }
-
- if ( !timers.length ) {
- jQuery.fx.stop();
- }
- },
-
- interval: 13,
-
- stop: function() {
- clearInterval( timerId );
- timerId = null;
- },
-
- speeds: {
- slow: 600,
- fast: 200,
- // Default speed
- _default: 400
- },
-
- step: {
- opacity: function( fx ) {
- jQuery.style( fx.elem, "opacity", fx.now );
- },
-
- _default: function( fx ) {
- if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
- fx.elem.style[ fx.prop ] = fx.now + fx.unit;
- } else {
- fx.elem[ fx.prop ] = fx.now;
- }
- }
- }
-});
-
-// Adds width/height step functions
-// Do not set anything below 0
-jQuery.each([ "width", "height" ], function( i, prop ) {
- jQuery.fx.step[ prop ] = function( fx ) {
- jQuery.style( fx.elem, prop, Math.max(0, fx.now) );
- };
-});
-
-if ( jQuery.expr && jQuery.expr.filters ) {
- jQuery.expr.filters.animated = function( elem ) {
- return jQuery.grep(jQuery.timers, function( fn ) {
- return elem === fn.elem;
- }).length;
- };
-}
-
-// Try to restore the default display value of an element
-function defaultDisplay( nodeName ) {
-
- if ( !elemdisplay[ nodeName ] ) {
-
- var body = document.body,
- elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
- display = elem.css( "display" );
- elem.remove();
-
- // If the simple way fails,
- // get element's real default display by attaching it to a temp iframe
- if ( display === "none" || display === "" ) {
- // No iframe to use yet, so create it
- if ( !iframe ) {
- iframe = document.createElement( "iframe" );
- iframe.frameBorder = iframe.width = iframe.height = 0;
- }
-
- body.appendChild( iframe );
-
- // Create a cacheable copy of the iframe document on first call.
- // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
- // document to it; WebKit & Firefox won't allow reusing the iframe document.
- if ( !iframeDoc || !iframe.createElement ) {
- iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
- iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
- iframeDoc.close();
- }
-
- elem = iframeDoc.createElement( nodeName );
-
- iframeDoc.body.appendChild( elem );
-
- display = jQuery.css( elem, "display" );
- body.removeChild( iframe );
- }
-
- // Store the correct default display
- elemdisplay[ nodeName ] = display;
- }
-
- return elemdisplay[ nodeName ];
-}
-
-
-
-
-var rtable = /^t(?:able|d|h)$/i,
- rroot = /^(?:body|html)$/i;
-
-if ( "getBoundingClientRect" in document.documentElement ) {
- jQuery.fn.offset = function( options ) {
- var elem = this[0], box;
-
- if ( options ) {
- return this.each(function( i ) {
- jQuery.offset.setOffset( this, options, i );
- });
- }
-
- if ( !elem || !elem.ownerDocument ) {
- return null;
- }
-
- if ( elem === elem.ownerDocument.body ) {
- return jQuery.offset.bodyOffset( elem );
- }
-
- try {
- box = elem.getBoundingClientRect();
- } catch(e) {}
-
- var doc = elem.ownerDocument,
- docElem = doc.documentElement;
-
- // Make sure we're not dealing with a disconnected DOM node
- if ( !box || !jQuery.contains( docElem, elem ) ) {
- return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
- }
-
- var body = doc.body,
- win = getWindow(doc),
- clientTop = docElem.clientTop || body.clientTop || 0,
- clientLeft = docElem.clientLeft || body.clientLeft || 0,
- scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
- scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
- top = box.top + scrollTop - clientTop,
- left = box.left + scrollLeft - clientLeft;
-
- return { top: top, left: left };
- };
-
-} else {
- jQuery.fn.offset = function( options ) {
- var elem = this[0];
-
- if ( options ) {
- return this.each(function( i ) {
- jQuery.offset.setOffset( this, options, i );
- });
- }
-
- if ( !elem || !elem.ownerDocument ) {
- return null;
- }
-
- if ( elem === elem.ownerDocument.body ) {
- return jQuery.offset.bodyOffset( elem );
- }
-
- var computedStyle,
- offsetParent = elem.offsetParent,
- prevOffsetParent = elem,
- doc = elem.ownerDocument,
- docElem = doc.documentElement,
- body = doc.body,
- defaultView = doc.defaultView,
- prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
- top = elem.offsetTop,
- left = elem.offsetLeft;
-
- while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
- if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
- break;
- }
-
- computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
- top -= elem.scrollTop;
- left -= elem.scrollLeft;
-
- if ( elem === offsetParent ) {
- top += elem.offsetTop;
- left += elem.offsetLeft;
-
- if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
- top += parseFloat( computedStyle.borderTopWidth ) || 0;
- left += parseFloat( computedStyle.borderLeftWidth ) || 0;
- }
-
- prevOffsetParent = offsetParent;
- offsetParent = elem.offsetParent;
- }
-
- if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
- top += parseFloat( computedStyle.borderTopWidth ) || 0;
- left += parseFloat( computedStyle.borderLeftWidth ) || 0;
- }
-
- prevComputedStyle = computedStyle;
- }
-
- if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
- top += body.offsetTop;
- left += body.offsetLeft;
- }
-
- if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
- top += Math.max( docElem.scrollTop, body.scrollTop );
- left += Math.max( docElem.scrollLeft, body.scrollLeft );
- }
-
- return { top: top, left: left };
- };
-}
-
-jQuery.offset = {
-
- bodyOffset: function( body ) {
- var top = body.offsetTop,
- left = body.offsetLeft;
-
- if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
- top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
- left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
- }
-
- return { top: top, left: left };
- },
-
- setOffset: function( elem, options, i ) {
- var position = jQuery.css( elem, "position" );
-
- // set position first, in-case top/left are set even on static elem
- if ( position === "static" ) {
- elem.style.position = "relative";
- }
-
- var curElem = jQuery( elem ),
- curOffset = curElem.offset(),
- curCSSTop = jQuery.css( elem, "top" ),
- curCSSLeft = jQuery.css( elem, "left" ),
- calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
- props = {}, curPosition = {}, curTop, curLeft;
-
- // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
- if ( calculatePosition ) {
- curPosition = curElem.position();
- curTop = curPosition.top;
- curLeft = curPosition.left;
- } else {
- curTop = parseFloat( curCSSTop ) || 0;
- curLeft = parseFloat( curCSSLeft ) || 0;
- }
-
- if ( jQuery.isFunction( options ) ) {
- options = options.call( elem, i, curOffset );
- }
-
- if ( options.top != null ) {
- props.top = ( options.top - curOffset.top ) + curTop;
- }
- if ( options.left != null ) {
- props.left = ( options.left - curOffset.left ) + curLeft;
- }
-
- if ( "using" in options ) {
- options.using.call( elem, props );
- } else {
- curElem.css( props );
- }
- }
-};
-
-
-jQuery.fn.extend({
-
- position: function() {
- if ( !this[0] ) {
- return null;
- }
-
- var elem = this[0],
-
- // Get *real* offsetParent
- offsetParent = this.offsetParent(),
-
- // Get correct offsets
- offset = this.offset(),
- parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
-
- // Subtract element margins
- // note: when an element has margin: auto the offsetLeft and marginLeft
- // are the same in Safari causing offset.left to incorrectly be 0
- offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
- offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
-
- // Add offsetParent borders
- parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
- parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
-
- // Subtract the two offsets
- return {
- top: offset.top - parentOffset.top,
- left: offset.left - parentOffset.left
- };
- },
-
- offsetParent: function() {
- return this.map(function() {
- var offsetParent = this.offsetParent || document.body;
- while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
- offsetParent = offsetParent.offsetParent;
- }
- return offsetParent;
- });
- }
-});
-
-
-// Create scrollLeft and scrollTop methods
-jQuery.each( ["Left", "Top"], function( i, name ) {
- var method = "scroll" + name;
-
- jQuery.fn[ method ] = function( val ) {
- var elem, win;
-
- if ( val === undefined ) {
- elem = this[ 0 ];
-
- if ( !elem ) {
- return null;
- }
-
- win = getWindow( elem );
-
- // Return the scroll offset
- return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
- jQuery.support.boxModel && win.document.documentElement[ method ] ||
- win.document.body[ method ] :
- elem[ method ];
- }
-
- // Set the scroll offset
- return this.each(function() {
- win = getWindow( this );
-
- if ( win ) {
- win.scrollTo(
- !i ? val : jQuery( win ).scrollLeft(),
- i ? val : jQuery( win ).scrollTop()
- );
-
- } else {
- this[ method ] = val;
- }
- });
- };
-});
-
-function getWindow( elem ) {
- return jQuery.isWindow( elem ) ?
- elem :
- elem.nodeType === 9 ?
- elem.defaultView || elem.parentWindow :
- false;
-}
-
-
-
-
-// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
-jQuery.each([ "Height", "Width" ], function( i, name ) {
-
- var type = name.toLowerCase();
-
- // innerHeight and innerWidth
- jQuery.fn[ "inner" + name ] = function() {
- var elem = this[0];
- return elem ?
- elem.style ?
- parseFloat( jQuery.css( elem, type, "padding" ) ) :
- this[ type ]() :
- null;
- };
-
- // outerHeight and outerWidth
- jQuery.fn[ "outer" + name ] = function( margin ) {
- var elem = this[0];
- return elem ?
- elem.style ?
- parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
- this[ type ]() :
- null;
- };
-
- jQuery.fn[ type ] = function( size ) {
- // Get window width or height
- var elem = this[0];
- if ( !elem ) {
- return size == null ? null : this;
- }
-
- if ( jQuery.isFunction( size ) ) {
- return this.each(function( i ) {
- var self = jQuery( this );
- self[ type ]( size.call( this, i, self[ type ]() ) );
- });
- }
-
- if ( jQuery.isWindow( elem ) ) {
- // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
- // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
- var docElemProp = elem.document.documentElement[ "client" + name ],
- body = elem.document.body;
- return elem.document.compatMode === "CSS1Compat" && docElemProp ||
- body && body[ "client" + name ] || docElemProp;
-
- // Get document width or height
- } else if ( elem.nodeType === 9 ) {
- // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
- return Math.max(
- elem.documentElement["client" + name],
- elem.body["scroll" + name], elem.documentElement["scroll" + name],
- elem.body["offset" + name], elem.documentElement["offset" + name]
- );
-
- // Get or set width or height on the element
- } else if ( size === undefined ) {
- var orig = jQuery.css( elem, type ),
- ret = parseFloat( orig );
-
- return jQuery.isNumeric( ret ) ? ret : orig;
-
- // Set the width or height on the element (default to pixels if value is unitless)
- } else {
- return this.css( type, typeof size === "string" ? size : size + "px" );
- }
- };
-
-});
-
-
-// Expose jQuery to the global object
-window.jQuery = window.$ = jQuery;
-})( window );
+++ /dev/null
-<!--
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@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: 25px;
-}
-</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: {"case_id": window.parent.manualcaseslist[iTestsManual].casesid,"purpose": window.parent.manualcaseslist[iTestsManual].purpose, "result": iResult},
- dataType: "json",
- beforeSend: function(x) {
- if (x && x.overrideMimeType) {
- x.overrideMimeType("application/json;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:12%" id="runbutton" value="Run" onclick="runTest()"/>
-</div>
-<div width=100%>
-<textarea id="casesinfo" rows=8 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:25px" onclick="passLabel()">Pass</label>
-
-<input type="radio" id="failradio" value="Fail" onclick="failRadio()"/><label style="font-size:25px" onclick="failLabel()">Fail</label>
-
-<input type="radio" id="blockradio" value="Block" onclick="blockRadio()"/><label style="font-size:25px" 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>
+++ /dev/null
-<!--
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@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: 25px;
-}
-
-</style>
-<script src="jquery.js"></script>
-<script>
-var iTestsManual = 0;
-
-function fillCasesInfo(){
- window.parent.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.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('test_script_entry').get(0);
- if(scriptPathText){
- if($(scriptPathText).text().trim() == "")
- document.getElementById("runbutton").disabled = true;
- else
- document.getElementById("runbutton").disabled = false;
- }else {
- document.getElementById("runbutton").disabled = true;
- }
-
- document.getElementById("casesinfo").value="";
- document.getElementById("casesinfo").value+="Descriptions: "+$(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).attr('purpose')+"\n";
- var preC = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('pre_condition');
- if (preC && preC.length > 0){
- var preCText = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('pre_condition').get(0);
- document.getElementById("casesinfo").value+= "PreCondition: "+$(preCText).text().trim()+"\n";
- }
-
- var posC = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('post_condition');
- if (posC && posC.length > 0){
- var posCText = $(posC).get(0);
- document.getElementById("casesinfo").value+= "PostCondition: "+$(posCText).text().trim()+"\n";
- }
- var stepInfo = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('step_desc');
- var stepExp = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('expected');
- for(var j=0;j<stepInfo.length;j++){
- var stepsnum = j + 1;
- if(stepInfo){
- var stepInfoText = $(stepInfo[j]).get(0);
- document.getElementById("casesinfo").value+= "Step-"+stepsnum+": "+$(stepInfoText).text().trim()+"\n";
- }
- if(stepExp){
- var stepExpText = $(stepExp[j]).get(0);
- document.getElementById("casesinfo").value+= "Expected"+": "+$(stepExpText).text().trim()+"\n";
- }
- }
-}
-
-function initManual(){
- for(var i = 0; i < window.parent.manualcaseslist.length; i++){
- var id_temp = window.parent.manualcaseslist[i].casesid;
- if(window.parent.manualcaseslist[i].casesid.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.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('test_script_entry').get(0);
- if(scriptPathText){
- window.parent.oTestFrame.src = $(scriptPathText).text().trim();
- }
-}
-
-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(){
- if (window.parent.manualcaseslist[iTestsManual].index >= window.parent.Tests.length)
- return;
- 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;
-
- $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).attr('result', iResult);
- if($(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('result_info').length > 0)
- $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('result_info').remove();
-
- var doc=$.parseXML("<result_info>" + "<actual_result>" + iResult +"</actual_result>" + "<start>" + "</start>" + "<end>" + "</end>" + "<stdout>" + "</stdout>" + "</result_info>");
- $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).append(doc.documentElement);
-
-// window.parent.statusNode.innerHTML = "Test #" + (window.parent.manualcaseslist[iTestsManual].index+1) + "/" + window.parent.Tests.length + "(" + iResult + ") " + window.parent.oTestFrame.src;
-}
-
-function completeTest(){
- window.parent.PublishResult();
-}
-
-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:12%" id="runbutton" value="Run" onclick="runTest()"/>
-</div>
-<div width=100%>
-<textarea id="casesinfo" rows=8 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:25px" onclick="passLabel()">Pass</label>
-
-<input type="radio" id="failradio" value="Fail" onclick="failRadio()"/><label style="font-size:25px" onclick="failLabel()">Fail</label>
-
-<input type="radio" id="blockradio" value="Block" onclick="blockRadio()"/><label style="font-size:25px" 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>
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitxsddir = /opt/testkit/lite2.4/xsd
-dist_testkitxsd_DATA = *.js *.xsl *.css *.png *.txt *.xml *.xsd release-notes
+++ /dev/null
-function getScrollTop(){
- return f_scrollTop();
-}
-
-function f_scrollTop() {
- return f_filterResults (
- $(window) ? $(window).scrollTop() : 0,
- document.documentElement ? document.documentElement.scrollTop : 0,
- document.body ? document.body.scrollTop : 0
- );
-}
-function f_filterResults(n_win, n_docel, n_body) {
- var n_result = n_win ? n_win : 0;
- if (n_docel && (!n_result || (n_result > n_docel)))
- n_result = n_docel;
- return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
-}
-
-function setScrollTop(){
- $(window) ? $(window).scrollTop(0): 0;
- document.documentElement ? document.documentElement.scrollTop = 0 :0;
- document.body ? document.body.scrollTop = 0 : 0;
-}
-
-function goTopEx(){
- $node = $('#goTopBtn');
- if(getScrollTop() > 0){
- $node.show();
- }else{
- $node.hide();
- }
-
- $(window).scroll(function(){
- if(getScrollTop() > 0){
- $node.show();
- }else{
- $node.hide();
- }
- });
-
- $node.click(function(){
- setScrollTop();
- });
-}
\ No newline at end of file
+++ /dev/null
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
-f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
-{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
+++ /dev/null
-= XSLT style for Test Case and Test Result =\r
-\r
-== Files structure ==\r
-\r
- readme.txt\r
- test_definition.xsd //The schema of test definition\r
- tests.css // CSS style for showing test cases and results\r
- testresult.xsl\r
- testcase.xsl\r
- tests.xml //example of test cases\r
- result.xml //example of test result\r
- \r
- \r
- == Applying the style ==\r
- \r
- === Update in definition and result XML ===\r
- \r
- For applying this style for the definition XML of test cases, please add below statement before the root element of XML (the tag "test_definition").\r
- \r
- <?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>\r
- \r
- as below: \r
- \r
-<?xml version="1.0" encoding="UTF-8"?>\r
-<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>\r
-<test_definition>\r
-\r
-For applying this style for the test-result XML, please add below statement before the root element of XML (the tag "test_definition").\r
-<?xml-stylesheet type="text/xsl" href="./testresult.xsl"?>\r
-\r
-as below:\r
-\r
-<?xml version="1.0" encoding="UTF-8"?>\r
-<?xml-stylesheet type="text/xsl" href="./testresult.xsl"?>\r
-<test_definition>\r
-\r
-=== Deploy XSLT and CSS style ===\r
-\r
-For our test package, below 3 files should be added in each test package. \r
-\r
- tests.css \r
- testresult.xsl\r
- testcase.xsl\r
- \r
-For instance, add them under the test package "webapi-tizen-alarm-tests".\r
- ©¸©¤webapi-tizen-alarm-tests\r
- ©¸©¤...\r
- ©¸©¤...\r
- ©¸tests.css \r
- ©¸testresult.xsl\r
- ©¸testcase.xsl\r
- ©¸tests.xml\r
- ©¸...\r
+++ /dev/null
--- version 1.0.1-2 --
-
- adding 2 new case types "compliance" and "user_experience"
-
--- version 1.0.1-3 --
-
- Add a new sub-element "spec" (type: string) under the "testcase" element.
-
--- version 1.0.1-4 --
-
- Add 2 new priority "P3" and "P4"
-
--- version 1.0.1-5 --
- Add a new root "test_definition", and the element "suite" has been move into it as children elements.
-
--- version 1.0.1-6 --
- A new optional attribute "launcher" is added in the element "testdefinition" for supporting identifying which kind of test suites the XML is designed for
-
--- version 1.0.1-7 --
-The Xslt related files are merged into this repo.
-including
-
- tests.css // CSS style for showing test cases and results
- testresult.xsl
- testcase.xsl
- tests.xml //example of test cases
- result.xml //example of test result
- application.js //Javascript for "back to top"
- jquery.min.js //JQuery
- back_top.png //image for "back to top"
-
-Modification in Schema:
-
-1\ the optional attribute "launcher" is moved into suite, not in "testdefinition" element any longer.
-
-2\ "spec" element is removed. and a new "specs" structure is added as below
-
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications"
- section="Widget" specification="Widget Packaging and XML Configuration"
- interface="Widget" usage="true" />
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
-All spec-related infomation are re-organized as XML element and attributes.
-
-In Xslt,
-
-1\ a float image "Back to top" is available on right-bottom for scrolling to top.
-
-2\ html anchor is adder for scrolling back to suite summary table, and case detail tables.
-
--- version 1.0.1-8 --
-1\ For more flexible, rename the attribute "method_or_attribute" to "element_name".
-2\ Add a new attribute "element_type" to describe the type of the corresponding specification item
-
-related example and Xlst is also updated for above.
-
--- version 1.0.1-9 --
-1\ add an attribute "cts_version" in the element "environment/BuildInfoType" for saving the version of CTS tool
-2\ add an attribute "file" in "measurement/simpleMeasurementType"
-3\ update the result XSLt for showing cts_version
-4\ update the result XSLt for showing ¡°Test Blocked¡± instead of "Test N/A"
-5\ add a summary table for showing all FAIL cases.
-
-
--- version 1.0.2-1 --
-1\ add a new int optional attribute "onload_delay" with default "3"
-
--- version 1.0.2-2 --
-1\ Add a new sub element "capabilities" under the element "testcase"
-2\ Add a new boolean attribute "check_unsupport_error" in the element "testcase"
-
--- version 1.0.2-3 --
-1\ Move the sub element "capabilities" from the element "testcase" to the element "set"
-
-
--- version 1.0.2-4 --
-1\ Add a unique limitation for suite name
-2\ Add a new optional attribute "launcher" in set
-
-
--- version 1.0.2-5 --
-1\ Add a attribute "set_debug_msg" in set for recording the name of log file.
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<?xml-stylesheet type="text/xsl" href="testresult.xsl"?>\r
-<test_definition name="http://tempuri.org" type=""\r
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
- xsi:noNamespaceSchemaLocation="test_definition.xsd">\r
- <environment device_id="generic/sdk/generic:4.0.4/MR1/302030:eng/test-keys"\r
- device_model="unknown" device_name="MR8" firmware_version="4.0.4"\r
- host="zhongqing-dev.sh.intel.com (Linux - 2.6.38.6-26.rc1.fc15.i686)"\r
- os_version="4.0.4" resolution="1280*800" screen_size="250*150" cts_version="2.3.0-3">\r
- <other> Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~\r
- Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~\r
- Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~\r
- </other>\r
- </environment>\r
- <summary test_plan_name="tmp_test_1">\r
- <start_at>Fri Jul 13 04:04:59 CST 2012</start_at>\r
- <end_at>Fri Jul 13 05:01:53 CST 2012</end_at>\r
- </summary>\r
- <suite name="webapi-tizen-alarm-tests" type="">\r
- <set name="Alarm1">\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_constructor_delay" priority="P1"\r
- purpose="check AlarmRelative attribute when create with delay"\r
- status="approved" type="compliance" result="PASS">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative create constructor with delay\r
- </step_desc>\r
- <expected>AlarmRelative create succeed with constructor with\r
- delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>PASS</actual_result>\r
- <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_get" priority="P1"\r
- purpose="check AlarmManager method removeAll: without input attribute"\r
- status="approved" type="compliance" result="BLOCK">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method get: default check\r
- </step_desc>\r
- <expected>AlarmManager method get: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>BLOCK</actual_result>\r
- <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with date"\r
- status="approved" type="compliance">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute attribute when create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute attribute return correct value when\r
- create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>N/R</actual_result>\r
- <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_add_rel" priority="P1"\r
- purpose="check AlarmManager method add: add relative alarm" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method add: add relative alarm\r
- </step_desc>\r
- <expected>AlarmManager method add: add relative alarm succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_attri_delay_02" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with period"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative attribute when create with delay\r
- </step_desc>\r
- <expected>AlarmRelative attribute return correct value when\r
- create succeed with with delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_getAll" priority="P1"\r
- purpose="check AlarmManager method getAll: default check" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method getAll: default check\r
- </step_desc>\r
- <expected>AlarmManager method getAll: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_attri_date_03" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with date"\r
- status="approved" type="compliance" result="Blocked">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute attribute when create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute attribute return correct value when\r
- create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=3\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1"\r
- purpose="check AlarmAbsolute method getNextScheduledDate when create with date"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute method getNextScheduledDate when\r
- create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute method getNextScheduledDate return\r
- correct value when create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_constructor_date" priority="P1"\r
- purpose="check AlarmAbsolute create constructor with date" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute create constructor with date\r
- </step_desc>\r
- <expected>AlarmAbsolute create succeed with constructor with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1"\r
- purpose="check AlarmRelative method getNextScheduleddelay when create with delay"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative method getNextScheduleddelay when\r
- create with delay\r
- </step_desc>\r
- <expected>AlarmRelative method getNextScheduleddelay return\r
- correct value when create succeed with with delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_attri_delay_01" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with period"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative attribute when create with delay\r
- </step_desc>\r
- <expected>AlarmRelative attribute return correct value when\r
- create succeed with with delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=1\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_add_abs" priority="P1"\r
- purpose="check AlarmManager method add: add absolute alarm" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method add: add absolute alarm\r
- </step_desc>\r
- <expected>AlarmManager method add: add absolute alarm succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_attri_date_02" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with date"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute attribute when create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute attribute return correct value when\r
- create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=2\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_removeAll" priority="P1"\r
- purpose="check AlarmManager method removeAll: default check" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method removeAll: default check\r
- </step_desc>\r
- <expected>AlarmManager method removeAll: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_remove" priority="P1"\r
- purpose="check AlarmManager method remove: default check" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method remove: default check\r
- </step_desc>\r
- <expected>AlarmManager method remove: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManagerObject_exist" priority="P1"\r
- purpose="check AlarmManagerObject existance" status="approved" type="compliance"\r
- result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManagerObject exist</step_desc>\r
- <expected>AlarmManagerObject exist</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_const_check_01" priority="P1"\r
- purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Check AlarmManager constants:</step_desc>\r
- <expected>AlarmManager constants value is correct:</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=1\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>\r
- <stdout>Can't find variable: tizen</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_const_check_02" priority="P1"\r
- purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Check AlarmManager constants:</step_desc>\r
- <expected>AlarmManager constants value is correct:</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=2\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>\r
- <stdout>Can't find variable: tizen</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_const_check_03" priority="P1"\r
- purpose="Check AlarmManager constants:PERIOD_DAY" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Check AlarmManager constants:</step_desc>\r
- <expected>AlarmManager constants value is correct:</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=3\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>\r
- <stdout>Can't find variable: tizen</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_const_check_04" priority="P1"\r
- purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Check AlarmManager constants:</step_desc>\r
- <expected>AlarmManager constants value is correct:</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=4\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>\r
- <stdout>Can't find variable: tizen</stdout>\r
- </result_info>\r
- </testcase>\r
- </set>\r
- <set name="Alarm">\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_constructor_delay" priority="P1"\r
- purpose="check AlarmRelative attribute when create with delay"\r
- status="approved" type="compliance" result="PASS">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative create constructor with delay\r
- </step_desc>\r
- <expected>AlarmRelative create succeed with constructor with\r
- delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>PASS</actual_result>\r
- <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_get" priority="P1"\r
- purpose="check AlarmManager method removeAll: without input attribute"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method get: default check\r
- </step_desc>\r
- <expected>AlarmManager method get: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with date"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute attribute when create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute attribute return correct value when\r
- create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_add_rel" priority="P1"\r
- purpose="check AlarmManager method add: add relative alarm" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method add: add relative alarm\r
- </step_desc>\r
- <expected>AlarmManager method add: add relative alarm succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_attri_delay_02" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with period"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative attribute when create with delay\r
- </step_desc>\r
- <expected>AlarmRelative attribute return correct value when\r
- create succeed with with delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- </set>\r
- </suite>\r
- <suite name="webapi-tizen-alarm-tests1" type="">\r
- <set name="Alarm4">\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_constructor_delay" priority="P1"\r
- purpose="check AlarmRelative attribute when create with delay"\r
- status="approved" type="compliance" result="PASS">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative create constructor with delay\r
- </step_desc>\r
- <expected>AlarmRelative create succeed with constructor with\r
- delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>PASS</actual_result>\r
- <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_get" priority="P1"\r
- purpose="check AlarmManager method removeAll: without input attribute"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method get: default check\r
- </step_desc>\r
- <expected>AlarmManager method get: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with date"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute attribute when create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute attribute return correct value when\r
- create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_add_rel" priority="P1"\r
- purpose="check AlarmManager method add: add relative alarm" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method add: add relative alarm\r
- </step_desc>\r
- <expected>AlarmManager method add: add relative alarm succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_attri_delay_02" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with period"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative attribute when create with delay\r
- </step_desc>\r
- <expected>AlarmRelative attribute return correct value when\r
- create succeed with with delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_getAll" priority="P1"\r
- purpose="check AlarmManager method getAll: default check" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method getAll: default check\r
- </step_desc>\r
- <expected>AlarmManager method getAll: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_attri_date_03" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with date"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute attribute when create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute attribute return correct value when\r
- create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=3\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1"\r
- purpose="check AlarmAbsolute method getNextScheduledDate when create with date"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute method getNextScheduledDate when\r
- create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute method getNextScheduledDate return\r
- correct value when create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_constructor_date" priority="P1"\r
- purpose="check AlarmAbsolute create constructor with date" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute create constructor with date\r
- </step_desc>\r
- <expected>AlarmAbsolute create succeed with constructor with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1"\r
- purpose="check AlarmRelative method getNextScheduleddelay when create with delay"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative method getNextScheduleddelay when\r
- create with delay\r
- </step_desc>\r
- <expected>AlarmRelative method getNextScheduleddelay return\r
- correct value when create succeed with with delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_attri_delay_01" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with period"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative attribute when create with delay\r
- </step_desc>\r
- <expected>AlarmRelative attribute return correct value when\r
- create succeed with with delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=1\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_add_abs" priority="P1"\r
- purpose="check AlarmManager method add: add absolute alarm" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method add: add absolute alarm\r
- </step_desc>\r
- <expected>AlarmManager method add: add absolute alarm succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_attri_date_02" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with date"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute attribute when create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute attribute return correct value when\r
- create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=2\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_removeAll" priority="P1"\r
- purpose="check AlarmManager method removeAll: default check" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method removeAll: default check\r
- </step_desc>\r
- <expected>AlarmManager method removeAll: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_remove" priority="P1"\r
- purpose="check AlarmManager method remove: default check" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method remove: default check\r
- </step_desc>\r
- <expected>AlarmManager method remove: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManagerObject_exist" priority="P1"\r
- purpose="check AlarmManagerObject existance" status="approved" type="compliance"\r
- result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManagerObject exist</step_desc>\r
- <expected>AlarmManagerObject exist</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_const_check_01" priority="P1"\r
- purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Check AlarmManager constants:</step_desc>\r
- <expected>AlarmManager constants value is correct:</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=1\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>\r
- <stdout>Can't find variable: tizen</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_const_check_02" priority="P1"\r
- purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Check AlarmManager constants:</step_desc>\r
- <expected>AlarmManager constants value is correct:</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=2\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>\r
- <stdout>Can't find variable: tizen</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_const_check_03" priority="P1"\r
- purpose="Check AlarmManager constants:PERIOD_DAY" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Check AlarmManager constants:</step_desc>\r
- <expected>AlarmManager constants value is correct:</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=3\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>\r
- <stdout>Can't find variable: tizen</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_const_check_04" priority="P1"\r
- purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Check AlarmManager constants:</step_desc>\r
- <expected>AlarmManager constants value is correct:</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=4\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>\r
- <stdout>Can't find variable: tizen</stdout>\r
- </result_info>\r
- </testcase>\r
- </set>\r
- <set name="Alarm3">\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_constructor_delay" priority="P1"\r
- purpose="check AlarmRelative attribute when create with delay"\r
- status="approved" type="compliance" result="PASS">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative create constructor with delay\r
- </step_desc>\r
- <expected>AlarmRelative create succeed with constructor with\r
- delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>PASS</actual_result>\r
- <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_get" priority="P1"\r
- purpose="check AlarmManager method removeAll: without input attribute"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method get: default check\r
- </step_desc>\r
- <expected>AlarmManager method get: default check succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with date"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmAbsolute attribute when create with date\r
- </step_desc>\r
- <expected>AlarmAbsolute attribute return correct value when\r
- create with date\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmManager_add_rel" priority="P1"\r
- purpose="check AlarmManager method add: add relative alarm" status="approved"\r
- type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmManager method add: add relative alarm\r
- </step_desc>\r
- <expected>AlarmManager method add: add relative alarm succeed\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>\r
- <stdout>Test time out</stdout>\r
- </result_info>\r
- </testcase>\r
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
- id="Alarm_AlarmRelative_attri_delay_02" priority="P1"\r
- purpose="check AlarmAbsolute attribute when create with period"\r
- status="approved" type="compliance" result="FAIL">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>check AlarmRelative attribute when create with delay\r
- </step_desc>\r
- <expected>AlarmRelative attribute return correct value when\r
- create succeed with with delay\r
- </expected>\r
- </step>\r
- </steps>\r
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2\r
- </test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- <result_info>\r
- <actual_result>FAIL</actual_result>\r
- <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>\r
- <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>\r
- <stdout />\r
- </result_info>\r
- </testcase>\r
- </set>\r
- </suite>\r
-</test_definition>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
-
- <xs:element name="suite">
-
-
- <xs:complexType>
-
- <xs:sequence minOccurs="1" maxOccurs="unbounded">
- <xs:element ref="set" minOccurs="0" maxOccurs="unbounded"></xs:element>
- </xs:sequence>
-
- <xs:attributeGroup ref="set_attribute_group"></xs:attributeGroup>
- <xs:attribute name="launcher" type="xs:string"></xs:attribute>
- </xs:complexType>
- <xs:unique name="uniqueSetName">
- <xs:selector xpath=".//set" />
- <xs:field xpath="@name" />
- </xs:unique>
- </xs:element>
-
- <xs:element name="set">
-
- <xs:complexType>
- <xs:sequence>
- <xs:element name="capabilities" type="CapabilitiesType"
- minOccurs="0" maxOccurs="1">
- </xs:element>
- <xs:sequence minOccurs="1" maxOccurs="unbounded">
- <xs:element ref="testcase" minOccurs="0"
- maxOccurs="unbounded">
- </xs:element>
- </xs:sequence>
- </xs:sequence>
-
-
-
- <xs:attributeGroup ref="set_attribute_group"></xs:attributeGroup>
- <xs:attribute name="launcher" type="xs:string"></xs:attribute>
- <xs:attribute name="set_debug_msg" type="xs:string"></xs:attribute>
- </xs:complexType>
- <xs:unique name="uniqueCaseName">
- <xs:selector xpath=".//testcase" />
- <xs:field xpath="@id" />
- </xs:unique>
- </xs:element>
-
- <xs:element name="testcase">
- <xs:complexType>
- <xs:sequence minOccurs="1">
- <xs:element ref="description"></xs:element>
- <xs:element name="categories" type="categories"
- minOccurs="0" maxOccurs="1">
- </xs:element>
- <xs:element name="measurement" type="measurementType"
- minOccurs="0" maxOccurs="unbounded">
- </xs:element>
- <xs:element name="series" type="seriesType" minOccurs="0"
- maxOccurs="unbounded">
- </xs:element>
- <xs:element name="specs" type="specsType" minOccurs="0"
- maxOccurs="1">
- </xs:element>
- <xs:element name="result_info" type="result_info_type"
- minOccurs="0">
- </xs:element>
- </xs:sequence>
-
- <xs:attributeGroup ref="case_attribute_group"></xs:attributeGroup>
- </xs:complexType>
- </xs:element>
-
- <xs:element name="steps">
- <xs:complexType>
- <xs:sequence minOccurs="0" maxOccurs="unbounded">
- <xs:element ref="step"></xs:element>
- </xs:sequence>
- </xs:complexType>
- <xs:unique name="uniqueStepName">
- <xs:selector xpath=".//step" />
- <xs:field xpath="@order" />
- </xs:unique>
- </xs:element>
-
- <xs:attributeGroup name="set_attribute_group">
-
- <xs:attribute name="name" type="xs:anyURI" use="required"></xs:attribute>
- <xs:attribute name="type" type="xs:string"></xs:attribute>
- </xs:attributeGroup>
-
- <xs:attributeGroup name="case_attribute_group">
-
- <xs:attribute name="id" use="required">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="1"></xs:minLength>
- <xs:whiteSpace value="collapse"></xs:whiteSpace>
- </xs:restriction>
- </xs:simpleType>
- </xs:attribute>
-
- <xs:attribute name="priority" type="priority_simple_type"
- use="required">
- </xs:attribute>
-
- <xs:attribute name="execution_type" type="execution_type_simple_type"
- use="required">
- </xs:attribute>
-
- <xs:attribute name="component" type="xs:string"></xs:attribute>
-
- <xs:attribute name="requirement_ref" type="xs:anyURI"
- use="optional">
- </xs:attribute>
-
- <xs:attribute name="status" type="status_type" use="required"></xs:attribute>
-
- <xs:attribute name="type" type="case_type_type" use="required">
- </xs:attribute>
- <xs:attribute name="purpose" type="xs:string"></xs:attribute>
- <xs:attribute name="result" type="xs:string"></xs:attribute>
- <xs:attribute name="onload_delay" type="xs:int" use="optional"
- default="3">
- </xs:attribute>
- </xs:attributeGroup>
-
- <xs:simpleType name="priority_simple_type">
- <xs:restriction base="xs:string">
-
- <xs:enumeration value="P0"></xs:enumeration>
-
- <xs:enumeration value="P1"></xs:enumeration>
-
- <xs:enumeration value="P2"></xs:enumeration>
-
- <xs:enumeration value="P3"></xs:enumeration>
-
- <xs:enumeration value="P4"></xs:enumeration>
-
- </xs:restriction>
- </xs:simpleType>
-
- <xs:simpleType name="execution_type_simple_type">
- <xs:restriction base="xs:string">
-
- <xs:enumeration value="auto"></xs:enumeration>
-
- <xs:enumeration value="manual"></xs:enumeration>
- </xs:restriction>
- </xs:simpleType>
-
- <xs:simpleType name="status_type">
- <xs:restriction base="xs:string">
-
- <xs:enumeration value="designed"></xs:enumeration>
-
- <xs:enumeration value="ready"></xs:enumeration>
-
- <xs:enumeration value="approved"></xs:enumeration>
- </xs:restriction>
- </xs:simpleType>
-
- <xs:simpleType name="case_type_type">
- <xs:restriction base="xs:string">
-
- <xs:enumeration value="functional_positive"></xs:enumeration>
-
- <xs:enumeration value="functional_negative"></xs:enumeration>
-
- <xs:enumeration value="security"></xs:enumeration>
-
- <xs:enumeration value="performance"></xs:enumeration>
-
- <xs:enumeration value="reliability"></xs:enumeration>
-
- <xs:enumeration value="portability"></xs:enumeration>
-
- <xs:enumeration value="maintainability"></xs:enumeration>
-
- <xs:enumeration value="compliance"></xs:enumeration>
-
- <xs:enumeration value="user_experience"></xs:enumeration>
-
- <xs:enumeration value="undefined"></xs:enumeration>
- </xs:restriction>
- </xs:simpleType>
-
-
- <xs:element name="purpose" type="xs:anySimpleType"></xs:element>
-
- <xs:element name="notes" type="xs:string"></xs:element>
-
- <xs:element name="pre_condition" type="xs:string"></xs:element>
-
- <xs:element name="post_condition" type="xs:string"></xs:element>
-
- <xs:element name="description">
-
- <xs:complexType>
-
- <xs:sequence minOccurs="1" maxOccurs="unbounded">
-
- <xs:choice minOccurs="0" maxOccurs="1">
- <xs:element ref="notes"></xs:element>
- </xs:choice>
-
- <xs:choice minOccurs="0" maxOccurs="1">
- <xs:element ref="pre_condition"></xs:element>
- </xs:choice>
-
- <xs:choice minOccurs="0" maxOccurs="1">
- <xs:element ref="post_condition"></xs:element>
- </xs:choice>
-
- <xs:element ref="steps" minOccurs="1" maxOccurs="1"></xs:element>
-
- <xs:choice minOccurs="0" maxOccurs="1">
- <xs:element ref="test_script_entry"></xs:element>
- </xs:choice>
-
-
- </xs:sequence>
-
- </xs:complexType>
- </xs:element>
-
- <xs:element name="step">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="step_desc" type="xs:string"></xs:element>
- <xs:element name="expected" type="xs:string"></xs:element>
- </xs:sequence>
- <xs:attribute name="order" type="xs:int"></xs:attribute>
- </xs:complexType>
- </xs:element>
-
- <xs:element name="test_script_entry">
- <xs:complexType>
- <xs:simpleContent>
- <xs:extension base="xs:string">
- <xs:attribute name="test_script_expected_result" type="xs:string"
- default="0">
- </xs:attribute>
- <xs:attribute name="timeout" type="xs:int" default="90">
- </xs:attribute>
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- </xs:element>
-
- <xs:complexType name="result_info_type">
- <xs:sequence minOccurs="0">
- <xs:element name="actual_result" type="xs:string"></xs:element>
- <xs:element name="start" type="xs:string"></xs:element>
- <xs:element name="end" type="xs:string"></xs:element>
- <xs:element name="stdout" type="xs:string" minOccurs="0"></xs:element>
- <xs:element name="stderr" type="xs:string" minOccurs="0"></xs:element>
- </xs:sequence>
- </xs:complexType>
-
- <xs:complexType name="measurementType">
- <xs:attribute name="name" type="xs:string"></xs:attribute>
- <xs:attribute name="value" type="xs:string"></xs:attribute>
- <xs:attribute name="unit" type="xs:string"></xs:attribute>
- <xs:attribute name="target" type="xs:string"></xs:attribute>
- <xs:attribute name="failure" type="xs:string"></xs:attribute>
- <xs:attribute name="power" type="xs:string"></xs:attribute>
- </xs:complexType>
-
- <xs:complexType name="seriesType">
- <xs:sequence>
- <xs:element name="measurement" type="simpleMeasurementType"
- minOccurs="1" maxOccurs="unbounded"></xs:element>
- </xs:sequence>
- <xs:attribute name="name" type="xs:string"></xs:attribute>
- <xs:attribute name="group" type="xs:string"></xs:attribute>
- <xs:attribute name="unit" type="xs:string"></xs:attribute>
- <xs:attribute name="interval" type="xs:string"></xs:attribute>
- <xs:attribute name="interval_unit" type="xs:string"></xs:attribute>
- <xs:attribute name="power" type="xs:string"></xs:attribute>
- </xs:complexType>
-
- <xs:complexType name="simpleMeasurementType">
- <xs:attribute name="value" type="xs:string"></xs:attribute>
- <xs:attribute name="file" type="xs:string"></xs:attribute>
- </xs:complexType>
-
-
- <xs:complexType name="categories">
- <xs:sequence>
- <xs:element name="category" type="xs:string" maxOccurs="unbounded"
- minOccurs="0"></xs:element>
- </xs:sequence>
- </xs:complexType>
-
- <xs:element name="test_definition">
- <xs:complexType>
- <xs:sequence minOccurs="1" maxOccurs="unbounded">
- <xs:element name="environment" type="BuildInfoType"
- minOccurs="0">
- </xs:element>
- <xs:element name="summary" type="summaryType" minOccurs="0">
- </xs:element>
- <xs:element ref="suite" minOccurs="1" maxOccurs="unbounded">
- </xs:element>
- </xs:sequence>
- </xs:complexType>
- <xs:unique name="uniqueSuiteName">
- <xs:selector xpath=".//suite" />
- <xs:field xpath="@name" />
- </xs:unique>
- </xs:element>
-
-
-
- <xs:complexType name="BuildInfoType">
- <xs:sequence>
- <xs:element name="other" type="xs:string"></xs:element>
- </xs:sequence>
- <xs:attribute name="device_name" type="xs:string"></xs:attribute>
- <xs:attribute name="device_model" type="xs:string"></xs:attribute>
- <xs:attribute name="os_version" type="xs:string"></xs:attribute>
- <xs:attribute name="device_id" type="xs:string"></xs:attribute>
- <xs:attribute name="firmware_version" type="xs:string"></xs:attribute>
- <xs:attribute name="screen_size" type="xs:string"></xs:attribute>
- <xs:attribute name="resolution" type="xs:string"></xs:attribute>
- <xs:attribute name="host" type="xs:string"></xs:attribute>
- <xs:attribute name="cts_version" type="xs:string"></xs:attribute>
- <xs:attribute name="build_id" type="xs:string"></xs:attribute>
- </xs:complexType>
-
-
- <xs:complexType name="summaryType">
- <xs:sequence>
- <xs:element name="start_at" type="xs:string"></xs:element>
- <xs:element name="end_at" type="xs:string"></xs:element>
- </xs:sequence>
- <xs:attribute name="test_plan_name" type="xs:string"></xs:attribute>
- </xs:complexType>
-
-
- <xs:complexType name="specsType">
- <xs:sequence>
- <xs:element name="spec" type="specType" maxOccurs="unbounded"></xs:element>
- </xs:sequence>
- </xs:complexType>
-
- <xs:complexType name="specType">
- <xs:sequence>
- <xs:element name="spec_assertion" type="spec_assertionType"></xs:element>
- <xs:element name="spec_url" type="xs:string"></xs:element>
- <xs:element name="spec_statement" type="xs:string"></xs:element>
- </xs:sequence>
- </xs:complexType>
-
- <xs:complexType name="spec_assertionType">
- <xs:attribute name="category" type="xs:string" use="required"></xs:attribute>
- <xs:attribute name="section" type="xs:string" use="required"></xs:attribute>
- <xs:attribute name="specification" type="xs:string" use="required">
- </xs:attribute>
- <xs:attribute name="interface" type="xs:string" use="required">
- </xs:attribute>
- <xs:attribute name="element_name" type="xs:string" use="optional">
- </xs:attribute>
- <xs:attribute name="usage" type="xs:boolean" default="false"></xs:attribute>
- <xs:attribute name="element_type" type="xs:string"></xs:attribute>
- </xs:complexType>
-
- <xs:complexType name="CapabilitiesType">
- <xs:sequence>
- <xs:element name="capability" type="CapabilityType"
- minOccurs="1" maxOccurs="unbounded"></xs:element>
- </xs:sequence>
- </xs:complexType>
-
- <xs:complexType name="CapabilityType">
- <xs:sequence minOccurs="0">
- <xs:element name="value" type="xs:string"></xs:element>
- </xs:sequence>
- <xs:attribute name="name" type="xs:string" use="required"></xs:attribute>
- </xs:complexType>
-</xs:schema>
-
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="html" version="1.0" encoding="UTF-8"
- indent="yes" />
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "tests.css";
- </STYLE>
- <head>
- <script type="text/javascript" src="jquery.min.js" />
- </head>
- <body>
- <div id="testcasepage">
- <div id="title">
- <table>
- <tr>
- <td>
- <h1>Test Cases</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="suites">
- <a name="contents"></a>
- <table>
- <tr>
- <th>Test Suite</th>
- <th>Total</th>
- <th>Auto</th>
- <th>Manual</th>
- </tr>
- <tr>
- <td>
- Total
- </td>
- <td>
- <xsl:value-of select="count(test_definition/suite/set//testcase)" />
- </td>
- <td>
- <xsl:value-of
- select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])" />
- </td>
- <td>
- <xsl:value-of
- select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])" />
- </td>
- </tr>
- <xsl:for-each select="test_definition/suite">
- <tr>
- <td>
- <a>
- <xsl:attribute name="href">
- #<xsl:value-of
- select="@name" />
- </xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td>
- <xsl:value-of select="count(set//testcase)" />
- </td>
- <td>
- <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])" />
- </td>
- <td>
- <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])" />
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </div>
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1>Detailed Test Cases</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="cases">
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name" />
- <div id="btc">
- <a href="#contents">Back to Contents</a>
- </div>
- <div id="suite_title">
- Test Suite:
- <xsl:value-of select="@name" />
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Type</th>
- <th>Component</th>
- <th>Execution Type</th>
- <th>Description</th>
- <th>Specification</th>
- </tr>
- <xsl:for-each select=".//set">
- <xsl:sort select="@name" />
- <tr>
- <td colspan="7">
- Test Set:
- <xsl:value-of select="@name" />
- </td>
- </tr>
- <xsl:for-each select=".//testcase">
- <!-- xsl:sort select="@id" /> -->
- <tr>
- <td>
- <xsl:value-of select="@id" />
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
- <td>
- <xsl:value-of select="@type" />
- </td>
- <td>
- <xsl:value-of select="@component" />
- </td>
- <td>
- <xsl:value-of select="@execution_type" />
- </td>
- <td>
- <p>
- Pre_condition:
- <xsl:value-of select=".//description/pre_condition" />
- </p>
- <p>
- Post_condition:
- <xsl:value-of select=".//description/post_condition" />
- </p>
- <p>
- Test Script Entry:
- <xsl:value-of select=".//description/test_script_entry" />
- </p>
- <p>
- Steps:
- <p />
- <xsl:for-each select=".//description/steps/step">
- <xsl:sort select="@order" />
- Step
- <xsl:value-of select="@order" />
- :
- <xsl:value-of select="./step_desc" />
- ;
- <p />
- Expected Result:
- <xsl:value-of select="./expected" />
- <p />
- </xsl:for-each>
- </p>
- </td>
- <td>
- <xsl:for-each select=".//specs/spec">
- <b>[Spec_Assertion]:</b>
- <br />
- [Category]:
- <xsl:value-of select="./spec_assertion/@category" />
- <br />
- [Section]:
- <xsl:value-of select="./spec_assertion/@section" />
- <br />
- [Specification]:
- <xsl:value-of select="./spec_assertion/@specification" />
- <br />
- [Interface]:
- <xsl:value-of select="./spec_assertion/@interface" />
- <br />
- <xsl:choose>
- <xsl:when test="./spec_assertion/@element_name">
- [<xsl:value-of select="./spec_assertion/@element_type" />]:
- <xsl:value-of select="./spec_assertion/@element_name" />
- <br />
- </xsl:when>
- </xsl:choose>
-
- [URL]:
- <xsl:value-of select="./spec_url" />
- <br />
- [Statement]:
- <xsl:value-of select="./spec_statement" />
- <br />
- </xsl:for-each>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- </div>
- <div id="goTopBtn">
- <img border="0" src="./back_top.png" />
- </div>
- <script type="text/javascript" src="application.js" />
- <script language="javascript" type="text/javascript">
- $(document).ready(function(){
- goTopEx();
- });
- </script>
- </body>
- </html>
- </xsl:template>
-</xsl:stylesheet>
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet version="1.0"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
- <xsl:output method="html" version="1.0" encoding="UTF-8"
- indent="yes" />
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "tests.css";
- </STYLE>
- <head>
- <script type="text/javascript" src="jquery.min.js" />
- </head>
- <body>
- <div id="testcasepage">
- <div id="title">
- <table>
- <tr>
- <td>
- <h1>Test Report</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="device">
- <table>
- <tr>
- <th colspan="2">Device Information</th>
- </tr>
- <tr>
- <td>Device Name</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@device_name">
- <xsl:if test="test_definition/environment/@device_name = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@device_name" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Device Model</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@device_model">
- <xsl:if test="test_definition/environment/@device_model = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@device_model" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>OS Version</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@os_version">
- <xsl:if test="test_definition/environment/@os_version = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@os_version" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Device ID</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@device_id">
- <xsl:if test="test_definition/environment/@device_id = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@device_id" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Firmware Version</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@firmware_version">
- <xsl:if test="test_definition/environment/@firmware_version = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@firmware_version" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Build ID</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@build_id">
- <xsl:if test="test_definition/environment/@build_id = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@build_id" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Screen Size</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@screen_size">
- <xsl:if test="test_definition/environment/@screen_size = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@screen_size" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Resolution</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@resolution">
- <xsl:if test="test_definition/environment/@resolution = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@resolution" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Host Info</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@host">
- <xsl:if test="test_definition/environment/@host = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@host" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>CTS Version</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@cts_version">
- <xsl:if test="test_definition/environment/@cts_version = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@cts_version" />
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Others</td>
- <td>
- <xsl:if test="test_definition/environment/other = ''">
- N/A
- </xsl:if>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word"
- select="test_definition/environment/other" />
- </xsl:call-template>
- </td>
- </tr>
- </table>
- </div>
-
- <div id="summary">
- <table>
- <tr>
- <th colspan="2">Test Summary</th>
- </tr>
- <tr>
- <td>Test Plan Name</td>
- <td>
- <xsl:value-of select="test_definition/summary/@test_plan_name" />
- </td>
- </tr>
- <tr>
- <td>Tests Total</td>
- <td>
- <xsl:value-of select="count(test_definition//suite/set/testcase)" />
- </td>
- </tr>
- <tr>
- <td>Test Passed</td>
- <td>
- <xsl:value-of
- select="count(test_definition//suite/set/testcase[@result = 'PASS'])" />
- </td>
- </tr>
- <tr>
- <td>Test Failed</td>
- <td>
- <xsl:value-of
- select="count(test_definition//suite/set/testcase[@result = 'FAIL'])" />
- </td>
- </tr>
- <tr>
- <td>Test Block</td>
- <td>
- <xsl:value-of
- select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
- </td>
- </tr>
- <tr>
- <td>Test Not Run</td>
- <td>
- <xsl:value-of
- select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
- </td>
- </tr>
- <tr>
- <td>Start time</td>
- <td>
- <xsl:value-of select="test_definition/summary/start_at" />
- </td>
- </tr>
- <tr>
- <td>End time</td>
- <td>
- <xsl:value-of select="test_definition/summary/end_at" />
- </td>
- </tr>
- </table>
- </div>
-
-
- <div id="suite_summary">
- <div id="title">
- <a name="contents"></a>
- <table>
- <tr>
- <td class="title">
- <h1>Test Summary by Suite</h1>
- </td>
- </tr>
- </table>
- </div>
- <table>
- <tr>
- <th>Suite</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Run</th>
- <th>Total</th>
- </tr>
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name" />
- <tr>
- <td>
- <a>
- <xsl:attribute name="href">
- #<xsl:value-of
- select="@name" />
- </xsl:attribute>
- <xsl:value-of select="@name" />
- </a>
- </td>
- <td>
- <xsl:value-of select="count(set//testcase[@result = 'PASS'])" />
- </td>
- <td>
- <xsl:value-of select="count(set//testcase[@result = 'FAIL'])" />
- </td>
- <td>
- <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])" />
- </td>
- <td>
- <xsl:value-of
- select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])" />
- </td>
- <td>
- <xsl:value-of select="count(set//testcase)" />
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </div>
-
- <div id="fail_cases">
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1 align="center">
- Test Failures (
- <xsl:value-of
- select="count(test_definition/suite/set//testcase[@result = 'FAIL'])" />
- )
- </h1>
- </td>
- </tr>
- </table>
- </div>
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name" />
- <div id="btc">
- <a href="#contents">Back to Contents</a>
- </div>
- <div id="suite_title">
- Test Suite:
- <xsl:value-of select="@name" />
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <xsl:sort select="@name" />
- <tr>
- <td colspan="4">
- Test Set:
- <xsl:value-of select="@name" />
- </td>
- </tr>
- <xsl:for-each select=".//testcase">
- <xsl:sort select="@id" />
- <xsl:choose>
- <xsl:when test="@result">
- <xsl:if test="@result = 'FAIL'">
-
- <tr>
- <td>
- <xsl:value-of select="@id" />
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
-
- <td class="red_rate">
- <xsl:value-of select="@result" />
- </td>
-
- <td>
- <xsl:value-of select=".//result_info/stdout" />
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:if>
- </xsl:when>
- </xsl:choose>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
-
- <div id="cases">
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1 align="center">Detailed Test Results</h1>
- </td>
- </tr>
- </table>
- </div>
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name" />
- <div id="btc">
- <a href="#contents">Back to Contents</a>
- </div>
- <div id="suite_title">
- Test Suite:
- <xsl:value-of select="@name" />
- <a>
- <xsl:attribute name="name">
- <xsl:value-of
- select="@name" />
- </xsl:attribute>
- </a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <xsl:sort select="@name" />
- <tr>
- <td colspan="4">
- Test Set:
- <xsl:value-of select="@name" />
- </td>
- </tr>
- <xsl:for-each select=".//testcase">
- <xsl:sort select="@id" />
- <tr>
- <td>
- <xsl:value-of select="@id" />
- </td>
- <td>
- <xsl:value-of select="@purpose" />
- </td>
-
- <xsl:choose>
- <xsl:when test="@result">
- <xsl:if test="@result = 'FAIL'">
- <td class="red_rate">
- <xsl:value-of select="@result" />
- </td>
- </xsl:if>
- <xsl:if test="@result = 'PASS'">
- <td class="green_rate">
- <xsl:value-of select="@result" />
- </td>
- </xsl:if>
- <xsl:if test="@result = 'BLOCK' ">
- <td>
- BLOCK
- </td>
- </xsl:if>
- <xsl:if test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
- <td>
- Not Run
- </td>
- </xsl:if>
- </xsl:when>
- <xsl:otherwise>
- <td>
-
- </td>
- </xsl:otherwise>
- </xsl:choose>
- <td>
- <xsl:value-of select=".//result_info/stdout" />
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- </div>
- <div id="goTopBtn">
- <img border="0" src="./back_top.png" />
- </div>
- <script type="text/javascript" src="application.js" />
- <script language="javascript" type="text/javascript">
- $(document).ready(function(){
- goTopEx();
- });
- </script>
- </body>
- </html>
- </xsl:template>
- <xsl:template name="br-replace">
- <xsl:param name="word" />
- <xsl:variable name="cr">
- <xsl:text>
-</xsl:text>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="contains($word,$cr)">
- <xsl:value-of select="substring-before($word,$cr)" />
- <br />
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word" select="substring-after($word,$cr)" />
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$word" />
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-</xsl:stylesheet>
+++ /dev/null
-@charset "UTF-8";\r
-/* CSS Document */\r
-#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td\r
- {\r
- margin: 0;\r
- padding: 0;\r
- border: 0;\r
- font-weight: inherit;\r
- font-style: inherit;\r
- font-size: 0.96em;\r
- font-family: arial;\r
- vertical-align: baseline;\r
-}\r
-\r
-#testcasepage p {\r
- text-align: left;\r
-}\r
-\r
-#suite_title {\r
- text-align: left;\r
-}\r
-\r
-#btc {\r
- text-align: right;\r
-}\r
-\r
-#testcasepage table {\r
- border-collapse: separate;\r
- border-spacing: 0;\r
- margin-bottom: 1.4em;\r
- vertical-align: middle;\r
-}\r
-\r
-#testcasepage th,#testcasepage td {\r
- text-align: left;\r
- font-weight: normal;\r
- padding: 4px 10px 4px 5px;\r
- vertical-align: middle;\r
-}\r
-\r
-#cases table {\r
- width: 101%;\r
-}\r
-\r
-#fail_cases table {\r
- width: 101%;\r
-}\r
-\r
-#title table {\r
- width: 101%;\r
-}\r
-\r
-#device table {\r
- width: 50%;\r
-}\r
-\r
-#summary table {\r
- width: 50%;\r
-}\r
-\r
-#testcasepage th {\r
- border-bottom: 1px solid #000;\r
- background-color: #AAAAAA;\r
- border-left: 1px solid #000;\r
- border-top: 1px solid #000;\r
- color: #000;\r
- font-weight: bold;\r
- vertical-align: bottom;\r
-}\r
-\r
-#testcasepage th:last-child,#testcasepage td:last-child {\r
- border-right: 1px solid #000;\r
-}\r
-\r
-#testcasepage td {\r
- border-left: 1px solid;\r
- font-weight: normal;\r
- border-bottom: 1px solid;\r
-}\r
-\r
-#testcasepage td.yellow_rate {\r
- background-color: #ffcc00;\r
-}\r
-\r
-#testcasepage td.green_rate {\r
- background-color: #33cc33;\r
-}\r
-\r
-#testcasepage td.dgreen_rate {\r
- background-color: #339933;\r
-}\r
-\r
-#testcasepage td.red_rate {\r
- background-color: #FF3333;\r
-}\r
-\r
-#title table,#title tr,#title td {\r
- border-left: none;\r
- border-bottom: none;\r
- text-align: center;\r
-}\r
-\r
-#title td:last-child {\r
- border-right: none;\r
-}\r
-\r
-#testcasepage h1 {\r
- font-size: 2em;\r
- font-family: Arial, sans-serif;\r
- font-weight: bold;\r
- line-height: 1;\r
- color: #000;\r
- margin-bottom: 0.75em;\r
- padding-top: 0.25em;\r
- font-weight: bold;\r
-}\r
-\r
-#goTopBtn {\r
- right: 0px;\r
- bottom: 0px;\r
- position: fixed; +position: absolute;\r
- top: expression(parseInt(document.body.scrollTop)+document.body.clientHeight-40);\r
-}
\ No newline at end of file
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<?xml-stylesheet type="text/xsl" href="testcase.xsl"?>\r
-<test_definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
- xsi:noNamespaceSchemaLocation="test_definition.xsd">\r
- <suite name="webapi-w3c-widget-tests">\r
- <set name="WidgetPackaging">\r
- <testcase\r
- purpose="Tests the user agent's ability to process files with no file extension. "\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="auto" priority="P3" id="dm">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</step_desc>\r
- <expected> \r
- To pass, the user agent start file of the widget must be index.htm</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Tizen" specification="Tizen Packaging and XML Configuration"\r
- interface="Tizen" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests the user agent's ability to process files with a file extension other than .wgt."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="dn">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</step_desc>\r
- <expected> \r
- To pass, the user agent start file of the widget must be index.htm</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" usage="true" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase purpose="Test the ability of the UA to verify a zip archive."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="do">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</step_desc>\r
- <expected> \r
- To pass, the user agent must treat this as an invalid widget (archive is spanned).</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test the user agent's ability to get a widget over HTTP and respect the application/widget mimetype. The server from which this test is served from has been set up to label the 'test' resource as an 'application/widget'."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="z3">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</step_desc>\r
- <expected> \r
- To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only because of sniffing).</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test the user agent's ability to get a widget over HTTP and respect the 'application/widget' mimetype. The server from which this test is served from has been set up to label the 'test.html' resource as an 'application/widget'."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="z4">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</step_desc>\r
- <expected> \r
- To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only via sniffing).</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that an empty defaultlocale attribute is ignored (and does not cause the widget to be treated as invalid)."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="dlocignore00">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</step_desc>\r
- <expected> \r
- To pass, the widget must simply run..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that the user agent applies rule for getting a single attribute value to the defaultlocale attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="dlocignore01">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</step_desc>\r
- <expected> To pass, the name of the widget must be the value PASS..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that the user agent matches obscure, yet valid, language tags."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="dlocignore02">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</step_desc>\r
- <expected> To pass, the widgets description must be the value PASS..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that a language tag already part of the UA's locales list is ignored when it is repeated for defaultlocale attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="dlocignore03">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</step_desc>\r
- <expected> \r
- To pass, the specified value should not be added twice to the locales list of the UA..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that the default locale is added to the end of the user agent's locale list \r
- (and does not override the default language, which is assumed to be 'en')."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="dlocignore04">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</step_desc>\r
- <expected> \r
- To pass, the name of the widget must be PASS..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that the value of defaultlocale is also used to in folder-based localization."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="dlocuse00">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</step_desc>\r
- <expected>\r
- To pass, the index.html of the folder 'locales/esx-al/' should be loaded and say PASS..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that the value of defaultlocale works in conjunction to xml:lang on the widget element."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="dlocuse01">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</step_desc>\r
- <expected>\r
- To pass, the name of the widget must be PASS..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that the UA rejects configuration documents that don't have\r
- correct widget element at the root."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="aa">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</step_desc>\r
- <expected> To pass, the UA must treat this as an\r
- invalid widget (the root element is not widget)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that the UA rejects configuration documents that don't have correct\r
- widget element at the root."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ab">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</step_desc>\r
- <expected> To pass, the UA must treat this as an invalid widget (the namespace is wrong)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that the UA rejects configuration documents that don't have correct widget\r
- element at the root."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ac">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</step_desc>\r
- <expected>To pass, the UA must treat this as an invalid widget (the namespace is missing)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly processes a author element."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="af">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</step_desc>\r
- <expected>\r
- To pass, the author name must be the string "PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ag">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</step_desc>\r
- <expected>\r
- To pass, the widget author must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ah">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</step_desc>\r
- <expected>\r
- To pass, the author name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at start/end trimmed)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the rule for getting a single attribute value."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ai">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</step_desc>\r
- <expected>\r
- To pass, the author email must be the string "PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="aj">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</step_desc>\r
- <expected>\r
- To pass, the author name must be the string "PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ak">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</step_desc>\r
- <expected>\r
- To pass, the author name must be the string "PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test the ability of the user agent to handle an empty author element."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="al">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</step_desc>\r
- <expected>\r
- To pass, the author name must be an empty string..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test the ability of the user agent to correctly process the author href attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="am">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</step_desc>\r
- <expected>\r
- To pass, the value of author href must be "PASS:PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test the ability of the user agent to correctly process the author href attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="an">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</step_desc>\r
- <expected>\r
- To pass, the value of author href must be ignored..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly processes a name element."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ao">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</step_desc>\r
- <expected>\r
- To pass, the widget name must be the string "PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ap">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</step_desc>\r
- <expected>\r
- To pass, the widget name must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="aq">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</step_desc>\r
- <expected>\r
- To pass, the widget name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at front/back trimmed)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the rule for getting a single attribute value."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ar">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</step_desc>\r
- <expected>\r
- To pass, the widget short name must be the string "PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the rule for getting a single attribute value and\r
- the Rule for Getting Text Content with Normalized White Space."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="as">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</step_desc>\r
- <expected>\r
- To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly applies the rule for getting a single attribute value and\r
- the Rule for Getting Text Content with Normalized White Space."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="at">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</step_desc>\r
- <expected>\r
- To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly processes the short attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="au">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</step_desc>\r
- <expected>\r
- To pass, the widget short name must be an empty string..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test the ability of the user agent to handle an empty name element."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="av">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</step_desc>\r
- <expected>\r
- To pass, the widget name must be an empty string..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that a user agent correctly processes a name element with xml:lang attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="oa">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</step_desc>\r
- <expected>\r
- To pass, the widget name must be the string "PASS"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that the user agent does not attempt to load a default start file when a custom start file has been declared."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="aw">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</step_desc>\r
- <expected>\r
- To pass, the widget start file must point to "pass.html" and the icons list must contain a pointer to "icon.png" at the root of the widget..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase purpose="Test the UA's ability process the height attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ax">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</step_desc>\r
- <expected>\r
- To pass, the widget height must be either the numeric value 123 or a value greater than 0..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase purpose="Test the UA's ability process the height attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ay">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</step_desc>\r
- <expected>\r
- To pass, the user agent must ignore the value of the height attribute (the value is composed of characters)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase purpose="Test the UA's ability process the height attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="az">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</step_desc>\r
- <expected>\r
- To pass, the widget height must be the numeric value 100 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase purpose="Test the UA's ability process the height attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="a1">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</step_desc>\r
- <expected>\r
- To pass, the widget height must be the numeric value 123 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase purpose="Test the UA's ability process the height attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="a2">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</step_desc>\r
- <expected>\r
- To pass, the widget height must be ignored (the value is an empty string, hence it would be ignored)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase purpose="Test the UA's ability process the height attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="a3">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</step_desc>\r
- <expected>\r
- To pass, the widget height must be ignored (the value is a sequence of space characters, hence it would be ignored)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase purpose="Test the UA's ability process the height attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="a4">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</step_desc>\r
- <expected>\r
- To pass, the widget height must be ignored (the value is an empty string)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that the UA skips preference elements without a name attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="a5">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</step_desc>\r
- <expected>\r
- To pass, widget preferences must remain an empty list (i.e., the preference is skipped)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that the UA skips preference element already defined."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="a6">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</step_desc>\r
- <expected>\r
- To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="a7">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</step_desc>\r
- <expected>\r
- To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="a8">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</step_desc>\r
- <expected>\r
- To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "true"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that the UA sets the readonly attribute to false by default."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="a9">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</step_desc>\r
- <expected>\r
- To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test that the UA skips multiple preference element already defined."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="ba">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</step_desc>\r
- <expected>\r
- To pass, widget preference must contain one preference whose name is "a" and whose value is "a" and whose readonly attr value must be "false"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test the UA's ability store preferences whose name vary only in case."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="bb">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</step_desc>\r
- <expected>\r
- To pass, widget preference must contain two preferences: 1 must have a name "a" and whose value is "a" and whose readonly attr value must be "false". 2 must have a name "A" and whose value is "b" and whose readonly attribute value must be "false"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Tests that the UA applies the rule for getting a single attribute value to name, value, and readonly attributes."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="bc">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</step_desc>\r
- <expected>\r
- To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in an arbitrary folder."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="bg">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</step_desc>\r
- <expected>\r
- To pass, the user agent must treat this widget as an invalid widget (config file is not at the root)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- <testcase\r
- purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in a locale folder."\r
- type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
- execution_type="manual" priority="P3" id="bh">\r
- <description>\r
- <pre_condition />\r
- <post_condition />\r
- <steps>\r
- <step order="1">\r
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</step_desc>\r
- <expected>\r
- To pass, the user agent must treat this widget as an invalid widget (config file is not at the root, but in locale folder)..</expected>\r
- </step>\r
- </steps>\r
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</test_script_entry>\r
- </description>\r
- <specs>\r
- <spec>\r
- <spec_assertion category="Tizen Device API Specifications"\r
- section="Widget" specification="Widget Packaging and XML Configuration"\r
- interface="Widget" element_name="constructor" element_type="method" />\r
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
- <spec_statement>spec_statement</spec_statement>\r
- </spec>\r
- </specs>\r
- </testcase>\r
- </set>\r
- </suite>\r
-</test_definition>\r
+++ /dev/null
-[LOGGING]
-log_level=INFO
-
-[EXTENSION]
-crosswalk=--external-extensions-path=/usr/lib/tizen-extensions-crosswalk
-
-[TIZEN]
-tizen_user=app
+++ /dev/null
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) year name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
+++ /dev/null
-## Dependency:
-
-1. python2.7
-2. python-setuptools python-support python-pip
- 1. Ubuntu
- `sudo apt-get install python-setuptools python-support python-pip`
- 2. Fedora(RHEL)
- `sudo yum install python-setuptools python-support python-pip`
- 3. openSUSE(TIZEN)
- `sudo zypper install python-setuptools python-support python-pip`
-3. python-requests(>=1.1)
- `sudo pip install requests`
-
-## How to build Debian package:
-
-Host with Ubuntu OS recommended.
-
-Run the command below to build from source code and get Debian package:
-
-`dpkg-buildpackage`
-
-## How to build RPM package:
-
-Host with Fedora OS recommended.
-
-Run the command below to build from source code and get RPM package:
-
-```
-make -C packaging/
-rpmbuild -tb packaging/testkit-lite_<version>.tar.gz --nodeps
-```
-
-Host with Ubuntu OS, we need to add a workaround to support the RPM build:
-
-`rpmbuild --define 'python_sitelib /usr/lib/python2.7/site-packages' -tb packaging/testkit-lite_<version>.tar.gz --nodeps`
-
-## How to install:
-
-Install testkit lite from source code:
-
-`sudo python setup.py install --record /var/log/testkit-lite.files`
-
-Install testkit lite from debian build:
-
-`sudo dpkg -i ../testkit-lite_<version>_all.deb`
-
-## How to uninstall:
-
-Uninstall testkit-lite installed with `setup.py install`:
-
-`cat /var/log/testkit-lite.files | sudo xargs rm -rf`
-
-Uninstall testkit-lite installed with `debian`:
-
-`sudo dpkg -r testkit-lite`
-
-## How to use:
-
-1. You can run case on target:
- 1. For web test cases:
-
- `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>'`
-
- 2. For native test cases:
-
- `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"`
-
-2. You can run case in single mode :
- 1. For web test cases:
-
- `testkit-lite -f "<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>' --comm localhost`
-
- 2. For native test cases:
-
- `testkit-lite -f "<somewhere>/<package_name>/tests.xml" --comm localhost`
-
-3. You can select on parser engine to simply conduct one or more `tests.xml` on target:
-
- `testkit-lite -f device:"<somewhere>/<package_name1>/tests.xml ... <somewhere>/<package_namen>/tests.xml" -e 'WRTLauncher <package_name1> ... <package_namen>'`
-
-4. If you want to execute both auto and manual tests:
-
- `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"`
-
-5. If you just want to execute manual tests:
-
- `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -M`
-
-6. If you just want to execute auto tests:
-
- `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -A`
-
-7. If you want to save test result to another file, by default it'll be under `/opt/testkit/lite/latest`:
-
- `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -o <somewhere>/xxx.xml`
-
-8. If you want to choose some filters:
-
- `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --status level1 --type type1 ...`
-
-9. If you want to run test according capability:
-
- `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --capability capability.xml`
-
-10. At last, you can freely compose the above parameters together:
-
- `testkit-lite -f <somewhere1>/tests.xml <somewhere2>/tests.xml -A --priority P1 --type type1 ...`
-
-## Get Results:
-
-Test report will be generated as tests.result.xml.The result will be under `/opt/testkit/lite/latest` after execution, you can also check the history results in `/opt/testkit/lite/yyyy-mm-dd-HH:MM:SS.NNNNNN`.
-
-## View Results:
-
-Test report can be viewed in HTML format, so the data in the xml result file looks more human friendly.
-
-Please follow the following steps to view test report:
-
-1. Copy files: `application.js back_top.png jquery.min.js testresult.xsl tests.css` under directory `/opt/testkit/lite/xsd/`
-2. Put the files from step 1) under the same directory as the xml result file
-3. Open xml result file with a web browser(IE, Chrome or Firefox)
-
-## Known Issues:
-
-N/A
+++ /dev/null
-[public_version]
-version=TESTKIT2_3.0
-[internal_version]
-version=TESTKIT2_3.0.1-151106
+++ /dev/null
-testkit-lite (3.1.12) unstable; urgency=low
-
- * Public Release.
-
- -- Shaofeng Tang <shaofeng.tang@intel.com> Fri, 21 Feb 2014 11:13:11 +0800
+++ /dev/null
-Source: testkit-lite
-Section: utils
-Priority: standard
-Maintainer: Cathy Shen <cathy.shen@intel.com>
-Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
-Standards-Version: 3.9.3
-Homepage: https://github.com/testkit/testkit-lite
-#Vcs-Git: git://git.debian.org/collab-maint/testkit-manager.git
-#Vcs-Browser: http://git.debian.org/?p=collab-maint/testkit-manager.git;a=summary
-
-Package: testkit-lite
-Architecture: all
-Depends: ${misc:Depends}, ${python:Depends}, python-dbus, python-gobject, python-gtk2
-XB-Python-Version: ${python:Versions}
-Description: Test runner for test execution.
-
+++ /dev/null
-Format: http://dep.debian.net/deps/dep5
-Source: https://github.com/testkit/testkit-lite
-
-Files: *
-Copyright: 2012-2013 Intel Corp.
-License: GPL-2.0
-
-Files: debian/*
-Copyright: 2012-2013 Intel Corp.
-License: GPL-2.0
-
-License: GPL-2.0
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 2 of the License
- .
- This package is distributed in the hope that 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, see <http://www.gnu.org/licenses/>.
- .
- On Debian systems, the complete text of the GNU General
- Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
-
+++ /dev/null
-testkit-lite_3.1.12_all.deb utils standard
+++ /dev/null
-#!/bin/sh
-
-# Set permissions
-mkdir -p /opt/testkit/lite3.0/test_packages
-chmod ugo+rwx -R /opt/testkit/lite3.0
-ln -fs /usr/share/pyshared/testkitlite /usr/lib/python2.7/dist-packages/testkitlite
-
+++ /dev/null
-#!/usr/bin/make -f
-
-%:
- dh $@
-
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitdocdir = /opt/testkit/lite3.0/doc
-dist_testkitdoc_DATA = testkit-lite_user_guide_for_tct.pdf
+++ /dev/null
-PKG_NAME := testkit-lite
-SPECFILE = $(addsuffix .spec, $(PKG_NAME))
-PKG_VERSION := $(shell grep '^Version: ' $(SPECFILE)|awk '{print $$2}')
-
-TARBALL := $(PKG_NAME)_$(PKG_VERSION).tar.gz
-
-dsc: $(TARBALL)
- $(eval MD5=$(shell md5sum $(TARBALL) | sed "s/ / $(shell stat -c '%s' $(TARBALL)) /"))
- @sed -i 's/^Version:.*/Version: $(PKG_VERSION)/' $(PKG_NAME).dsc
- @sed -i 's/ [a-f0-9]\+ [0-9]\+ $(PKG_NAME).*tar.*/ $(MD5)/' $(PKG_NAME).dsc
-
-$(TARBALL):
- cd "$$(git rev-parse --show-toplevel)" \
- && git archive --prefix $(PKG_NAME)-$(PKG_VERSION)/ HEAD \
- | gzip > "$(CURDIR)/$(TARBALL)"
-
-clean:
- rm -f $(PKG_NAME)*.tar.gz
-
-all: clean dsc
-
+++ /dev/null
-Source: testkit-lite
-Section: utils
-Priority: standard
-Maintainer: Lei Yang <lei.a.yang@intel.com>
-Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
-Standards-Version: 3.9.2
-Homepage: https://github.com/testkit/testkit-manager
-Version: 3.1.12
-Files:
- e3b0bfd4442c7301aa9982201c6ebd3b 1398131 testkit-lite_3.1.11.tar.gz
-
+++ /dev/null
-Summary: TCT-Lite
-Name: testkit-lite
-Version: 3.1.12
-Release: 1
-License: GPLv2
-Group: Applications/System
-Source: %{name}_%{version}.tar.gz
-
-BuildRequires: python-distribute
-
-%{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
-
-%description
-testkit-lite is a test runner with command-line interface.It has the following functions
-1. Accepts .xml test case descriptor files as input.
-2. drives automatic test execution.
-3. provide multiple options to meet various test requirements.
-
-%prep
-%setup -q
-
-%build
-
-%install
-python setup.py install --prefix=%{_prefix} --root=%{buildroot}
-# remove tests
-rm -rf %{buildroot}/%{python_sitelib}/tests
-
-%clean
-rm -rf %{buildroot}
-
-%post
-# Set permissions
-chmod ugo+rwx /opt/testkit/lite3.0
-
-%files
-%{python_sitelib}/testkitlite/*
-%{python_sitelib}/testkit_lite-*.egg-info/*
-/etc/dbus-1/system.d/com.intel.testkit.conf
-/opt/testkit/lite3.0/VERSION
-/opt/testkit/lite3.0/commodule/CONFIG
-/opt/testkit/lite3.0/mh.html
-%{_bindir}/testkit-lite
-%{_bindir}/testkit-lite-dbus
-%defattr(-,root,root)
-
-%doc
-/opt/testkit/lite3.0/testkit-lite_user_guide.pdf
-/opt/testkit/lite3.0/testkit-lite_tutorial.pdf
-/opt/testkit/lite3.0/test_definition_schema.pdf
-
-%changelog
+++ /dev/null
-<html>
-<head>
-<title>Web Manual Test Harness</title>
-<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<style type="text/css">
-body { font-family:Verdana; font-size:14px; margin:0;}
-#container-div {border: 0;margin:0 auto; width:100%;}
-#sidebar-left {border: 0;float:left; width:6px; height:100%;}
-#sidebar-right {border: 0;float:right; width:6px; height:100%;}
-#content-div {border: 0;margin:0 7px !important; height:100%;}
-.button {display:inline-block;min-width: 30px; max-width: 100px; margin-top: 3px;margin-bottom: 3px;padding: 3px}
-#back-bt, #forward-bt {max-width: 20px;}
-#case-info-area {border 0;text-align:left;}
-#test-entry, #refer-test-entry {font-size: 10px;color: red}
-#test-entry-area, #refer-test-entry-area {font-size: 10px;}
-#run-test-area, #result-area {text-align:right; margin:0 auto;padding:0;}
-iframe {border: 1px solid black;width: 100%; height: 600px;}
-</style>
-<script>
-function run_test(){
- document.getElementById("test-area").src = document.getElementById("test-entry").textContent;
-};
-
-function run_refer_test(){
- document.getElementById("test-area").src = document.getElementById("refer-test-entry").textContent;
-};
-
-function result_handler(){
- try{
- window.stop();
- } catch(e) {
- document.execCommand('Stop');
- }
- window.stop();
- document.getElementById("case-info-area").className = this.name
-};
-
-function init_mh(){
- document.getElementById("case-info-area").className = "READY";
- document.getElementById("run-test-bt").addEventListener("click", run_test, false);
- document.getElementById("run-refer-test-bt").addEventListener("click", run_refer_test, false);
- document.getElementById("back-bt").addEventListener("click", result_handler, false);
- document.getElementById("pass-bt").addEventListener("click", result_handler, false);
- document.getElementById("fail-bt").addEventListener("click", result_handler, false);
- document.getElementById("block-bt").addEventListener("click", result_handler, false);
- document.getElementById("forward-bt").addEventListener("click", result_handler, false);
- document.getElementById("done-bt").addEventListener("click", result_handler, false);
-};
-</script>
-</head>
-<body onload="init_mh()">
-<div id="container-div">
- <div id="sidebar-left"></div>
- <div id="sidebar-right"></div>
- <div id="content-div">
- <div id="run-test-area">
- <input type="button" id="back-bt" name="BACK" class="button" value="<"></input>
- <input type="button" id="run-test-bt" class="button" value="Run Test"></input>
- <input type="button" id="run-refer-test-bt" class="button" value="Run Refer Test"></input>
- <input type="button" id="forward-bt" name="FORWARD" class="button" value=">"></input>
- </div>
- <div id=result-area>
- <input type="button" id="pass-bt" name="PASS" class="button" value="PASS"></input>
- <input type="button" id="fail-bt" name="FAIL" class="button" value="FAIL"></input>
- <input type="button" id="block-bt" name="BLOCK" class="button" value="BLOCK"></input>
- <input type="button" id="done-bt" name="DONE" class="button" value="DONE"></input>
- </div>
- <div id="case-info-area">
- <div id="test-entry-area">Test Entry: <span id="test-entry">http://www.baidu.com</span></div>
- <div id="refer-test-entry-area">Refer Test Entry: <span id="refer-test-entry">http://www.sina.com</span></div>
- </div>
- <iframe id="test-area"></iframe>
- </div>
-</div>
-</body>
-</html>
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Yuanyuan,Zou <yuanyuanx.zou@intel.com>
-
-from setuptools import setup, find_packages
-import os
-from stat import ST_MODE, S_ISDIR
-from distutils.command.install_data import install_data
-
-
-class post_install_cmd(install_data):
- def run (self):
- install_data.run(self)
- if os.name == 'posix':
- for path in ['/opt/testkit/lite3.0','/opt/testkit/lite3.0/commodule/']:
- try:
- mode = os.stat(path)[ST_MODE]
- mode |= 066
- os.chmod(path, mode)
- except OSError as err:
- pass
-
-
-setup(
- name = "testkit-lite",
- description = "Test runner for test execution",
- url = "https://github.com/testkit/testkit-lite",
- author = "Shaofeng Tang",
- author_email = "shaofeng.tang@intel.com",
- version = "3.1.12",
- include_package_data = True,
- data_files = [('/opt/testkit/lite3.0', ['VERSION', 'doc/testkit-lite_user_guide.pdf', 'doc/testkit-lite_tutorial.pdf', 'doc/test_definition_schema.pdf']),
- ('/opt/testkit/lite3.0/commodule/', ['CONFIG']),
- ('/opt/testkit/lite3.0', ['resource/mh.html']),
- ('/etc/dbus-1/system.d/', ['dbus/com.intel.testkit.conf'])],
- scripts = ('testkit-lite', 'dbus/testkit-lite-dbus'),
- packages = find_packages(),
- cmdclass = {'install_data': post_install_cmd},
-)
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Jing,Wang <jing.j.wang@intel.com>
-# Yuanyuan,Zou <yuanyuanx.zou@intel.com>
-""" testkit lite tools"""
-
-import os
-import sys
-import traceback
-import platform
-import signal
-import ConfigParser
-import re
-import xml.etree.ElementTree as etree
-from optparse import OptionParser, make_option
-from datetime import datetime
-import json
-
-from testkitlite.util.errors import TestCaseNotFoundException, TestEngineException
-
-
-os.environ["DBUS_SESSION_BUS_ADDRESS"]='unix:path=/run/dbus/system_bus_socket'
-os.environ["DISPLAY"]=':0.0'
-
-try:
- # import logger
- from testkitlite.util.log import LOGGER
-except ImportError, err:
- print "[ Error: loading logging failed, error: %s ]\n" % err
- print "try to run command " \
- "'export PYTHONPATH=/usr/local/lib/python2.7/dist-packages' or " \
- "'export PYTHONPATH=/usr/local/lib/python2.7/site-packages' to resolve module missed issue"
- sys.exit(1)
-
-
-# get platform version info
-OS_VER = platform.system()
-JOIN = os.path.join
-EXISTS = os.path.exists
-DIRNAME = os.path.dirname
-BASENAME = os.path.basename
-ABSPATH = os.path.abspath
-SPLIT = os.path.split
-ISLINK = os.path.islink
-
-TESTKIT_DIR = "/opt/testkit/lite3.0"
-if not OS_VER == "Linux" and not OS_VER == "Darwin":
- TESTKIT_DIR = DIRNAME(ABSPATH(__file__))
- sys.path += [JOIN(TESTKIT_DIR)]
- TESTKIT_DIR = JOIN(TESTKIT_DIR, "results")
-
-LOG_DIR = TESTKIT_DIR
-TEST_PACKAGES_DIR = JOIN(TESTKIT_DIR, "test_packages")
-COMMON_FILTERS = {
- "suite": [],
- "set": [],
- "priority": [],
- "id": [],
- "type": [],
- "status": [],
- "component": [],
- "set_type": []}
-down_status = False
-remote_test = False
-can_merge_result = False
-device_id = ""
-device_locked = False
-RUNNER = None
-
-# detect version option
-if "--version" in sys.argv:
- try:
- CONFIG = ConfigParser.ConfigParser()
- if platform.system() == "Linux":
- CONFIG.read('/opt/testkit/lite3.0/VERSION')
- else:
- VERSION_FILE = JOIN(sys.path[0], 'VERSION')
- CONFIG.read(VERSION_FILE)
- VERSION = CONFIG.get('public_version', 'version')
- LOGGER.info("V%s" % VERSION)
- sys.exit()
- except ConfigParser.Error, err:
- LOGGER.error(
- "[ Error: fail to parse version info, error: %s ]\n" % err)
- sys.exit(1)
-
-# detect internal version option
-if "--internal-version" in sys.argv:
- try:
- CONFIG = ConfigParser.ConfigParser()
- if platform.system() == "Linux":
- CONFIG.read('/opt/testkit/lite3.0/VERSION')
- else:
- VERSION_FILE = JOIN(sys.path[0], 'VERSION')
- CONFIG.read(VERSION_FILE)
- VERSION = CONFIG.get('internal_version', 'version')
- print VERSION
- sys.exit()
- except ConfigParser.Error, err:
- print "[ Error: fail to parse version info, error: %s ]\n" % err
- sys.exit(1)
-#try:
-# CONFIG = ConfigParser.ConfigParser()
-# CONFIG.read('/opt/testkit/lite3.0/commodule/CONFIG')
-# tizen = CONFIG.get('TIZEN_USER','tizen_user')
-# if tizen:
-# os.environ['TIZEN_USER'] = tizen
-#except:
-# pass
-
-def varnarg(option, opt_str, value, parser):
- """ parser srg"""
- value = []
- import re
- for arg in parser.rargs:
- if re.search('^--.+', arg) or \
- re.search('^-[\D]', arg):
- break
- value.append(arg)
-
- del parser.rargs[:len(value)]
- setattr(parser.values, option.dest, value)
-
-def unlock_and_exit(exit_code=signal.SIGINT):
- if device_locked:
- release_device_lock(device_id)
- sys.exit(exit_code)
-
-def final_clean_test():
- try:
- if RUNNER is not None:
- if RUNNER.session_id:
- RUNNER.finalize_test(RUNNER.session_id)
- if can_merge_result:
- RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
- if down_status:
- clean_testxml(OPTIONS.testxml, remote_test)
- except (KeyboardInterrupt, Exception), err:
- pass
-
-def sig_exit_handler(*args):
- final_clean_test()
- LOGGER.info("\n[ exiting testkit-lite on system signal ]\n")
- unlock_and_exit()
-
-if platform.system() == "Linux":
- signal.signal(signal.SIGTSTP, sig_exit_handler)
-signal.signal(signal.SIGTERM, sig_exit_handler)
-try:
- OPTION_LIST = [
- make_option("-f", "--testxml", dest="testxml",
- action="callback", callback=varnarg,
- help="Specify the path of test definition file (tests.xml)."
- " If run more one test package,just list the all the path "
- " of \"tests.xml\" and separate with a whitespace"),
- make_option("-D", "--dryrun", dest="bdryrun",
- action="store_true",
- help="Dry-run the selected test cases"),
- make_option("-M", "--manual-only", dest="bmanualonly",
- action="store_true",
- help="Enable only manual tests"),
- make_option("-A", "--auto-only", dest="bautoonly",
- action="store_true",
- help="Enable only auto tests"),
- make_option("-o", "--output", dest="resultfile",
- help="Specify output file for result xml. \
- If more than one testxml provided, \
- results will be merged together to this output file"),
- make_option("-e", dest="exttest", action="store",
- help="Launch external test with a launcher,\
- supports browser or other web-runtime"),
- make_option("-k", "--worker", dest="worker", action="store",
- help="Specify a test engine for execution, use value 'default' by default"),
- # make_option("-p", "--target-platform", dest="targetplatform",
- # action="store",
- # help="specify special test target platform, e.g. xw_android, chrome_ubuntu"),
- # make_option("--webdriver-url", dest="wdurl", action="store",
- # help="specify special web driver listening url"),
- make_option("--version", dest="version_info", action="store_true",
- help="Show version information"),
- make_option("--internal-version", dest="internal_version_info",
- action="store_true",
- help="Show internal version information"),
- make_option("--deviceid", dest="device_serial", action="store",
- help="set device serial information"),
- make_option("--testprefix", dest="test_prefix", action="store",
- help="set prefix for test case entry"),
- make_option("--testenvs", dest="test_env", action="store",
- help="set environs for test case execution, use ';' to separator multi option"),
- make_option("--comm", dest="commodule", action="store",
- help="set commodule by default,"
- "set \"localhost\" for local web testing"),
- make_option("--capability", dest="capability", action="store",
- help="set platform for sepecfic device capability"),
- make_option("--debug", dest="debug", action="store_true",
- help="run in debug mode,more log information print out"),
- make_option("--rerun", dest="rerun", action="store_true",
- help="check if rerun test mode"),
- make_option("--non-active", dest="non_active", action="store_true",
- help="Disable the ability to set the result of \
- core manual cases from the console"),
- # make_option("-d", "--debugip", dest="debugip", action="store",
- # help="specify tizen xwalk debug ip "),
- make_option("--init-script", dest="initscript", action="store",
- help="init script before script"),
- make_option("--post-script", dest="postscript", action="store",
- help="post script"),
- make_option('--disable-dlog', dest="disabledlog", action="store_true",
- help="disable dlog information"),
- # make_option('--user', dest="user", action="store",
- # help="setting test user")
- make_option("--tizen-version", dest="tizenversion", action="callback", callback=varnarg, help="set tizen version infomation"),
- make_option("--skip-tc", dest="skip_tc", action="callback", callback=varnarg, help ="Specify the testcase id for exclude from the test"),
- make_option("--stub-port", dest="stubport", action="callback", callback=varnarg, help = "set testkit-stub port number")
- ]
-
- OPTION_LIST.extend([
- make_option("--%s" % flt,
- dest="w%s" % flt, action="callback", callback=varnarg,
- help="Select the specified filter-rules : %s" % flt)
- for flt in COMMON_FILTERS])
-
- try:
- # untrusted behaviour of %%prog
- USAGE = "%%prog [options] -f [prefix:]\"<somewhere/test.xml>\" \n\
-forms: %%prog -f [prefix:]\"<somewhere>/test.xml\" \n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" -D\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" -A\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" -M\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --set <set_name>\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --type <type_name>\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --status <status_name>\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --priority <priority_value>\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --component <component_name>\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --id <case_id>\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --capability <capability_file> --comm <comm_type>\n\
- %%prog -f [prefix:]\"<somewhere>/test.xml\" --comm <comm_type>\n\
- %%prog -f [prefix:]\"<somewhere>/test1.xml <somewhere>/test2.xml <somewhere>/test3.xml\" \n\
- %%prog -f [prefix:]\"<somewhere>/test1.xml <somewhere>/test2.xml <somewhere>/test3.xml --testenvs 'wd-url=...;wd-debugip=...'\" \n\
-exmaples of \"prefix\" usage: \n\
- run a web test with a test definition (XML file) from device side: \n\
- %%prog -f device:\"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -A \n\
- run a web test with a test definition (XML file) from localhost: \n\
- %%prog -f \"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -A \n\
-exmaples of \"-e\" usage: \n\
- run a web test package with TIZEN web-runtime, launcher provided in tests.xml, so \"-e\" is omitted: \n\
- %%prog -f device:\"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -A \n\
- run a web test package with chrome browser: \n\
- %%prog -f \"/usr/share/webapi-webkit-tests/tests.xml\" -e \
-'google-chrome --allow-file-access-from-files --disable-web-security --start-maximized --user-data-dir=/home/test/data /home/test/webrunner/index.html' -A --comm localhost \n\
-\n\
-Note: \n\
- 1) Proxy settings should be disabled when execute webapi packages\n\
- 2) TestLog is stored to %s/latest\n\
- 3) %%prog enables both auto and manual tests by default\n\
- 4) Obviously -A and -M are conflict options\n\
- 5) -e option does not support -D mode\n\
- 6) The test cases' order in the result files might be arbitrary,\
-when running same tests.xml with same options. This is caused \
-by python's API 'getiterator' from module 'xml.etree.ElementTree'\n\
- 7) run command 'testkit-lite', \
-it might not be able to locate module 'testkitlite.engines.\
-default.runner', \
-run command 'export PYTHONPATH=/usr/local/lib/python2.7/dist-packages' or \
-run command 'export PYTHONPATH=/usr/local/lib/python2.7/site-packages' \
-to resolve this issue" % (LOG_DIR)
- except Exception:
- USAGE = None
-
- # detect non-params
- if len(sys.argv) == 1:
- sys.argv.append("-h")
-
- PARSERS = OptionParser(option_list=OPTION_LIST, usage=USAGE)
- (OPTIONS, ARGS) = PARSERS.parse_args()
- # init test engine here
- from testkitlite.util.connector import ConnectorBuilder
- from testkitlite.util.process import get_device_lock, release_device_lock, clean_testxml
- from testkitlite.util.session import TestSession
- from testkitlite.util.errors import TestCaseNotFoundException, TestEngineException
-
- #execute_type
- exec_types = ["auto","manual"]
- if OPTIONS.bautoonly and OPTIONS.bmanualonly:
- raise ValueError("-A and -M are conflict")
- elif OPTIONS.bautoonly:
- exec_types.remove("manual")
- elif OPTIONS.bmanualonly:
- exec_types.remove("auto")
-
- if OPTIONS.worker and OPTIONS.worker != 'webdriver':
- raise ValueError('-k is just service for webdriver, you can not set it ,using default')
-
- debugip = None
- if OPTIONS.test_env:
- #envs = OPTIONS.test_env.replace(';',' ').split(' ')
- envs = OPTIONS.test_env.split(';')
- for env_t in envs:
- env_t = env_t.strip()
- if not env_t:
- continue
- k, v = env_t.split('=')
- if 'app_launcher' in v:
- os.environ[k.strip()] = "app_launcher -s"
- else:
- os.environ[k.strip()] = v.strip()
- if cmp(k.strip(),"wd-debugip") == 0:
- debugip = v.strip()
- if not os.environ.has_key('TIZEN_USER'):
- try:
- CONFIG = ConfigParser.ConfigParser()
- CONFIG.read('/opt/testkit/lite3.0/commodule/CONFIG')
- tizen = CONFIG.get('TIZEN','tizen_user')
- if tizen:
- os.environ['TIZEN_USER'] = tizen
- except:
- pass
- # connector options
- conn_opt = {}
- #conn_opt['commodule'] = OPTIONS.commodule or "tizenmobile"
- conn_opt['commodule'] = OPTIONS.commodule or "localhost"
- conn_opt['deviceid'] = OPTIONS.device_serial
- CONNECTOR = ConnectorBuilder(conn_opt).get_connector()
- if CONNECTOR == None:
- sys.exit(1)
-
- device_id = CONNECTOR.get_device_info()['device_id']
- os.environ['DEVICE_ID'] = device_id
- if not OPTIONS.non_active:
- device_locked = get_device_lock(device_id)
- if not device_locked:
- LOGGER.error("[ Error: Failed to get device for current session... ]\n")
- sys.exit(1)
-
- #modify at 2014.09.11
- targetplatform = None
- #debugip = None
- if OPTIONS.exttest and OPTIONS.worker and OPTIONS.worker.upper() == 'WEBDRIVER':
- if conn_opt['commodule'] == 'localhost':
- targetplatform = "chrome_ubuntu"
- os.environ['targetplatform'] = targetplatform
- elif conn_opt['commodule'] == 'tizenmobile':
- targetplatform = "xw_tizen"
- os.environ['targetplatform'] = targetplatform
- elif conn_opt['commodule'] == 'androidmobile':
- targetplatform = "xw_android"
- os.environ['targetplatform'] = targetplatform
- # process test environ
- if OPTIONS.test_env:
- #envs = OPTIONS.test_env.replace(';',' ').split(' ')
- envs = OPTIONS.test_env.split(';')
- for env_t in envs:
- env_t = env_t.strip()
- if not env_t:
- continue
- k, v = env_t.split('=')
- if 'app_launcher' in v:
- os.environ[k.strip()] = "app_launcher -s"
- else:
- os.environ[k.strip()] = v.strip()
-
- # load profile for wedrvier
- if targetplatform:
- webdriver_vars = {}
- exec 'from testkitlite.capability.%s import initCapability' % targetplatform
- if targetplatform.upper().find('TIZEN') >= 0:
- if not debugip:
- raise ValueError("For tizen xwalk, option --debugip is needed!")
- webdriver_vars = initCapability('TEST_APP_ID', debugip)
- elif targetplatform.upper().find('ANDROID') >= 0:
- webdriver_vars = initCapability('TEST_PKG_NAME', 'TEST_ACTIVITY_NAME')
- else:
- webdriver_vars = initCapability()
- os.environ['WEBDRIVER_VARS'] = json.dumps(webdriver_vars)
-
- # process test environ
- # if OPTIONS.test_env:
- # envs = OPTIONS.test_env.replace(';',' ').split(' ')
- # for env_t in envs:
- # env_t = env_t.strip()
- # if not env_t:
- # continue
- # k, v = env_t.split('=')
- # os.environ[k.strip()] = v.strip()
- if OPTIONS.initscript:
- os.environ['initscript'] = OPTIONS.initscript
- if OPTIONS.postscript:
- os.environ['postscript'] = OPTIONS.postscript
- # load test defintion files
- if "device:" in OPTIONS.testxml[0]:
- if not CONNECTOR.is_support_remote():
- raise ValueError("For '%s' mode, please test file without prefix 'device:' " % conn_opt['commodule'])
-
- remote_test = True
- try:
- if not EXISTS(TEST_PACKAGES_DIR):
- os.makedirs(TEST_PACKAGES_DIR)
- except OSError, err:
- LOGGER.error("[ Error: "
- "can't create test package directory: %s, error: %s ]\n" %
- (TEST_PACKAGES_DIR, err))
- unlock_and_exit()
- REMOTE_TESTLITS = OPTIONS.testxml[0]
- REMOTE_TESTLITS = REMOTE_TESTLITS.split(':')[1]
- TESTLISTARRARY = REMOTE_TESTLITS.split()
- LOCALARRY = []
-
- for remote_file in TESTLISTARRARY:
- tmp_remote_file = SPLIT(remote_file)
- tmp_remote_folder = BASENAME(tmp_remote_file[0])
- tmp_remote_test_xml = JOIN(
- tmp_remote_folder, tmp_remote_file[1])
- local_test_package = JOIN(
- TEST_PACKAGES_DIR, tmp_remote_test_xml)
- down_status = CONNECTOR.download_file(remote_file, local_test_package)
- if not down_status:
- LOGGER.error("Failed to get test file '%s' from device"
- % remote_file)
- unlock_and_exit()
- LOCALARRY.append(local_test_package)
- OPTIONS.testxml = LOCALARRY
- else:
- if len(OPTIONS.testxml) == 1:
- i, start, end = 0, 0, 0
- LOCAL_TESTLISTS = []
- temp_xml = OPTIONS.testxml[0]
- while(i < len(temp_xml)):
- tmp = temp_xml[i:len(temp_xml)]
- if ".xml" in tmp:
- index = tmp.index(".xml") + 4 + i
- end = index
- i = index + 1
- LOCAL_TESTLISTS.append(temp_xml[start:end])
- start = index + 1
- else:
- LOGGER.error("No xml found")
- break
- OPTIONS.testxml = LOCAL_TESTLISTS
-
-
- # load test engine
- if OPTIONS.worker:
- os.environ['WORKER'] = OPTIONS.worker
-
- workername = OPTIONS.worker or 'default'
- try:
- exec "from testkitlite.engines.%s import TestWorker" % workername
- except Exception as error:
- raise TestEngineException(workername)
- WORKER = TestWorker(CONNECTOR)
-
- # create runner
- RUNNER = TestSession(CONNECTOR, WORKER)
- # apply all options
- RUNNER.set_global_parameters(OPTIONS)
-
- if OPTIONS.tizenversion is None:
- LOGGER.error("[ Error : input your tizen version ]\n")
- sys.exit(1)
- else :
- tizenver = OPTIONS.tizenversion[0]
- VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d|^tizen_csharp_\d.\d"
- pa = re.compile(VER_PATTERN, re.I)
- ma = pa.match(tizenver)
- if ma is None:
- LOGGER.error("A required \"/opt/tct/"+tizenver+" could not be found.\n")
- sys.exit(1)
-
- RUNNER.set_tizenversion(tizenver)
-
- if OPTIONS.stubport is not None:
- port = OPTIONS.stubport[0]
- RUNNER.set_stubport(port)
-
- if OPTIONS.skip_tc is not None:
- RUNNER.set_skip_tc(OPTIONS.skip_tc)
-
- # set capability
- if not RUNNER.get_capability(OPTIONS.capability):
- unlock_and_exit()
- # apply filter
- WFILTERS = {}
- for flt in COMMON_FILTERS:
- if eval('OPTIONS.w%s' % flt):
- WFILTERS[flt] = eval('OPTIONS.w%s' % flt)
- RUNNER.add_filter_rules(**WFILTERS)
-
- if not OPTIONS.testxml:
- LOGGER.error("[ Error: not specify a test xml... ]\n")
- unlock_and_exit()
- # 1) prepare log dir
- if OS_VER == "Linux" or OS_VER == "Darwin":
- SESSION = datetime.today().isoformat('-') + str(os.getpid()) + "_session"
- else:
- SESSION = datetime.today().strftime("%Y-%m-%d_%H_%M_%S") + \
- str(os.getpid()) + "_session"
- CURRENT_LOG_DIR = JOIN(LOG_DIR, SESSION)
- LATEST_DIR = JOIN(LOG_DIR, "latest")
- try:
- if EXISTS(LATEST_DIR):
- os.remove(LATEST_DIR)
- if ISLINK(LATEST_DIR):
- os.remove(LATEST_DIR)
- os.makedirs(CURRENT_LOG_DIR)
- if os.name == "posix":
- os.symlink(CURRENT_LOG_DIR, LATEST_DIR)
- except IOError, err:
- LOGGER.error("[ Error: create session log directory: "
- "%s failed, error: %s ]\n" % (CURRENT_LOG_DIR, err))
- except OSError, err:
- LOGGER.error("error : %s" % err)
- finally:
- if not EXISTS(CURRENT_LOG_DIR):
- os.makedirs(CURRENT_LOG_DIR)
-
- # 2) prepare run test
- # run more than one tests.xml
- # 1. run all auto cases from the xmls
- # 2. run all manual cases from the xmls
- TESTXMLS = set(OPTIONS.testxml)
- for t in TESTXMLS:
- if EXISTS(t):
- filename = t
- filename = os.path.splitext(filename)[0]
- if OS_VER == "Linux" or OS_VER == "Darwin":
- if not filename.startswith('/'):
- LOGGER.error("[ Error:"
- " xml file %s should start with '/' ]" % filename)
- unlock_and_exit()
- file_items = filename.split('/')
- else:
- file_items = re.split(r'[/\\]+', filename)
- if len(file_items) < 2 or file_items[-2] == "" or file_items[-1] == "":
- LOGGER.error("[ Error:"
- " unable to find package name from %s ]" % t)
- unlock_and_exit()
- filename = file_items[-2] + '_' + file_items[-1]
- filename = "%s.total" % BASENAME(filename)
- resultfile = "%s.xml" % filename
- resultfile = JOIN(CURRENT_LOG_DIR, resultfile)
- try:
- ep = etree.parse(t)
- suiteparent = ep.getroot()
- except etree.ParseError:
- LOGGER.error("[ Error: no case found in testxml, "
- "pls check the test package ]\n")
- unlock_and_exit()
- no_test_definition = 1
- for tf in ep.getiterator('test_definition'):
- no_test_definition = 0
- if no_test_definition:
- suiteparent = etree.Element('test_definition')
- suiteparent.tail = "\n"
- for suite in ep.getiterator('suite'):
- suite.tail = "\n"
- suiteparent.append(suite)
- WFILTERS['execution_type'] = exec_types
- RUNNER.add_filter_rules(**WFILTERS)
- RUNNER.apply_filter(suiteparent)
- # merge duplicated test set under suite node
- tset_list = set()
- for suite in ep.getiterator('suite'):
- for tset in suite.getiterator('set'):
- for testcase in tset.getiterator('testcase'):
- tset.remove(testcase)
- if tset.get('name') in tset_list:
- suite.remove(tset)
- else:
- tset_list.add(tset.get('name'))
- try:
- with open(resultfile, 'w') as output:
- tree = etree.ElementTree(element=suiteparent)
- tree.write(output)
- except IOError, err:
- LOGGER.error(
- "[ Error: create filtered total result file: %s failed, "
- "error: %s ]\n" % (resultfile, err))
- else:
- LOGGER.error("[ test xml file '%s' not found ]" % t)
- unlock_and_exit()
-
- for t in TESTXMLS:
- for e_type in exec_types:
- try:
- WFILTERS['execution_type'] = [e_type]
- RUNNER.add_filter_rules(**WFILTERS)
- RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
- except IOError, err:
- LOGGER.error("[ Error: prepare_run test xml: "
- "%s from testkit-lite failed, error: %s ]\n" % (t, err))
-
- START_TIME = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
- try:
- can_merge_result = True
- RUNNER.run_case(CURRENT_LOG_DIR)
- except TestCaseNotFoundException, err:
- LOGGER.info("\n[ Error: exiting testkit-lite on error: %s ]\n" % err)
- unlock_and_exit()
- except Exception, err:
- clean_testxml(TESTXMLS, remote_test)
- traceback.print_exc()
- LOGGER.error("[ Error: run test failed, error: %s ]\n" % err)
-
- try:
- RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
- clean_testxml(TESTXMLS, remote_test)
- LOGGER.info("[ all tasks for testkit lite are accomplished, goodbye ]")
- unlock_and_exit(0)
- except Exception, err:
- traceback.print_exc()
- clean_testxml(TESTXMLS,remote_test)
- LOGGER.error("[ Error: merge result failed, error: %s ]\n" % err)
- unlock_and_exit()
-except (TestEngineException, KeyboardInterrupt), err:
- final_clean_test()
- LOGGER.info("\n[ exiting testkit-lite on user cancel ]\n")
- unlock_and_exit()
-except Exception, err:
- final_clean_test()
- LOGGER.error("\n[ Error: exiting testkit-lite due to critical error: %s ]\n" % err)
- traceback.print_exc()
- unlock_and_exit()
+++ /dev/null
-#!/usr/bin/python
-#
-# Copyright (C) 2014 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Nicolas Zingile <n.zingile@gmail.com>
-
-import argparse
-from testkitmerge.merger import *
-
-def main():
- argparser = argparse.ArgumentParser(description='Tool to merge testkit result xml files')
- argparser.add_argument('-f', '--files', help='list of testkit xml result files', nargs='+')
- argparser.add_argument('-o', '--outdir', help='output directory of final result file', required=True)
- argparser.add_argument('-n', '--name', help ='name of the final result file', default='result.xml')
- args = argparser.parse_args()
- print args
-
- parser = etree.XMLParser(strip_cdata=False)
- sourcexmltree = None
- resultxmltree = None
-
- for resultxml in args.files:
- if not os.path.isfile(resultxml):
- print "Error: the file '" + resultxml + "'doesn't exist !"
- exit(1)
- if not resultxml.endswith('.xml'):
- print "Error: '" + resultxml + "' is not an xml file !"
- exit(1)
- for index in range(len(args.files)):
- sourcexmltree = etree.parse(args.files[index], parser)
- resultxmltree = merge_testkitxml(sourcexmltree, resultxmltree)
-
- resultxmltree.write(os.path.join(args.outdir, args.name), pretty_print=True, encoding='utf8', method='xml', xml_declaration=True)
-
-if __name__ == "__main__":
- main()
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-SUBDIRS = common engines
-
-testkitlitedir = /usr/lib/python2.7/dist-packages/testkitlite
-dist_testkitlite_SCRIPTS = __init__.py
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitlitecapdir = /usr/lib/python2.7/dist-packages/testkitlite/capability
-dist_testkitlitecap_SCRIPTS = *.py
+++ /dev/null
-def initCapability(test_app=None, test_ext=None):
- capability = {'chrome.binary': '/usr/bin/chromium-browser'}
- return {'webdriver_url': 'http://127.0.0.1:9515', 'desired_capabilities': capability, 'test_prefix': 'file:///'}
+++ /dev/null
-def initCapability(test_name=None, test_ext=None, webdriver_url='http://127.0.0.1:9515', test_prefix='file:///android_asset/www/'):
- capability = {'xwalkOptions': {'androidPackage':test_name, 'androidActivity': test_ext}}
- return {'webdriver_url': webdriver_url, 'desired_capabilities': capability, 'test_prefix': test_prefix }
+++ /dev/null
-def initCapability(test_app=None, test_ext=None, webdriver_url='http://127.0.0.1:9515', test_prefix=''):
- capability = {'xwalkOptions': {
- 'tizenDebuggerAddress': test_ext,
- 'tizenAppId': test_app
- }
- }
-# print capability
- return {'webdriver_url':webdriver_url , 'desired_capabilities': capability, 'test_prefix': test_prefix}
+++ /dev/null
-[LOGGING]
-log_level=INFO
-
-[EXTENSION]
-crosswalk=--external-extensions-path=/usr/lib/tizen-extensions-crosswalk
-
-[TIZEN]
-tizen_user=app
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Yuanyuan,Zou <yuanyuanx.zou@intel.com>
-
-
-commoduleimpldir = /usr/lib/python2.7/dist-packages/commodule
-dist_commoduleimpl_SCRIPTS = *.py
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-
-""" The implementation of Android communication driver"""
-
-import os
-import time
-import socket
-import threading
-import re
-
-from testkitlite.util.log import LOGGER
-from testkitlite.util.autoexec import shell_command, shell_command_ext
-from testkitlite.util.killall import killall
-from testkitlite.util.errors import InvalidDeviceException
-
-
-os.environ['TEST_PLATFORM'] = 'android'
-os.environ['CONNECT_TYPE'] = 'adb'
-LOCAL_HOST_NS = "127.0.0.1"
-APP_QUERY_STR = "adb -s %s shell ps | grep %s | awk '{print $2}' "
-APK_INSTALL = "adb -s %s shell pm install %s"
-APK_UNINSTALL = "adb -s %s shell pm uninstall %s"
-APK_LIST = "adb -s %s shell pm list packages |grep '%s'|cut -d ':' -f2"
-APP_NONBLOCK_STR = "adb -s %s shell '%s' &"
-APP_START = "adb -s %s shell am start -n %s"
-APP_STOP = "adb -s %s shell am force-stop %s"
-XWALK_APP_STR = "org.xwalk.%s/.%sActivity"
-
-
-LOGCAT_CLEAR = "adb -s %s shell logcat -c"
-LOGCAT_START = "adb -s %s shell logcat -v time"
-DMESG_CLEAR = "adb -s %s shell dmesg -c"
-DMESG_START = "adb -s %s shell cat /proc/kmsg"
-
-
-def debug_trace(cmdline, logfile):
- global debug_flag, metux
- wbuffile = file(logfile, "a")
- import subprocess
- exit_code = None
- proc = subprocess.Popen(args=cmdline,
- shell=True,
- stdout=wbuffile,
- stderr=None)
- while True:
- exit_code = proc.poll()
- if exit_code is not None:
- break
- time.sleep(0.5)
- metux.acquire()
- proc_flag = debug_flag
- metux.release()
- if not proc_flag:
- break
- wbuffile.close()
- if exit_code is None:
- killall(proc.pid)
-
-
-def _get_device_ids():
- """get android device list of ids"""
- result = []
- exit_code, ret = shell_command("adb devices")
- for line in ret:
- if str.find(line, "\tdevice") != -1:
- result.append(line.split("\t")[0])
- return result
-
-
-class AndroidMobile:
-
- """ Implementation for transfer data
- between Host and Android Mobile Device
- """
-
- def __init__(self, device_id=None):
- self.deviceid = device_id
- self.support_remote = True
-
- def is_support_remote(self):
- return self.support_remote
-
- def shell_cmd(self, cmd="", timeout=15):
- cmdline = "adb -s %s shell %s" % (self.deviceid, cmd)
- return shell_command(cmdline, timeout)
-
- def check_process(self, process_name):
- exit_code, ret = shell_command(
- APP_QUERY_STR % (self.deviceid, process_name))
- return len(ret)
-
- def kill_stub(self):
- #add this function to avoid webdriver issue, yangx.zhou@intel.com,2015.01.15
- wgt_name = "testkit.stub/.TestkitStub"
- pkg_name = wgt_name.split('/')[0]
- cmdline = APP_STOP % (self.deviceid, pkg_name)
- exit_code, ret = shell_command(cmdline)
-
-
- def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
- # self.kill_stub()
- wgt_name = "testkit.stub/.TestkitStub"
- # pkg_name = wgt_name.split('/')[0]
- # cmdline = APP_STOP % (self.deviceid, pkg_name)
- # exit_code, ret = shell_command(cmdline)
- cmdline = APP_START % (self.deviceid, wgt_name)
- debug_ext = " -e debug on" if debug_opt != "" else " -e debug off"
- port_ext = " -e port " + stub_port
- exit_code, ret = shell_command(cmdline + port_ext + debug_ext)
- time.sleep(2)
- return True
-
- def shell_cmd_ext(self,
- cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None,
- callbk=None):
- cmdline = "adb -s %s shell '%s; echo returncode=$?'" % (
- self.deviceid, cmd)
- return shell_command_ext(cmdline, timeout, boutput, stdout_file, stderr_file, callbk)
-
- def get_device_info(self):
- """get android device inforamtion"""
- device_info = {}
- device_info["device_id"] = self.deviceid
- device_info["resolution"] = "N/A"
- device_info["screen_size"] = "N/A"
- device_info["device_model"] = "N/A"
- device_info["device_name"] = "N/A"
- device_info["os_version"] = "N/A"
- device_info["build_id"] = "N/A"
- return device_info
-
- def download_file(self, remote_path, local_path):
- """download file from device"""
- cmd = "adb -s %s pull %s %s" % (self.deviceid, remote_path, local_path)
- exit_code, ret = shell_command(cmd)
- if exit_code != 0:
- error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
- LOGGER.info("[ Download file \"%s\" failed, error: %s ]"
- % (remote_path, error))
- return False
- else:
- return True
-
- def upload_file(self, remote_path, local_path):
- """upload file to device"""
- cmd = "adb -s %s push %s %s" % (self.deviceid, local_path, remote_path)
- exit_code, ret = shell_command(cmd)
- if exit_code != 0:
- error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
- LOGGER.info("[ Upload file \"%s\" failed,"
- " get error: %s ]" % (local_path, error))
- return False
- else:
- return True
-
- def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
- """get test option dict """
- test_opt = {}
- test_opt["suite_name"] = test_suite
- test_opt["launcher"] = test_launcher
- if test_launcher.find('xwalk') >= 0:
- if test_widget is not None and test_widget != "":
- test_suite = test_widget
- test_suite = test_suite.replace('-', '_')
- test_opt["test_app_id"] = XWALK_APP_STR % (test_suite, test_suite)
- else:
- test_opt["test_app_id"] = test_launcher
- return test_opt
-
- def get_server_url(self, remote_port="8000"):
- """forward request a host tcp port to targe tcp port"""
- if remote_port is None:
- return None
-
- os.environ['no_proxy'] = LOCAL_HOST_NS
- host = LOCAL_HOST_NS
- inner_port = 9000
- time_out = 2
- bflag = False
- while True:
- sock_inner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock_inner.settimeout(time_out)
- try:
- sock_inner.bind((host, inner_port))
- sock_inner.close()
- bflag = False
- except socket.error as error:
- if error.errno == 98 or error.errno == 13:
- bflag = True
- if bflag:
- inner_port += 1
- else:
- break
- host_port = str(inner_port)
- cmd = "adb -s %s forward tcp:%s tcp:%s" % \
- (self.deviceid, host_port, remote_port)
- exit_code, ret = shell_command(cmd)
- url_forward = "http://%s:%s" % (host, host_port)
- return url_forward
-
- def install_package(self, pkgpath):
- """install a package on android device:
- push package and install with shell command
- """
- cmd = APK_INSTALL % (self.deviceid, pkgpath)
- exit_code, ret = shell_command(cmd)
- return ret
-
- def uninstall_package(self, pkgname):
- """install a package on android device:
- push package and install with shell command
- """
- cmd = APK_UNINSTALL % (self.deviceid, pkgname)
- exit_code, ret = shell_command(cmd)
- return ret
-
- def get_installed_package(self):
- """get list of installed package from device"""
- cmd = APK_LIST % self.deviceid
- exit_code, ret = shell_command(cmd)
- return ret
-
- def start_debug(self, dlogfile):
- global debug_flag, metux
- debug_flag = True
- metux = threading.Lock()
- logcat_cmd = LOGCAT_CLEAR % self.deviceid
- exit_code, ret = shell_command(logcat_cmd)
- dmesg_cmd = DMESG_CLEAR % self.deviceid
- exit_code, ret = shell_command(logcat_cmd)
- logcat_cmd = LOGCAT_START % self.deviceid
- dmesg_cmd = DMESG_START % self.deviceid
- threading.Thread(target=debug_trace, args=(logcat_cmd, dlogfile+'.logcat')).start()
- threading.Thread(target=debug_trace, args=(dmesg_cmd, dlogfile+'.dmesg')).start()
-
- def stop_debug(self):
- global debug_flag, metux
- metux.acquire()
- debug_flag = False
- metux.release()
-
- def launch_app(self, wgt_name):
- blauched = False
- if wgt_name.find('xwalk') != -1:
- timecnt = 0
- blauched = False
- pkg_name, actv_name = wgt_name.split('/')
- actv_name = actv_name.strip('.')
- cmdline = APP_STOP % (self.deviceid, pkg_name)
- exit_code, ret = shell_command(cmdline)
- cmdline = APP_START % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- if len(ret) > 1:
- # remove Activity to retry
- actv_name = actv_name.replace('Activity', '')
- LOGGER.info("[ Retry to launch app: %s ]" % (pkg_name + '/.' + actv_name))
- cmdline = APP_START % (self.deviceid, pkg_name + '/.' + actv_name)
- exit_code, ret = shell_command(cmdline)
- if len(ret) > 1:
- # use capitalize to retry
- tmps = actv_name.split('_')
- actv_name = ''.join([it.capitalize() for it in tmps if it])
- LOGGER.info("[ Retry to launch app: %s ]" % (pkg_name + '/.' + actv_name + 'Activity'))
- cmdline = APP_START % (self.deviceid, pkg_name + '/.' + actv_name + 'Activity')
- exit_code, ret = shell_command(cmdline)
- if len(ret) > 1:
- # remove Activity
- LOGGER.info("[ Retry to launch app: %s ]" % (pkg_name + '/.' + actv_name))
- cmdline = APP_START % (self.deviceid, pkg_name + '/.' + actv_name)
- exit_code, ret = shell_command(cmdline)
-
- blauched = True
- time.sleep(3)
- else:
- cmdline = APP_NONBLOCK_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- time.sleep(3)
- cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmd)
- if ret and len(ret):
- blauched = True
- return blauched
-
- def kill_app(self, wgt_name):
- pkg_name = wgt_name.split('/')[0]
- cmdline = APP_STOP % (self.deviceid, pkg_name)
- exit_code, ret = shell_command(cmdline)
- return True
-
- install_app = install_package
- uninstall_app = uninstall_package
-
- def get_buildinfo(self):
- """ get builf info"""
- build_info = {}
- build_info['buildid'] = ''
- build_info['manufacturer'] = ''
- build_info['model'] = ''
- return build_info
-
-
-def get_target_conn(device_id=None):
- """ Get connection for Test Target"""
- if device_id is None:
- dev_list = _get_device_ids()
- if len(dev_list):
- device_id = dev_list[0]
- else:
- raise InvalidDeviceException('No android device found!')
- return AndroidMobile(device_id)
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-
-""" The implementation of local host communication"""
-
-import os
-import time
-import socket
-import re
-from shutil import copyfile
-
-from testkitlite.util.log import LOGGER
-from testkitlite.util.autoexec import shell_command, shell_command_ext
-
-
-HOST_NS = "127.0.0.1"
-os.environ['no_proxy'] = HOST_NS
-os.environ['TEST_PLATFORM'] = 'localhost'
-if not os.environ.has_key('CONNECT_TYPE'):
- os.environ['CONNECT_TYPE'] = 'local'
-APP_QUERY_STR = "ps aux | grep %s | grep -v grep"
-
-
-class LocalHost:
-
- """ Implementation for transfer data
- between Host and Tizen PC
- """
-
- def __init__(self):
- self.deviceid = os.environ.get('TEST_PLATFORM','')
- #self.deviceid = "localhost"
- self.support_remote = False
-
- def is_support_remote(self):
- return self.support_remote
-
- def shell_cmd(self, cmd="", timeout=15):
- return shell_command(cmd, timeout)
-
- def check_process(self, process_name):
- exit_code, ret = shell_command(APP_QUERY_STR % process_name)
- return len(ret)
-
- def kill_stub(self):
- #add this fucntion to avoid webdriver issue if it running on device, yangx.zhou@intel.com
- cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2 }'"
- exit_code, ret = self.shell_cmd(cmdline)
- if exit_code == 0 and len(ret) >0:
- cmdline = "kill -9 %s" %ret[0]
- exit_code, ret = self.shell_cmd(cmdline)
-
-
- def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
- cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
- exit_code, ret = self.shell_cmd(cmdline)
- time.sleep(2)
-
- def check_widget_process(self, wgt_name):
- return True
-
- def shell_cmd_ext(self,
- cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None):
- return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
-
- def get_device_ids(self):
- """
- get device list of ids
- """
- return []
-
- def get_device_info(self):
- """
- get tizen device inforamtion
- """
- device_info = {}
- device_info["device_id"] = self.deviceid
- device_info["resolution"] = "N/A"
- device_info["screen_size"] = "N/A"
- device_info["device_model"] = "N/A"
- device_info["device_name"] = "N/A"
- device_info["os_version"] = "N/A"
- device_info["build_id"] = "N/A"
- return device_info
-
- def get_server_url(self, remote_port="8000"):
- """get server url"""
- url_forward = "http://%s:%s" % (HOST_NS, remote_port)
- return url_forward
-
- def install_package(self, pkgpath):
- """
- install a package on tizen device
- """
- cmd = "rpm -ivh %s" % pkgpath
- exit_code, ret = shell_command(cmd)
- return ret
-
- def get_installed_package(self):
- """get list of installed package from device"""
- cmd = "rpm -qa | grep tct"
- exit_code, ret = shell_command(cmd)
- return ret
-
- def download_file(self, remote_path, local_path):
- """download file"""
- # copyfile(remote_path, local_path)
- # return True
- return False
-
- def upload_file(self, remote_path, local_path):
- """upload file"""
- # copyfile(local_path, remote_path)
- return False
-
- def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
- """get test option dict """
- test_opt = {}
- test_opt["suite_name"] = test_suite
- test_opt["launcher"] = test_launcher
- test_opt["test_app_id"] = test_launcher
- return test_opt
-
- def launch_app(self, wgt_name):
- exit_code, ret = shell_command(wgt_name + '&')
- return True
-
- def kill_app(self, wgt_name):
- return True
-
- def start_debug(self, dlogfile):
- pass
-
- def stop_debug(self):
- pass
-
- def get_buildinfo(self):
- """ get builf info"""
- build_info = {}
- build_info['buildid'] = ''
- build_info['manufacturer'] = ''
- build_info['model'] = ''
- return build_info
-
-
-def get_target_conn():
- """ Get connection for Test Target"""
- return LocalHost()
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-
-""" The implementation of tizen IVI communication"""
-
-import os
-import time
-import socket
-import threading
-import ConfigParser
-import re
-import sys
-from shutil import copyfile
-from testkitlite.util.log import LOGGER
-from testkitlite.util.autoexec import shell_command, shell_command_ext
-from testkitlite.util.killall import killall
-from testkitlite.util.errors import InvalidDeviceException
-
-try:
- import paramiko
-except ImportError, err:
- LOGGER.info("Failed to import 'paramiko' module, please check your installation:")
- LOGGER.info(" You can use 'sudo pip install paramiko' to install the module!")
- sys.exit(1)
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = ConfigParser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-
-
-HOST_NS = "127.0.0.1"
-os.environ['no_proxy'] = HOST_NS
-os.environ['TEST_PLATFORM'] = 'tizen'
-os.environ['CONNECT_TYPE'] = 'ssh'
-TIZEN_USER = os.environ.get('TIZEN_USER', 'owner')
-#print 'debug', os.environ.get('TIZEN_USER','')
-
-# common constants
-RPM_INSTALL = "ssh %s rpm -ivh %s"
-RPM_UNINSTALL = "ssh %s rpm -e %s"
-RPM_LIST = "ssh %s rpm -qa | grep tct"
-APP_QUERY_STR = "ssh %s \"ps aux |grep '%s'|grep -v grep\"|awk '{print $2}'"
-APP_KILL_STR = "ssh %s kill -9 %s"
-APP_NONBLOCK_STR = "ssh %s \"%s &\""
-SSH_COMMAND_RTN = "ssh %s \"%s\"; echo returncode=$?"
-#SSH_COMMAND_APP = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket; %s'\";echo returncode=$?"
-SSH_COMMAND_APP = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket; %s'\";echo returncode=$?"
-
-# wrt-launcher constants
-WRT_MAIN = "wrt-launcher"
-WRT_QUERY_STR = "ssh %s \"wrt-launcher -l|grep '%s'|grep -v grep\"|awk '{print $2\":\"$NF}'"
-WRT_START_STR = "ssh %s 'wrt-launcher -s %s; echo returncode=$?'"
-WRT_STOP_STR = "ssh %s wrt-launcher -k %s"
-WRT_INSTALL_STR = "ssh %s wrt-installer -i %s"
-WRT_UNINSTL_STR = "ssh %s wrt-installer -un %s"
-WRT_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
-
-# crosswalk constants
-#XWALK_MAIN = "xwalkctl"
-#XWALK_MAIN = "open_app"
-XWALK_MAIN = os.environ.get("Launcher","app_launcher -s")
-if cmp(XWALK_MAIN,'app_launcher') == 0:
- XWALK_MAIN = 'app_launcher -s '
-#XWALK_QUERY_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl' \"| grep -w %s | awk '{print $(NF-1)}'"
-XWALK_QUERY_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;app_launcher -l' \"| grep -w %s | awk '{print $2}'"
-#XWALK_START_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;launch_app %s' & \""
-XWALK_START_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s %s' & \""
-#XWALK_INSTALL_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --install %s' \""
-XWALK_INSTALL_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -i -t %s -p %s -q' \""
-#XWALK_UNINSTL_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --uninstall %s' \""
-XWALK_UNINSTL_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -u -t wgt -q -n %s' \""
-XWALK_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
-
-XWALK_QUERY_ID = "ssh %s 'id -u %s'"
-
-class SSH_Handler:
- """
- long connection with login
- """
-
- def __init__(self, host='127.0.0.1', username='root', password='tizen', port=22):
- self._ssh = paramiko.SSHClient()
- self._ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
- self._ssh.connect(host, port, username, password)
-
- def ssh_command(self, cmd='whoami'):
- stdin, stdout, stderr = self._ssh.exec_command(cmd)
- return stdout.readlines()
-
- def close(self):
- if self._ssh is not None:
- self._ssh.close()
-
-
-class tizenIVI:
-
- """ Implementation for transfer data
- between Host and IVI/PC on SSH connection
- """
-
- def __init__(self, deviceid="root@127.0.0.1"):
- self.deviceid = deviceid
- remotes = deviceid.split('@')
- self._ssh = SSH_Handler(remotes[1], remotes[0])
- self._wrt = False
- self._xwalk = False
- self.support_remote = True
- self._get_user_id()
-
- def _get_user_id(self):
- if TIZEN_USER.lower() == 'owner':
- self.port = '5000'
- else:
- cmdline = XWALK_QUERY_ID % (self.deviceid, TIZEN_USER)
- exit_code, ret = shell_command(cmdline)
- if exit_code == -1:
- LOGGER.info("[ can not get user id ]")
- if len(ret) > 0 :
- self.port = ret[0].strip('\r\n')
-
-
- def is_support_remote(self):
- return self.support_remote
-
- def shell_cmd(self, cmd="", timeout=15):
- cmd = "ssh %s %s" % (self.deviceid, cmd)
- return shell_command(cmd, timeout)
-
- def check_process(self, process_name):
- exit_code, ret = shell_command(APP_QUERY_STR % (self.deviceid, process_name))
- return len(ret)
-
- def kill_stub(self):
- #add this function to avoid webdriver issue if stub runnning on device, yangx.zhou@intel.com
- cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2 }'"
- ret_lines = self._ssh.ssh_command(cmdline)
- if len(ret_lines) > 0:
- cmdline = "kill -9 %s" %ret_lines[0]
- ret_lines = self._ssh.ssh_command(cmdline)
-
- def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
- #self.kill_stub()
- cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
- ret_lines = self._ssh.ssh_command(cmdline)
- time.sleep(2)
-
- def shell_cmd_ext(self,
- cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None):
- #if cmd.startswith('app_user@'):
- usr = TIZEN_USER + '_user@'
- if cmd.startswith(usr):
- cmdline = SSH_COMMAND_APP % (self.deviceid, TIZEN_USER, self.port, cmd[9:])
- else:
- cmdline = SSH_COMMAND_RTN % (self.deviceid, cmd)
- return shell_command_ext(cmdline, timeout, boutput, stdout_file, stderr_file)
-
- def shell_cmd_host(self,
- cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None):
- cmd = cmd.replace("$deviceid", self.deviceid)
- return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
-
- def get_device_ids(self):
- """
- get device list of ids
- """
- return ['localhost']
-
- def get_device_info(self):
- """
- get tizenivi device inforamtion
- """
- device_info = {}
- resolution_str = ""
- screen_size_str = ""
- device_model_str = ""
- device_name_str = ""
- build_id_str = ""
- os_version_str = ""
-
- # get resolution and screen size
- exit_code, ret = shell_command("ssh %s xrandr" % self.deviceid)
- pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
- for line in ret:
- match = pattern.search(line)
- if match:
- resolution_str = "%s x %s" % (match.group(1), match.group(2))
- screen_size_str = "%s x %s" % (match.group(3), match.group(4))
-
- # get architecture
- exit_code, ret = shell_command("ssh %s uname -m" % self.deviceid)
- if len(ret) > 0:
- device_model_str = ret[0]
-
- # get hostname
- exit_code, ret = shell_command("ssh %s uname -n" % self.deviceid)
- if len(ret) > 0:
- device_name_str = ret[0]
-
- # get os version
- exit_code, ret = shell_command("ssh %s cat /etc/issue" % self.deviceid)
- for line in ret:
- if len(line) > 1:
- os_version_str = "%s %s" % (os_version_str, line)
-
- # get build id
- exit_code, ret = shell_command("ssh %s cat /etc/os-release" % self.deviceid)
- for line in ret:
- if line.find("BUILD_ID=") != -1:
- build_id_str = line.split('=')[1].strip('\"\r\n')
-
- os_version_str = os_version_str[0:-1]
- device_info["device_id"] = self.deviceid
- device_info["resolution"] = resolution_str
- device_info["screen_size"] = screen_size_str
- device_info["device_model"] = device_model_str
- device_info["device_name"] = device_name_str
- device_info["os_version"] = os_version_str
- device_info["build_id"] = build_id_str
- return device_info
-
- def get_server_url(self, remote_port="8000"):
- """get server url"""
- remote_ip = self.deviceid
- remote_ip = remote_ip.split('@')[1]
- os.environ['no_proxy'] = remote_ip
- url_forward = "http://%s:%s" % (remote_ip, remote_port)
- return url_forward
-
- def install_package(self, pkgpath):
- """
- install a package on tizenivi device
- """
- cmd = RPM_INSTALL % (self.deviceid, pkgpath)
- exit_code, ret = shell_command(cmd)
- return ret
-
- def install_package(self, pkgname):
- """
- install a package on tizenivi device
- """
- cmd = RPM_UNINSTALL % (self.deviceid, pkgname)
- exit_code, ret = shell_command(cmd)
- return ret
-
- def get_installed_package(self):
- """get list of installed package from device"""
- cmd = RPM_LIST % (self.deviceid)
- exit_code, ret = shell_command(cmd)
- return ret
-
- def download_file(self, remote_path, local_path):
- """download file"""
- local_path_dir = os.path.dirname(local_path)
- if not os.path.exists(local_path_dir):
- os.makedirs(local_path_dir)
- cmd = "scp %s:%s %s" % (self.deviceid, remote_path, local_path)
- exit_code, ret = shell_command(cmd)
- if not os.path.exists(local_path):
- return False
- return True
-
- def upload_file(self, remote_path, local_path):
- """upload file"""
- cmd = "scp %s %s:%s" % (local_path, self.deviceid, remote_path)
- exit_code, ret = shell_command(cmd)
- return True
-
- def _get_wrt_app(self, test_suite, test_set, fuzzy_match, auto_iu):
- test_app_id = None
- if auto_iu:
- test_wgt = test_set
- test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
- if not self.install_app(test_wgt_path):
- LOGGER.info("[ failed to install widget \"%s\" in target ]"
- % test_wgt)
- return None
- else:
- test_wgt = test_suite
-
- # check if widget installed already
- cmd = WRT_QUERY_STR % (test_wgt)
- exit_code, ret = shell_command(cmd)
- if exit_code == -1:
- return None
- for line in ret:
- items = line.split(':')
- if len(items) < 1:
- continue
- if (fuzzy_match and items[0].find(test_wgt) != -1) or items[0] == test_wgt:
- test_app_id = items[1].strip('\r\n')
- break
-
- if test_app_id is None:
- LOGGER.info("[ test widget \"%s\" not found in target ]"
- % test_wgt)
- return None
-
- return test_app_id
-
- def _get_xwalk_app(self, test_suite, test_set, fuzzy_match, auto_iu):
- test_app_id = None
- if auto_iu:
- test_wgt = test_set
- test_wgt_path = XWALK_LOCATION % (test_suite, test_wgt)
- if not self.install_app(test_wgt_path):
- LOGGER.info("[ failed to install widget \"%s\" in target ]"
- % test_wgt)
- return None
- else:
- test_wgt = test_suite
-
- # check if widget installed already
- cmd = XWALK_QUERY_STR % (self.deviceid,TIZEN_USER, self.port, test_wgt)
- exit_code, ret = shell_command(cmd)
- if exit_code == -1:
- return None
- for line in ret:
- test_app_id = line.strip('\r\n')
-
- if test_app_id is None:
- LOGGER.info("[ test widget \"%s\" not found in target ]"
- % test_wgt)
- return None
-
- return test_app_id
-
- def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
- """
- get test option dict
- """
- test_opt = {}
- self._wrt = False
- self._xwalk = False
- app_id = None
- test_opt["suite_name"] = test_suite
- test_opt["launcher"] = test_launcher
- if test_widget is not None and test_widget != "":
- test_suite = test_widget
- if test_launcher.find('WRTLauncher') >= 0:
- self._wrt = True
- test_opt["launcher"] = WRT_MAIN
- client_cmds = test_launcher.strip().split()
- wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
- test_opt['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
- test_opt['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
- test_opt['self_exec'] = wrt_tag.find('a') != -1
- test_opt['self_repeat'] = wrt_tag.find('r') != -1
- app_id = self._get_wrt_app(test_suite, test_set, fuzzy_match, auto_iu)
- elif test_launcher.find('xwalk') >= 0 and len(test_launcher) <= 16:
- self._xwalk = True
- test_opt["launcher"] = XWALK_MAIN
- client_cmds = test_launcher.strip().split()
- xpk_tag = client_cmds[1] if len(client_cmds) > 1 else ""
- test_opt['fuzzy_match'] = fuzzy_match = xpk_tag.find('z') != -1
- test_opt['auto_iu'] = auto_iu = xpk_tag.find('iu') != -1
- test_opt['self_exec'] = xpk_tag.find('a') != -1
- test_opt['self_repeat'] = xpk_tag.find('r') != -1
- app_id = self._get_xwalk_app(test_suite, test_set, fuzzy_match, auto_iu)
- else:
- app_id = test_launcher
-
- if app_id is None:
- return None
- test_opt["test_app_id"] = app_id
- return test_opt
-
- def start_debug(self, dlogfile):
- global debug_flag, metux
- debug_flag = True
-
- def stop_debug(self):
- global debug_flag
- debug_flag = False
-
- def launch_app(self, wgt_name):
- blauched = False
- if self._wrt:
- timecnt = 0
- cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- cmdline = WRT_START_STR % (self.deviceid, wgt_name)
- while timecnt < 3:
- exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
- if exit_code == "0":
- blauched = True
- break
- timecnt += 1
- time.sleep(3)
- elif self._xwalk:
- cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- cmdline = XWALK_START_STR % (self.deviceid,TIZEN_USER, self.port, XWALK_MAIN, wgt_name)
- exit_code, ret = shell_command(cmdline)
- time.sleep(3)
- blauched = True
- else:
- cmdline = APP_NONBLOCK_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- time.sleep(3)
- cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmd)
- if ret and len(ret):
- blauched = True
-
- return blauched
-
- def kill_app(self, wgt_name):
- if self._wrt:
- cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- elif self._xwalk:
- cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- return True
-
- def install_app(self, wgt_path="", timeout=90):
- if self._wrt:
- cmd = WRT_INSTALL_STR % (self.deviceid, wgt_path)
- elif self._xwalk:
- if len(wgt_path)>0:
- ext = wgt_path.split('.')[1]
- cmd = XWALK_INSTALL_STR % (self.deviceid,TIZEN_USER, self.port,ext, wgt_path)
- else:
- return True
- exit_code, ret = shell_command(cmd, timeout)
- if exit_code == -1:
- cmd = APP_QUERY_STR % (self.deviceid, wgt_path)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- return False
- else:
- return True
-
- def uninstall_app(self, wgt_name):
- if self._wrt:
- cmd = WRT_UNINSTL_STR % (self.deviceid, wgt_name)
- elif self._xwalk:
- cmd = XWALK_UNINSTL_STR % (self.deviceid, TIZEN_USER, self.port, wgt_name)
- else:
- return True
- exit_code, ret = shell_command(cmd)
- return True
-
- def get_buildinfo(self):
- """ get builf info"""
- build_info = {}
- build_info['buildid'] = ''
- build_info['manufacturer'] = ''
- build_info['model'] = ''
- return build_info
-
-
-def get_target_conn(deviceid=None):
- """ Get connection for Test Target"""
- if deviceid is None or '@' not in deviceid:
- raise InvalidDeviceException('deviceid("username@ip") required by SSH connection!')
- return tizenIVI(deviceid)
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-
-""" The implementation of tizen localhost communication"""
-
-import os
-import time
-import socket
-import threading
-import re
-from shutil import copyfile
-
-from testkitlite.util.log import LOGGER
-from testkitlite.util.autoexec import shell_command, shell_command_ext
-from testkitlite.util.killall import killall
-
-HOST_NS = "127.0.0.1"
-os.environ['no_proxy'] = HOST_NS
-os.environ['TEST_PLATFORM'] = 'tizen'
-os.environ['CONNECT_TYPE'] = 'local'
-RPM_INSTALL = "rpm -ivh %s"
-RPM_UNINSTALL = "rpm -e %s"
-RPM_LIST = "rpm -qa | grep tct | grep -v grep"
-APP_QUERY_STR = "ps aux |grep '%s'|grep -v grep|awk '{print $2}'"
-APP_KILL_STR = "kill -9 %s"
-APP_NONBLOCK_STR = "%s &"
-
-# wrt-launcher constants
-WRT_MAIN = "wrt-launcher"
-WRT_QUERY_STR = "wrt-launcher -l | grep '%s'|awk '{print $2\":\"$NF}'"
-WRT_START_STR = "wrt-launcher -s %s"
-WRT_STOP_STR = "wrt-launcher -k %s"
-WRT_INSTALL_STR = "wrt-installer -i %s"
-WRT_UNINSTL_STR = "wrt-installer -un %s"
-WRT_LOCATION = "/opt/usr/media/tct/opt/%s/%s.wgt"
-
-# crosswalk constants
-#XWALK_MAIN = "xwalkctl"
-XWALK_MAIN = os.environ.get("Launcher","app_launcher -s")
-if cmp(XWALK_MAIN, 'app_launcher') == 0:
- XWALK_MAIN = "app_launcher -s "
-#XWALK_MAIN = "open_app"
-#XWALK_QUERY_STR = "ail_list | grep -w %s | awk '{print $(NF-1)}'"
-XWALK_QUERY_STR = "app_launcher -l | grep -w %s | awk '{print $2}'"
-#XWALK_START_STR = "xwalk-launcher %s &"
-XWALK_START_STR = "%s %s &"
-#XWALK_INSTALL_STR = "xwalkctl --install %s"
-XWALK_INSTALL_STR = "pkgcmd --install -t %s -p %s -q"
-XWALK_UNINSTL_STR = "pkgcmd -u -t wgt -q -n %s"
-#XWALK_UNINSTL_STR = "xwalkctl --uninstall %s"
-XWALK_LOCATION = "/opt/usr/media/tct/opt/%s/%s.wgt"
-DLOG_CLEAR = "dlogutil -c"
-DLOG_WRT = "dlogutil WRT:D -v threadtime"
-TIZEN_USER = os.environ.get('TIZEN_USER','app')
-
-def debug_trace(cmdline, logfile):
- global debug_flag, metux
- wbuffile = file(logfile, "w")
- import subprocess
- exit_code = None
- proc = subprocess.Popen(args=cmdline,
- shell=True,
- stdout=wbuffile,
- stderr=None)
- while True:
- exit_code = proc.poll()
- if exit_code is not None:
- break
- time.sleep(0.5)
- metux.acquire()
- proc_flag = debug_flag
- metux.release()
- if not proc_flag:
- break
- wbuffile.close()
- if exit_code is None:
- killall(proc.pid)
-
-
-class tizenHost:
-
- """ Implementation for transfer data on TIZEN localhost
- """
-
- def __init__(self):
- self.deviceid = "localhost"
- self._wrt = False
- self._xwalk = False
- self.support_remote = False
-
- def is_support_remote(self):
- return self.support_remote
-
- def shell_cmd(self, cmd="", timeout=15):
- return shell_command(cmd, timeout)
-
- def check_process(self, process_name):
- exit_code, ret = shell_command(APP_QUERY_STR % process_name)
- return len(ret)
-
- def kill_stub(self):
- #add this function to avoid webdriver issue if stub exists, yangx.zhou@intel.com
- cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2}'"
- exit_code, ret = self.shell_cmd(cmdline)
- if exit_code == 0 and len(ret) > 0:
- cmdline = "kill -9 %s" %ret[0]
- exit_code, ret = self.shell_cmd(cmdline)
- time.sleep(1)
-
- def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
- self.kill_stub()
- cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
- exit_code, ret = self.shell_cmd(cmdline)
- time.sleep(2)
-
- def shell_cmd_ext(self,
- cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None):
- usr = TIZEN_USER + '_user@'
- if cmd.startswith(usr):
- cmd = cmd[9:]
- return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
-
- def get_device_ids(self):
- """
- get device list of ids
- """
- return ['localhost']
-
- def get_device_info(self):
- """
- get tizenpc device inforamtion
- """
- device_info = {}
- resolution_str = ""
- screen_size_str = ""
- device_model_str = ""
- device_name_str = ""
- build_id_str = ""
- os_version_str = ""
-
- # get resolution and screen size
- exit_code, ret = shell_command("xrandr")
- pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
- for line in ret:
- match = pattern.search(line)
- if match:
- resolution_str = "%s x %s" % (match.group(1), match.group(2))
- screen_size_str = "%s x %s" % (match.group(3), match.group(4))
-
- # get architecture
- exit_code, ret = shell_command("uname -m")
- if len(ret) > 0:
- device_model_str = ret[0]
-
- # get hostname
- exit_code, ret = shell_command("uname -n")
- if len(ret) > 0:
- device_name_str = ret[0]
-
- # get os version
- exit_code, ret = shell_command("cat /etc/issue")
- for line in ret:
- if len(line) > 1:
- os_version_str = "%s %s" % (os_version_str, line)
-
- # get build id
- exit_code, ret = shell_command("cat /etc/os-release")
- for line in ret:
- if line.find("BUILD_ID=") != -1:
- build_id_str = line.split('=')[1].strip('\"\r\n')
-
- os_version_str = os_version_str[0:-1]
- device_info["device_id"] = self.deviceid
- device_info["resolution"] = resolution_str
- device_info["screen_size"] = screen_size_str
- device_info["device_model"] = device_model_str
- device_info["device_name"] = device_name_str
- device_info["os_version"] = os_version_str
- device_info["build_id"] = build_id_str
- return device_info
-
- def get_server_url(self, remote_port="8000"):
- """get server url"""
- url_forward = "http://%s:%s" % (HOST_NS, remote_port)
- return url_forward
-
- def install_package(self, pkgpath):
- """
- install a package on tizenpc device
- """
- cmd = RPM_INSTALL % pkgpath
- exit_code, ret = shell_command(cmd)
- return ret
-
- def install_package(self, pkgname):
- """
- install a package on tizenpc device
- """
- cmd = RPM_UNINSTALL % pkgname
- exit_code, ret = shell_command(cmd)
- return ret
-
- def get_installed_package(self):
- """get list of installed package from device"""
- cmd = RPM_LIST
- exit_code, ret = shell_command(cmd)
- return ret
-
- def download_file(self, remote_path, local_path):
- """download file"""
- copyfile(remote_path, local_path)
- return True
-
- def upload_file(self, remote_path, local_path):
- """upload file"""
- copyfile(local_path, remote_path)
- return True
-
- def _get_wrt_app(self, test_suite, test_set, fuzzy_match, auto_iu):
- test_app_id = None
- if auto_iu:
- test_wgt = test_set
- test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
- if not self.install_app(test_wgt_path):
- LOGGER.info("[ failed to install widget \"%s\" in target ]"
- % test_wgt)
- return None
- else:
- test_wgt = test_suite
-
- # check if widget installed already
- cmd = WRT_QUERY_STR % (test_wgt)
- exit_code, ret = shell_command(cmd)
- if exit_code == -1:
- return None
- for line in ret:
- items = line.split(':')
- if len(items) < 1:
- continue
- if (fuzzy_match and items[0].find(test_wgt) != -1) or items[0] == test_wgt:
- test_app_id = items[1].strip('\r\n')
- break
-
- if test_app_id is None:
- LOGGER.info("[ test widget \"%s\" not found in target ]"
- % test_wgt)
- return None
-
- return test_app_id
-
- def _get_xwalk_app(self, test_suite, test_set, fuzzy_match, auto_iu):
- test_app_id = None
- if auto_iu:
- test_wgt = test_set
- test_wgt_path = XWALK_LOCATION % (test_suite, test_wgt)
- if not self.install_app(test_wgt_path):
- LOGGER.info("[ failed to install widget \"%s\" in target ]"
- % test_wgt)
- return None
- else:
- test_wgt = test_suite
-
- # check if widget installed already
- cmd = XWALK_QUERY_STR % (test_wgt)
- exit_code, ret = shell_command(cmd)
- if exit_code == -1:
- return None
- for line in ret:
- test_app_id = line.strip('\r\n')
-
- if test_app_id is None:
- LOGGER.info("[ test widget \"%s\" not found in target ]"
- % test_wgt)
- return None
-
- return test_app_id
-
- def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
- """
- get test option dict
- """
- test_opt = {}
- self._wrt = False
- self._xwalk = False
- app_id = None
- test_opt["suite_name"] = test_suite
- test_opt["launcher"] = test_launcher
- if test_widget is not None and test_widget != "":
- test_suite = test_widget
- if test_launcher.find('WRTLauncher') >= 0:
- self._wrt = True
- test_opt["launcher"] = WRT_MAIN
- client_cmds = test_launcher.strip().split()
- wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
- test_opt['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
- test_opt['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
- test_opt['self_exec'] = wrt_tag.find('a') != -1
- test_opt['self_repeat'] = wrt_tag.find('r') != -1
- app_id = self._get_wrt_app(test_suite, test_set, fuzzy_match, auto_iu)
- elif test_launcher.find('xwalk') >= 0 and len(test_launcher) <= 16:
- self._xwalk = True
- test_opt["launcher"] = XWALK_MAIN
- client_cmds = test_launcher.strip().split()
- xpk_tag = client_cmds[1] if len(client_cmds) > 1 else ""
- test_opt['fuzzy_match'] = fuzzy_match = xpk_tag.find('z') != -1
- test_opt['auto_iu'] = auto_iu = xpk_tag.find('iu') != -1
- test_opt['self_exec'] = xpk_tag.find('a') != -1
- test_opt['self_repeat'] = xpk_tag.find('r') != -1
- app_id = self._get_xwalk_app(test_suite, test_set, fuzzy_match, auto_iu)
- else:
- app_id = test_launcher
-
- if app_id is None:
- return None
- test_opt["test_app_id"] = app_id
- return test_opt
-
- def start_debug(self, dlogfile):
- global debug_flag, metux
- debug_flag = True
- metux = threading.Lock()
-
- def stop_debug(self):
- global debug_flag, metux
- metux.acquire()
- debug_flag = False
- metux.release()
-
- def launch_app(self, wgt_name):
- blauched = False
- if self._wrt:
- timecnt = 0
- cmdline = WRT_STOP_STR % (wgt_name)
- exit_code, ret = shell_command(cmdline)
- cmdline = WRT_START_STR % (wgt_name)
- while timecnt < 3:
- exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
- if exit_code == "0":
- blauched = True
- break
- timecnt += 1
- time.sleep(3)
- elif self._xwalk:
- cmd = APP_QUERY_STR % (wgt_name)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- cmdline = XWALK_START_STR % (XWALK_MAIN, wgt_name)
- exit_code, ret = shell_command(cmdline)
- time.sleep(3)
- blauched = True
- else:
- cmdline = APP_NONBLOCK_STR % (wgt_name)
- exit_code, ret = shell_command(cmdline)
- time.sleep(3)
- cmd = APP_QUERY_STR % (wgt_name)
- exit_code, ret = shell_command(cmd)
- if ret and len(ret):
- blauched = True
-
- return blauched
-
- def kill_app(self, wgt_name):
- if self._wrt:
- cmdline = WRT_STOP_STR % (wgt_name)
- exit_code, ret = shell_command(cmdline)
- elif self._xwalk:
- cmd = APP_QUERY_STR % (wgt_name)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- return True
-
- def install_app(self, wgt_path="", timeout=90):
- if self._wrt:
- cmd = WRT_INSTALL_STR % (wgt_path)
- elif self._xwalk:
- ext = wgt_path.split(".")[1]
- cmd = XWALK_INSTALL_STR % (ext, wgt_path)
- else:
- return True
- exit_code, ret = shell_command(cmd, timeout)
- if exit_code == -1:
- cmd = APP_QUERY_STR % (wgt_path)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- return False
- else:
- return True
-
- def uninstall_app(self, wgt_name):
- if self._wrt:
- cmd = WRT_UNINSTL_STR % (wgt_name)
- elif self._xwalk:
- cmd = XWALK_UNINSTL_STR % (wgt_name)
- else:
- return True
- exit_code, ret = shell_command(cmd)
- return True
-
- def get_buildinfo(self):
- """ get builf info"""
- build_info = {}
- build_info['buildid'] = ''
- build_info['manufacturer'] = ''
- build_info['model'] = ''
- return build_info
-
-
-def get_target_conn():
- """ Get connection for Test Target"""
- return tizenHost()
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-
-""" The implementation of TIZEN mobile communication"""
-
-import os
-import time
-import socket
-import threading
-import re
-import shutil
-import ConfigParser
-import xml.etree.ElementTree as etree
-import platform
-
-from testkitlite.util.log import LOGGER
-from testkitlite.util.autoexec import shell_command, shell_command_ext
-from testkitlite.util.killall import killall
-from testkitlite.util.errors import InvalidDeviceException
-
-EXISTS = os.path.exists
-
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = ConfigParser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-DEVICE_USER_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
-
-os.environ['TEST_PLATFORM'] = 'tizen'
-os.environ['CONNECT_TYPE'] = 'sdb'
-LOCAL_HOST_NS = "127.0.0.1"
-BUILD_INFO_FILE = os.path.join(DEVICE_SUITE_TARGET_30,'Documents/tct/buildinfo.xml')
-RPM_INSTALL = "sdb -s %s shell rpm -ivh %s"
-RPM_UNINSTALL = "sdb -s %s shell rpm -e %s"
-RPM_LIST = "sdb -s %s shell \"rpm -qa|grep tct\""
-
-APP_QUERY_STR = "sdb -s %s shell \"ps aux|grep '%s'|grep -v grep\"|awk '{print $2}'"
-STUB_KILL_STR = "sdb -s %s shell \"ps aux|grep '%s'|grep -v grep\"|awk '{print $2}'|xargs kill -9"
-APP_KILL_STR = "sdb -s %s shell kill -9 %s"
-APP_NONBLOCK_STR = "sdb -s %s shell '%s' &"
-SDB_COMMAND = "sdb -s %s shell '%s'"
-SDB_COMMAND_RTN = "sdb -s %s shell '%s; echo returncode=$?'"
-#SDB_COMMAND_APP = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;%s;echo returncode=$?'"
-#SDB_COMMAND_APP = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s;echo returncode=$?'"
-SDB_COMMAND_APP = """sdb -s %s shell 'su - %s -c "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s";echo returncode=$?'"""
-
-# wrt-launcher constants
-
-WRT_MAIN = "wrt-launcher"
-WRT_QUERY_STR = "sdb -s %s shell wrt-launcher -l | grep '%s'|awk '{print $2\":\"$NF}'"
-WRT_START_STR = "sdb -s %s shell 'wrt-launcher -s %s; echo returncode=$?'"
-WRT_STOP_STR = "sdb -s %s shell wrt-launcher -k %s"
-WRT_INSTALL_STR = "sdb -s %s shell wrt-installer -i %s"
-WRT_UNINSTL_STR = "sdb -s %s shell wrt-installer -un %s"
-WRT_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
-WRT_SMACK_STR = "sdb -s %s shell 'echo \"User::Shell User::Pkg::%s rwx\" | smackload'"
-WRT_SMACK_REV_STR = "sdb -s %s shell 'echo \"User::Pkg::%s User::Shell rwx\" | smackload'"
-#default user is changed "app" to "owner"
-#jh0219.han@samsung.com
-
-# crosswalk constants
-#XWALK_MAIN = "xwalkctl"
-#XWALK_MAIN = "open_app"
-XWALK_MAIN = os.environ.get("Launcher","app_launcher -s")
-if cmp(XWALK_MAIN,'app_launcher') == 0:
- XWALK_MAIN = 'app_launcher -s '
-#XWALK_QUERY_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;ail_list' | grep -w %s | awk '{print $(NF-1)}'"
-XWALK_QUERY_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;app_launcher -l' | grep -w %s | awk '{print $2}'"
-#XWALK_QUERY_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl' | grep -w %s | awk '{print $(NF-1)}'"
-#XWALK_START_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;launch_app %s' &"
-XWALK_START_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s %s' &"
-#XWALK_START_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;xwalk-launcher %s' &"
-XWALK_INSTALL_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -i -t %s -p %s -q'"
-#XWALK_INSTALL_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --install %s'"
-XWALK_UNINSTL_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -u -t wgt -q -n %s'"
-#XWALK_UNINSTL_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --uninstall %s'"
-XWALK_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
-#default user is changed "app" to "owner"
-#jh0219.han@samsung.com
-
-# redefine constants for windows
-if platform.system() == "Windows":
- APP_QUERY_STR = 'sdb -s %s shell "ps aux|grep %s|grep -v grep |awk \'{print $2}\'"'
- SDB_COMMAND = 'sdb -s %s shell "%s"'
- SDB_COMMAND_RTN = 'sdb -s %s shell "%s; echo returncode=$?"'
- SDB_COMMAND_APP = 'sdb -s %s shell \"su - %s -c \"export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s\";echo returncode=$?\"'
- WRT_START_STR = 'sdb -s %s shell "wrt-launcher -s %s; echo returncode=$?"'
- XWALK_QUERY_STR = 'sdb -s %s shell su - %s -c "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;app_launcher -l | grep -w %s | awk \'{print \$2}\'"'
-
-XWALK_QUERY_ID = "sdb -s %s shell 'id -u %s'"
-
-temp_tuser = DEVICE_USER_30.split('/')
-
-if not temp_tuser:
- TIZEN_USER = 'owner'
-else:
- TIZEN_USER = temp_tuser[0]
-
-LOGGER.debug('testkit-lite current user : %s' % str(TIZEN_USER))
-
-#TIZEN_USER = os.environ.get('TIZEN_USER','owner').strip()
-#default user is changed "app" to "owner"
-#jh0219.han@samsung.com
-
-#print os.environ['tizen_user']
-# dlog constants
-DLOG_CLEAR = "sdb -s %s shell dlogutil -c"
-DLOG_WRT = "sdb -s %s shell dlogutil -v threadtime"
-
-def debug_trace(cmdline, logfile):
- global debug_flag, metux
- wbuffile = file(logfile, "a")
- import subprocess
- exit_code = None
- proc = subprocess.Popen(args=cmdline,
- shell=True,
- stdout=wbuffile,
- stderr=None)
- while True:
- exit_code = proc.poll()
- if exit_code is not None:
- break
- time.sleep(0.5)
- metux.acquire()
- proc_flag = debug_flag
- metux.release()
- if not proc_flag:
- break
- wbuffile.close()
- if exit_code is None:
- killall(proc.pid)
-
-
-def _get_device_ids():
- """get tizen device list of ids"""
- result = []
- exit_code, ret = shell_command("sdb start-server")
- exit_code, ret = shell_command("sdb devices")
- for line in ret:
- if str.find(line, "\tdevice") != -1:
- result.append(line.split("\t")[0])
- return result
-
-class TizenMobile:
-
- """
- Implementation for transfer data
- between Host and Tizen Mobile Device
- """
-
- def __init__(self, device_id=None):
- self.deviceid = device_id
- self.is_NE = 0
- if self.deviceid and str(self.deviceid).find('NE') > -1:
- self.is_NE = int(self.deviceid.split(':')[1].split('_')[0])
- self.deviceid = self.deviceid.split('_')[1]
- self._wrt = False
- self._xwalk = False
- self.support_remote = True
- self.get_user_id()
-
-#default user is changed "app" to "owner"
-#jh0219.han@samsung.com
-
- def is_NE_mode(self):
- return self.is_NE
-
- def get_devid(self):
- return self.deviceid
-
- def get_user_id(self):
- if TIZEN_USER == 'owner':
- self.port = '5000'
- else:
- cmdline = XWALK_QUERY_ID % (self.deviceid, TIZEN_USER)
- exit_code, ret = shell_command(cmdline)
- if exit_code == -1:
- LOGGER.info("[ can not get user id ]")
- if len(ret) >0 :
- self.port = ret[0]
-
- def is_support_remote(self):
- return self.support_remote
-
- def shell_cmd(self, cmd="", timeout=15):
- cmdline = SDB_COMMAND % (self.deviceid, cmd)
- return shell_command(cmdline, timeout)
-
- def check_process(self, process_name):
- exit_code, ret = shell_command(
- APP_QUERY_STR % (self.deviceid, process_name))
- return len(ret)
-
- def kill_stub(self):
- #add this function to avoid webdriver issue if stub exists running on device,yangx.zhou@intel.com
- cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2 }'"
- exit_code, ret = self.shell_cmd(cmdline)
- if exit_code == 0 and len(ret) >0:
- cmdline = "kill -9 %s" %ret[0]
- exit_code, ret = self.shell_cmd(cmdline)
-
- def launch_stub(self, stub_app, stub_port, debug_opt=""):
- #block OTCIS-3781
- #self.kill_stub()
- cmdline = "/opt/home/developer/%s --port:%s %s; sleep 2s" % \
- (stub_app, stub_port, debug_opt)
-
- exit_code, ret = self.shell_cmd(cmdline)
- time.sleep(2)
-
- def shell_cmd_ext(self,
- cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None):
- #if cmd.startswith('app_user@'):
- #jh0219.han@samsung.com
- #modified considering multi_user
- usr = TIZEN_USER + '_user@'
- usr_len = len(usr)
- if cmd.startswith(usr):
- cmdline = SDB_COMMAND_APP % (self.deviceid,TIZEN_USER, self.port, cmd[usr_len:])
- else:
- cmdline = SDB_COMMAND_RTN % (self.deviceid, cmd)
- return shell_command_ext(cmdline, timeout, boutput, stdout_file, stderr_file)
-
- def get_device_info(self):
- """get tizen device inforamtion"""
- device_info = {}
- resolution_str = ""
- screen_size_str = ""
- device_model_str = ""
- device_name_str = ""
- build_id_str = ""
- os_version_str = ""
-
- # get resolution and screen size
- exit_code, ret = shell_command(
- "sdb -s %s shell xrandr" % self.deviceid)
- pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
- for line in ret:
- match = pattern.search(line)
- if match:
- resolution_str = "%s x %s" % (match.group(1), match.group(2))
- screen_size_str = "%s x %s" % (match.group(3), match.group(4))
-
- # get architecture
- exit_code, ret = shell_command(
- "sdb -s %s shell cat /etc/info.ini" % self.deviceid)
- for line in ret:
- if line.find("Model=") != -1:
- device_model_str = str(line.split('=')[1]).replace(";","")
- break
-
- # get hostname
- exit_code, ret = shell_command(
- "sdb -s %s shell uname -n" % self.deviceid)
- if len(ret) > 0:
- device_name_str = ret[0]
-
- # get os version
- exit_code, ret = shell_command(
- "sdb -s %s shell cat /etc/issue" % self.deviceid)
- for line in ret:
- if len(line) > 1:
- os_version_str = "%s %s" % (os_version_str, line)
-
- # get build id
- exit_code, ret = shell_command(
- "sdb -s %s shell cat /etc/os-release" % self.deviceid)
- for line in ret:
- if line.find("BUILD_ID=") != -1:
- build_id_str = line.split('=')[1].strip('\"\r\n')
-
- os_version_str = os_version_str[0:-1]
- device_info["device_id"] = self.deviceid
- device_info["resolution"] = resolution_str
- device_info["screen_size"] = screen_size_str
- device_info["device_model"] = device_model_str
- device_info["device_name"] = device_name_str
- device_info["os_version"] = os_version_str
- device_info["build_id"] = build_id_str
- return device_info
-
- def get_server_url(self, remote_port="8000"):
- """forward request a host tcp port to targe tcp port"""
- if remote_port is None:
- return None
-
- os.environ['no_proxy'] = LOCAL_HOST_NS
- host = LOCAL_HOST_NS
- inner_port = 9000
- time_out = 2
- bflag = False
- while True:
- sock_inner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock_inner.settimeout(time_out)
- try:
- sock_inner.bind((host, inner_port))
- sock_inner.close()
- bflag = False
- except socket.error as error:
- if error.errno == 98 or error.errno == 13:
- bflag = True
- if bflag:
- inner_port += 1
- else:
- break
- host_port = str(inner_port)
- cmd = "sdb -s %s forward tcp:%s tcp:%s" % \
- (self.deviceid, host_port, remote_port)
- exit_code, ret = shell_command(cmd)
- url_forward = "http://%s:%s" % (host, host_port)
- return url_forward
-
- def download_file(self, remote_path, local_path):
- """download file from device"""
- local_path_dir = os.path.dirname(local_path)
- if not os.path.exists(local_path_dir):
- os.makedirs(local_path_dir)
- filename = os.path.basename(remote_path)
- cmd = "sdb -s %s pull %s %s" % (
- self.deviceid, remote_path, local_path_dir)
- exit_code, ret = shell_command(cmd)
- if exit_code != 0:
- error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
- LOGGER.info("[ Download file \"%s\" failed, error: %s ]"
- % (remote_path, error))
- return False
- else:
- src_path = os.path.join(local_path_dir, filename)
- if src_path != local_path:
- shutil.move(src_path, local_path)
- return True
-
- def upload_file(self, remote_path, local_path):
- """upload file to device"""
- cmd = "sdb -s %s push %s %s" % (self.deviceid, local_path, remote_path)
- exit_code, ret = shell_command(cmd)
- if exit_code != 0:
- error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
- LOGGER.info("[ Upload file \"%s\" failed,"
- " get error: %s ]" % (local_path, error))
- return False
- else:
- return True
-
- def _get_wrt_app(self, test_suite, test_set, fuzzy_match, auto_iu):
- test_app_id = None
- if auto_iu:
- test_wgt = test_set
- test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
- if not self.install_app(test_wgt_path):
- LOGGER.info("[ failed to install widget \"%s\" in target ]"
- % test_wgt)
- return None
- else:
- test_wgt = test_suite
-
- # check if widget installed already
- cmd = WRT_QUERY_STR % (self.deviceid, test_wgt)
- exit_code, ret = shell_command(cmd)
- if exit_code == -1:
- return None
- for line in ret:
- items = line.split(':')
- if len(items) < 1:
- continue
- if (fuzzy_match and items[0].find(test_wgt) != -1) or items[0] == test_wgt:
- test_app_id = items[1].strip('\r\n')
- break
-
- if test_app_id is None:
- LOGGER.info("[ test widget \"%s\" not found in target ]"
- % test_wgt)
- return None
-
- return test_app_id
-
- def _get_xwalk_app(self, test_suite, test_set, fuzzy_match, auto_iu):
- test_app_id = None
- if auto_iu:
- test_wgt = test_set
- test_wgt_path = XWALK_LOCATION % (test_suite, test_wgt)
-
- if not self.install_app(test_wgt_path):
- LOGGER.info("[ failed to install widget \"%s\" in target ]"
- % test_wgt)
- return None
- else:
- test_wgt = test_suite
-
- # check if widget installed already
- cmd = XWALK_QUERY_STR % (self.deviceid, TIZEN_USER, self.port, test_wgt)
- exit_code, ret = shell_command(cmd)
- if exit_code == -1:
- return None
- for line in ret:
- test_app_id = line.strip('\r\n')
- if test_app_id is None:
- LOGGER.info("[ test widget \"%s\" not found in target ]"
- % test_wgt)
- return None
-
- return test_app_id
-
- def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
- """
- get test option dict
- """
- test_opt = {}
- self._wrt = False
- self._xwalk = False
- app_id = None
- test_opt["suite_name"] = test_suite
- test_opt["launcher"] = test_launcher
- if test_widget is not None and test_widget != "":
- test_suite = test_widget
- if test_launcher.find('WRTLauncher') >= 0:
- self._wrt = True
- test_opt["launcher"] = WRT_MAIN
- client_cmds = test_launcher.strip().split()
- wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
- test_opt['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
- test_opt['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
- test_opt['self_exec'] = wrt_tag.find('a') != -1
- test_opt['self_repeat'] = wrt_tag.find('r') != -1
- app_id = self._get_wrt_app(test_suite, test_set, fuzzy_match, auto_iu)
- elif test_launcher.find('xwalk') >= 0 and len(test_launcher) <= 16:
- self._xwalk = True
- test_opt["launcher"] = XWALK_MAIN
- client_cmds = test_launcher.strip().split()
- xpk_tag = client_cmds[1] if len(client_cmds) > 1 else ""
- test_opt['fuzzy_match'] = fuzzy_match = xpk_tag.find('z') != -1
- test_opt['auto_iu'] = auto_iu = xpk_tag.find('iu') != -1
- test_opt['self_exec'] = xpk_tag.find('a') != -1
- test_opt['self_repeat'] = xpk_tag.find('r') != -1
- app_id = self._get_xwalk_app(test_suite, test_set, fuzzy_match, auto_iu)
- else:
- app_id = test_launcher
-
- if app_id is None:
- return None
- length = len(app_id) - 1
- #test_opt["test_app_id"] = '''%s''' % app_id[1:length]
- test_opt["test_app_id"] = app_id
- print app_id
- cmd_app_id = app_id.split('.')[0]
- cmd1 = WRT_SMACK_STR % (self.deviceid, cmd_app_id[1:])
- cmd2 = WRT_SMACK_REV_STR % (self.deviceid, cmd_app_id[1:])
- print cmd1
- print cmd2
-
- shell_command(cmd1)
- shell_command(cmd2)
-
- return test_opt
-
- def install_package(self, pkgpath):
- """install a package on tizen device:
- push package and install with shell command
- """
- cmd = RPM_INSTALL % (self.deviceid, pkgpath)
- exit_code, ret = shell_command(cmd)
- return ret
-
- def uninstall_package(self, pkgname):
- """install a package on tizen device:
- push package and install with shell command
- """
- cmd = RPM_UNINSTALL % (self.deviceid, pkgname)
- exit_code, ret = shell_command(cmd)
- return ret
-
- def get_installed_package(self):
- """get list of installed package from device"""
- cmd = RPM_LIST % self.deviceid
- exit_code, ret = shell_command(cmd)
- return ret
-
- def start_debug(self, dlogfile):
- global debug_flag, metux
- if self.is_NE_mode():
- return
- debug_flag = True
- metux = threading.Lock()
- cmdline = DLOG_CLEAR % self.deviceid
- exit_code, ret = shell_command(cmdline)
- cmdline = DLOG_WRT % self.deviceid
- th = threading.Thread(target=debug_trace, args=(cmdline, dlogfile+'.dlog'))
- th.setDaemon(True)
- th.start()
-
- def stop_debug(self):
- global debug_flag, metux
- if self.is_NE_mode():
- return
- metux.acquire()
- debug_flag = False
- metux.release()
-
- def launch_app(self, wgt_name):
- blauched = False
- if self._wrt:
- timecnt = 0
- cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- cmdline = WRT_START_STR % (self.deviceid, wgt_name)
- while timecnt < 3:
- exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
- if exit_code == "0":
- blauched = True
- break
- timecnt += 1
- time.sleep(3)
- elif self._xwalk:
- cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- cmdline = XWALK_START_STR % (self.deviceid, TIZEN_USER, self.port, XWALK_MAIN, wgt_name)
- exit_code, ret = shell_command(cmdline)
- time.sleep(3)
- blauched = True
- else:
- cmdline = APP_NONBLOCK_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- time.sleep(3)
- cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmd)
- if ret and len(ret):
- blauched = True
-
- return blauched
-
- def kill_app(self, wgt_name):
- if self._wrt:
- cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmdline)
- elif self._xwalk:
- cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- return True
-
- def install_app(self, wgt_path="", timeout=90):
- if self._wrt:
- cmd = WRT_INSTALL_STR % (self.deviceid, wgt_path)
- elif self._xwalk:
- if len(wgt_path):
- ext = wgt_path.split(".")[1]
- cmd = XWALK_INSTALL_STR % (self.deviceid, TIZEN_USER, self.port, ext, wgt_path)
- else:
- return True
- exit_code, ret = shell_command(cmd, timeout)
- if exit_code == -1:
- cmd = APP_QUERY_STR % (self.deviceid, wgt_path)
- exit_code, ret = shell_command(cmd)
- for line in ret:
- cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
- exit_code, ret = shell_command(cmd)
- return False
- else:
- return True
-
- def uninstall_app(self, wgt_name):
- if self._wrt:
- cmd = WRT_UNINSTL_STR % (self.deviceid, TIZEN_USER, self.port, wgt_name)
- elif self._xwalk:
- cmd = XWALK_UNINSTL_STR % (self.deviceid, TIZEN_USER,self.port, wgt_name)
- else:
- return True
- exit_code, ret = shell_command(cmd)
- return True
-
- def get_buildinfo(self, _tizenV):
- """ get builf info"""
- device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
-
- buildinfo_file = '/opt/testkit/lite3.0/' + self.deviceid + '/buildinfo.xml'
- build_info = {}
- build_info['buildid'] = ''
- build_info['manufacturer'] = ''
- build_info['model'] = ''
-
- if self.download_file(device_file, buildinfo_file) \
- and EXISTS(buildinfo_file):
- root = etree.parse(buildinfo_file).getroot()
- for element in root.findall("buildinfo"):
- if element is not None:
- if element.get("name").lower() == 'buildversion':
- child = etree.Element.getchildren(element)
- if child and child[0].text:
- buildid = child[0].text
- build_info['buildid'] = buildid
- if element.get("name").lower() == 'manufacturer':
- child = etree.Element.getchildren(element)
- if child and child[0].text:
- manufacturer = child[0].text
- build_info['manufacturer'] = manufacturer
- if element.get("name").lower() == 'model':
- child = etree.Element.getchildren(element)
- if child and child[0].text:
- model = child[0].text
- build_info['model'] = model
- os.remove(buildinfo_file)
- return build_info
-
-def get_target_conn(device_id=None):
- """ Get connection for Test Target"""
- if device_id is None:
- dev_list = _get_device_ids()
- if len(dev_list):
- device_id = dev_list[0]
- else:
- raise InvalidDeviceException('No TIZEN device found!')
- return TizenMobile(device_id)
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitliteenginesdir = /usr/lib/python2.7/dist-packages/testkitlite/engines
-dist_testkitliteengines_SCRIPTS = *.py
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-""" The implementation of pyunit test engine"""
-
-import os
-import time
-import sys
-import threading
-import uuid
-import StringIO
-import unittest
-from unittest import TestResult
-from datetime import datetime
-from testkitlite.util.log import LOGGER
-from testkitlite.util.result import TestSetResut
-
-
-ANDROID_UNIT_STATUS = "INSTRUMENTATION_STATUS:"
-ANDROID_UNIT_STATUS_CODE = "INSTRUMENTATION_STATUS_CODE:"
-ANDROID_UNIT_STATUS_LEN = len(ANDROID_UNIT_STATUS)
-ANDROID_UNIT_STATUS_CODE_LEN = len(ANDROID_UNIT_STATUS_CODE)
-ANDROID_UNIT_START = "am instrument -r -w -e class %s %s/android.test.InstrumentationTestRunner"
-DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
-result_buffer = None
-
-
-def _case_create(case_class, case_id, purpose, status, message):
- _case = dict()
- _case['case_class'] = case_class
- _case['case_id'] = case_id
- _case['purpose'] = case_id
- _case['start_at'] = datetime.now().strftime(DATE_FORMAT_STR)
- if status == '-2':
- _case['result'] = 'FAIL'
- elif status == '0':
- _case['result'] = 'PASS'
- _case['stdout'] = '[message]' + message
- _case['end_at'] = datetime.now().strftime(DATE_FORMAT_STR)
- return _case
-
-
-def _adunit_lines_handler(outstr):
- """android unittest result wrapper"""
- lines = outstr.split('\r\n')
- results = []
- b_stack = False
- case_class=case_id = purpose = result = message = ''
- for line in lines:
- #print 'debug', line
- if line.startswith(ANDROID_UNIT_STATUS):
- content = line[ANDROID_UNIT_STATUS_LEN:].strip()
- if content.startswith('class='):
- case_class = content[content.find('class=')+6:]
- elif content.startswith('test='):
- result = message = ''
- b_stack = False
- case_id = content[content.find('test=')+5:]
- purpose = case_id
- elif content.startswith('stack='):
- message = content[content.find('stack=')+6:]
- b_stack = True
- elif line.startswith(ANDROID_UNIT_STATUS_CODE):
- status = line[ANDROID_UNIT_STATUS_CODE_LEN:].strip()
- if status != '1': # FAIL / PASS
- results.append(_case_create(case_class, case_id, purpose, status, message))
- # print 'debug', results
- else:
- if b_stack:
- message += line
- result_buffer.extend_result(results)
-
-
-def _adunit_test_exec(conn, test_session, test_set_path, result_obj):
- """function for running core tests"""
- global result_buffer
- result_buffer = result_obj
- result_obj.set_status(0)
- for tc in test_set_path['cases']:
- # LOGGER.info('[ android unit test, entry: %s ]' % test_set_path)
- # test_cmd = ANDROID_UNIT_START % (test_set_path, '.'.join(test_set_path.split('.')[:-1]))
- # _code, _out, _error = conn.shell_cmd_ext(cmd=test_cmd, timeout=None, boutput=True, callbk=_adunit_lines_handler)
- # result_obj.set_status(1)
- LOGGER.info('[ android unit test, entry: %s ]' % tc['entry'])
- test_cmd = ANDROID_UNIT_START % (tc['entry'], '.'.join(tc['entry'].split('.')[:-1]))
- _code, _out, _error = conn.shell_cmd_ext(cmd=test_cmd, timeout=None, boutput=True, callbk=_adunit_lines_handler)
- result_obj.set_status(1)
-
-class TestWorker(object):
-
- """Test executor for testkit-lite"""
-
- def __init__(self, conn):
- super(TestWorker, self).__init__()
- self.conn = conn
- self.server_url = None
- self.result_obj = None
- self.opts = dict({'block_size': 300,
- 'test_type': None,
- 'auto_iu': False,
- 'fuzzy_match': False,
- 'self_exec': False,
- 'self_repeat': False,
- 'debug_mode': False
- })
-
- def init_test(self, params):
- """init the test envrionment"""
- self.opts['testset_name'] = params.get('testset-name', '')
- self.opts['testsuite_name'] = params.get('testsuite-name', '')
- self.opts['debug_log_base'] = params.get("debug-log-base", '')
- return str(uuid.uuid1())
-
- def run_test(self, sessionid, test_set):
- """
- process the execution for a test set
- """
- #print 'debug', test_set
- if sessionid is None:
- return False
- disabledlog = os.environ.get("disabledlog","")
- # start debug trace thread
- if len(disabledlog) > 1:
- pass
- else:
- self.conn.start_debug(self.opts['debug_log_base'])
- time.sleep(1)
- self.result_obj = TestSetResut(
- self.opts['testsuite_name'], self.opts['testset_name'])
- self.opts['async_th'] = threading.Thread(
- target=_adunit_test_exec,
- args=(self.conn, sessionid, test_set, self.result_obj)
- )
- # self.opts['async_th'] = threading.Thread(
- # target=_adunit_test_exec,
- # args=(self.conn, sessionid, test_set['test_set_src'], self.result_obj)
- # )
- self.opts['async_th'].start()
- return True
-
- def get_test_status(self, sessionid):
- """poll the test task status"""
- if sessionid is None:
- return None
- result = {}
- result["msg"] = []
- result["finished"] = str(self.result_obj.get_status())
- return result
-
- def get_test_result(self, sessionid):
- """get the test result for a test set """
- result = {}
- if sessionid is None:
- return result
-
- result = self.result_obj.get_result()
- return result
-
- def finalize_test(self, sessionid):
- """clear the test stub and related resources"""
- if sessionid is None:
- return False
-
- if self.result_obj is not None:
- self.result_obj.set_status(1)
-
- # stop debug thread
- self.conn.stop_debug()
-
- return True
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-""" The implementation of default test engine"""
-
-import os
-import time
-import threading
-import uuid
-import ConfigParser
-
-from datetime import datetime
-from testkitlite.util.log import LOGGER
-from testkitlite.util.httprequest import get_url, http_request
-from testkitlite.util.result import TestSetResut
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = ConfigParser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-
-CNT_RETRY = 10
-DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
-UIFW_MAX_TIME = 300
-UIFW_MAX_WRITE_TIME = 10
-UIFW_RESULT = os.path.join(DEVICE_SUITE_TARGET_30, "Documents/tcresult")
-UIFW_SET_NUM = 0
-LAUNCH_ERROR = 1
-BLOCK_ERROR = 3
-FILES_ROOT = os.path.expanduser("~") + os.sep
-
-
-def _core_test_exec(conn, test_session, test_set_name, exetype, \
- cases_queue, result_obj):
- """function for running core tests"""
- exetype = exetype.lower()
- total_count = len(cases_queue)
- current_idx = 0
- manual_skip_all = False
- result_list = []
- stdout_file = FILES_ROOT + test_session + "_stdout.log"
- stderr_file = FILES_ROOT + test_session + "_stderr.log"
- initscript = os.environ.get('initscript', '')
- postscript = os.environ.get('postscript', '')
- for test_case in cases_queue:
- if result_obj.get_status() == 1:
- break
-
- current_idx += 1
- core_cmd = ""
- if "entry" in test_case:
- core_cmd = test_case["entry"]
- else:
- LOGGER.info(
- "[ Warnning: test script is empty,"
- " please check your test xml file ]")
- continue
- expected_result = test_case.get('expected_result', '0')
- time_out = int(test_case.get('timeout', '90'))
- location = test_case.get('location', 'device')
- measures = test_case.get('measures', [])
- retmeasures = []
- os.environ['CASE_ID'] = test_case['case_id']
-
- LOGGER.info("\n[%s:%s] TestCase: %s\n"
- "TestEntry: %s"
- % (current_idx, total_count, test_case['case_id'], core_cmd))
-
- strtime = datetime.now().strftime(DATE_FORMAT_STR)
- LOGGER.info("start: %s" % strtime)
- test_case["start_at"] = strtime
- if exetype == 'auto':
- return_code, stdout, stderr = -1, [], []
- if location == 'host':
- if len(initscript) > 1:
- return_code, stdout, stderr = \
- conn.shell_cmd_host(initscript, time_out, False, \
- stdout_file, stderr_file)
-
- if return_code is not None and return_code != "timeout":
- LOGGER.info('init script ok')
- else:
- LOGGER.info('init script fail')
- return_code, stdout, stderr = -1, [], []
- return_code, stdout, stderr = \
- conn.shell_cmd_host(core_cmd, time_out, False, \
- stdout_file, stderr_file)
- else:
- if len(initscript) > 1:
- return_code, stdout, stderr = \
- conn.shell_cmd_ext(initscript, time_out, False, \
- stdout_file, stderr_file)
- if return_code is not None and return_code != "timeout":
- LOGGER.info('init script ok')
- else:
- LOGGER.info('init script fail')
- return_code, stdout, stderr = -1, [], []
- return_code, stdout, stderr = \
- conn.shell_cmd_ext(core_cmd, time_out, False, \
- stdout_file, stderr_file)
- print 'return ', return_code, stdout, stderr
- if return_code is not None and return_code != "timeout":
- test_case["result"] = "pass" if str(
- return_code) == expected_result else "fail"
- test_case["stdout"] = stdout
- test_case["stderr"] = stderr
- for item in measures:
- ind = item['name']
- fname = item['file']
- if fname is None:
- continue
- tmpname = FILES_ROOT + test_session + "_mea_tmp"
- if conn.download_file(fname, tmpname):
- try:
- config = ConfigParser.ConfigParser()
- config.read(tmpname)
- item['value'] = config.get(ind, 'value')
- retmeasures.append(item)
- os.remove(tmpname)
- except IOError as error:
- LOGGER.error(
- "[ Error: fail to parse value,"
- " error:%s ]\n" % error)
- test_case["measures"] = retmeasures
- else:
- test_case["result"] = "BLOCK"
- test_case["stdout"] = stdout
- test_case["stderr"] = stderr
- elif exetype == 'manual':
- # handle manual core cases
- try:
- # LOGGER.infopre-condition info
- if "pre_condition" in test_case:
- LOGGER.info("\n****\nPre-condition: %s\n ****\n"
- % test_case['pre_condition'])
- # LOGGER.infostep info
- if "steps" in test_case:
- for step in test_case['steps']:
- LOGGER.info(
- "********************\n"
- "Step Order: %s" % step['order'])
- LOGGER.info("Step Desc: %s" % step['step_desc'])
- LOGGER.info(
- "Expected: %s\n********************\n"
- % step['expected'])
- if manual_skip_all:
- test_case["result"] = "N/A"
- else:
- while True:
- test_result = raw_input(
- '[ please input case result ]'
- ' (p^PASS, f^FAIL, b^BLOCK, n^Next, d^Done):')
- if test_result.lower() == 'p':
- test_case["result"] = "PASS"
- break
- elif test_result.lower() == 'f':
- test_case["result"] = "FAIL"
- break
- elif test_result.lower() == 'b':
- test_case["result"] = "BLOCK"
- break
- elif test_result.lower() == 'n':
- test_case["result"] = "N/A"
- break
- elif test_result.lower() == 'd':
- manual_skip_all = True
- test_case["result"] = "N/A"
- break
- else:
- LOGGER.info(
- "[ Warnning: you input: '%s' is invalid,"
- " please try again ]" % test_result)
- except IOError as error:
- LOGGER.info(
- "[ Error: fail to get core manual test step,"
- " error: %s ]\n" % error)
- strtime = datetime.now().strftime(DATE_FORMAT_STR)
- LOGGER.info("end : %s" % strtime)
- test_case["end_at"] = strtime
- LOGGER.info("execute case: %s" % test_case["result"])
- result_list.append(test_case)
- if len(postscript) > 1:
- if location == 'host':
- return_code, stdout, stderr = \
- conn.shell_cmd_host(postscript, time_out, False, \
- stdout_file, stderr_file)
- if return_code is not None and return_code != "timeout":
- LOGGER.info('post script ok')
- else:
- LOGGER.info('post script fail')
-
- else:
- if postscript is not None or postscript is not '':
- return_code, stdout, stderr = \
- conn.shell_cmd_ext(postscript, time_out, False, \
- stdout_file, stderr_file)
- if return_code is not None and return_code != "timeout":
- LOGGER.info('post script ok')
- else:
- LOGGER.info('post script fail')
-
- result_obj.extend_result(result_list, False)
- result_obj.set_status(1)
-
-
-def _web_test_exec(conn, server_url, test_web_app, exetype, \
- cases_queue, result_obj):
- """function for running web tests"""
- exetype = exetype.lower()
- test_set_finished = False
- err_cnt = 0
- for test_group in cases_queue:
- if test_set_finished:
- break
-
- ret = http_request(
- get_url(server_url, "/set_testcase"), "POST", test_group, 30)
- if ret is None:
- LOGGER.error(
- "[ set testcases timeout, please check device! ]")
- result_obj.set_status(1)
- break
-
- if not conn.launch_app(test_web_app):
- LOGGER.error("[ ERROR: launch test app %s failed! ]" \
- % test_web_app)
- result_obj.set_status(1)
- break
-
- while True:
- if result_obj.get_status() == 1:
- test_set_finished = True
- break
- ret = http_request(
- get_url(server_url, "/check_server_status"), "GET", {})
- if ret is None:
- LOGGER.error(
- "[ ERROR: get server status timeout, please check device! ]")
- err_cnt += 1
- else:
- result_cases = ret.get("cases")
- error_code = ret.get("error_code")
- if error_code is not None:
- if not conn.launch_app(test_web_app):
- test_set_finished = True
- result_obj.set_status(1)
- break
- if error_code == LAUNCH_ERROR:
- LOGGER.error("[ERROR : test app no response, hang or not launched!]")
- test_set_finished = True
- result_obj.set_status(1)
- break
- elif error_code == BLOCK_ERROR:
- LOGGER.error("[ ERROR: test case block issue! ]")
- err_cnt += 1
- else:
- err_cnt = 0
-
- if result_cases is not None and len(result_cases):
- result_obj.extend_result(result_cases)
- elif exetype == 'manual':
- LOGGER.info(
- "[ please execute manual cases ]\r\n")
-
- if ret["finished"] == 1:
- test_set_finished = True
- result_obj.set_status(1)
- break
- elif ret["block_finished"] == 1:
- break
-
- if err_cnt >= CNT_RETRY:
- LOGGER.error(
- "[error: get too many errors, stop current set]")
- test_set_finished = True
- result_obj.set_status(1)
- break
- time.sleep(2)
-
-
-def _webuifw_test_exec(conn, test_web_app, test_session, test_set_name, \
- exetype, cases_queue, result_obj):
- """function for running webuifw tests"""
- global UIFW_SET_NUM
- UIFW_SET_NUM = UIFW_SET_NUM + 1
- set_UIFW_RESULT = UIFW_RESULT + "_" + str(UIFW_SET_NUM) + ".xml"
- result_obj.set_status(0)
- result_obj.set_result({"resultfile": ""})
- ls_cmd = "ls -l %s" % set_UIFW_RESULT
- sz_cmd = "du -hk %s " % set_UIFW_RESULT
- time_out = UIFW_MAX_TIME
- rm_cmd = "rm " + os.path.join(DEVICE_SUITE_TARGET_30, "Documents/tcresult*.xml")
- #jh0219.han@samsung.com
- if exetype == "auto":
- conn.shell_cmd(rm_cmd)
- UIFW_SET_NUM = 1
- LOGGER.info('[webuifw] start test executing')
- if not conn.launch_app(test_web_app):
- LOGGER.info("[ launch test app \"%s\" failed! ]" % test_web_app)
- result_obj.set_result({"resultfile": ""})
- result_obj.set_status(1)
-
- result_file = FILES_ROOT + test_session + "_uifw.xml"
-
- while time_out > 0:
- LOGGER.info('[webuifw] waiting for test completed...')
- exit_code, ret = conn.shell_cmd(ls_cmd)
- if not 'No such file or directory' in ret[0]:
- exit_code, ret = conn.shell_cmd(sz_cmd)
- f_size = int(ret[0].split("\t")[0])
- if f_size > 0:
- break
- if time_out > UIFW_MAX_WRITE_TIME:
- time_out = UIFW_MAX_WRITE_TIME
- time.sleep(2)
- time_out -= 2
-
- LOGGER.info('[webuifw] end test executing')
- if conn.download_file(set_UIFW_RESULT, result_file):
- result_obj.set_result({"resultfile": result_file})
- for test_case in cases_queue:
- LOGGER.info("[webuifw] execute case: %s # %s" %
- (test_set_name, test_case['case_id']))
- result_obj.set_status(1)
-
-
-class TestWorker(object):
-
- """Test executor for testkit-lite"""
-
- def __init__(self, conn):
- super(TestWorker, self).__init__()
- self.conn = conn
- self.server_url = None
- self.result_obj = None
-
- self.opts = dict({'block_size': 300,
- 'test_type': None,
- 'auto_iu': False,
- 'fuzzy_match': False,
- 'self_exec': False,
- 'self_repeat': False,
- 'debug_mode': False
- })
-
- def set_TizenVersion(self, tizenversion):
- print ""
-
- def __init_test_stub(self, stub_app, stub_port, debug_opt):
- # init testkit-stub deamon process
- timecnt = 0
- blaunched = False
- while timecnt < CNT_RETRY:
- #print 'stub_app' ,stub_app
- if not self.conn.check_process(stub_app):
- LOGGER.info("[ no stub process activated, now try to launch %s ]" % stub_app)
- self.conn.launch_stub(stub_app, stub_port, debug_opt)
- timecnt += 1
- else:
- blaunched = True
- break
-
- if not blaunched:
- LOGGER.info("[ launch stub process failed! ]")
- return False
-
- if self.server_url is None:
- self.server_url = self.conn.get_server_url(stub_port)
-
- timecnt = 0
- blaunched = False
- while timecnt < CNT_RETRY:
- ret = http_request(get_url(
- self.server_url, "/check_server_status"), "GET", {})
- if ret is None:
- LOGGER.info("[ check server status, not ready yet! ]")
- timecnt += 1
- time.sleep(1)
- else:
- blaunched = True
- break
- return blaunched
-
- def __init_webtest_opt(self, params):
- """init the test runtime, mainly process the star up of test stub"""
- if params is None:
- return None
-
- session_id = str(uuid.uuid1())
- stub_app = params.get('stub-name', 'testkit-stub')
- stub_port = params.get('stub-port', '8000')
- testsuite_name = params.get('testsuite-name', '')
- testset_name = params.get('testset-name', '')
- capability_opt = params.get("capability", None)
- test_launcher = params.get('test-launcher', '')
- test_extension = params.get('test-extension', None)
- test_widget = params.get('test-widget', None)
- # jh0219.han@samsung.com //in
- client_cmds = params.get('test-launcher', '').strip().split()
- wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
- self.opts['self_exec'] = wrt_tag.find('a') != -1
- self.opts['self_repeat'] = wrt_tag.find('r') != -1
- # jh0219.han@samsung.com //out
- # LOGGER.info("[f*: %s ]" % str(params))
- test_opt = self.conn.get_launcher_opt(
- test_launcher, test_extension, test_widget, \
- testsuite_name, testset_name)
- if test_opt is None:
- LOGGER.info("[ init the test launcher, get failed ]")
- return None
- LOGGER.info("[ test launcher: %s ]" % test_opt["launcher"])
- LOGGER.info("[ test app: %s ]" % test_opt["test_app_id"])
- self.opts.update(test_opt)
- self.opts['debug_mode'] = params.get("debug", False)
-
- # uifw, this suite don't need stub
- if self.opts['self_exec'] or self.opts['self_repeat']:
- self.opts['test_type'] = "jqunit"
- return session_id
-
- # enable debug information
- stub_debug_opt = "--debug" if self.opts['debug_mode'] else ""
-
- # suite_id to be removed in later version
- test_opt["suite_id"] = test_opt["test_app_id"]
- if self.__init_test_stub(stub_app, stub_port, stub_debug_opt):
- ret = http_request(get_url(
- self.server_url, "/init_test"), "POST", test_opt)
- if ret is None:
- LOGGER.info("[ init test suite failed! ]")
- return None
- elif "error_code" in ret:
- LOGGER.info("[ init test suite, "
- "get error code %d ! ]" % ret["error_code"])
- return None
-
- if capability_opt is not None:
- ret = http_request(get_url(self.server_url,
- "/set_capability"),
- "POST", capability_opt)
- return session_id
- else:
- LOGGER.info("[ Init test failed ! ]")
- return None
-
- def init_test(self, params):
- """init the test envrionment"""
- self.opts['testset_name'] = params.get('testset-name', '')
- self.opts['testsuite_name'] = params.get('testsuite-name', '')
- self.opts['debug_log_base'] = params.get("debug-log-base", '')
- if params.get('test-launcher') is not None:
- self.opts['test_type'] = "webapi"
- return self.__init_webtest_opt(params)
- elif params.get('set_type') in ['ref', 'js']:
- self.opts['test_type'] = "webapi"
- params['test-launcher'] = "xwalk"
- return self.__init_webtest_opt(params)
- else:
- self.opts['test_type'] = "coreapi"
- return str(uuid.uuid1())
-
- def __run_core_test(self, sessionid, test_set_name, exetype, cases):
- """
- process the execution for core api test
- """
- self.opts['async_th'] = threading.Thread(
- target=_core_test_exec,
- args=(
- self.conn, sessionid, test_set_name, exetype, \
- cases, self.result_obj)
- )
- self.opts['async_th'].start()
- return True
-
- def __run_jqt_test(self, sessionid, test_set_name, cases):
- """
- process the execution for Qunit testing
- """
- exetype = "auto" if self.opts['self_exec'] else ""
- self.opts['async_th'] = threading.Thread(
- target=_webuifw_test_exec,
- args=(
- self.conn, self.opts['test_app_id'], sessionid, \
- test_set_name, exetype, cases, self.result_obj)
- )
- self.opts['async_th'].start()
- return True
-
- def __run_web_test(self, sessionid, test_set_name, exetype, ctype, cases):
- """
- process the execution for web api test
- may be splitted to serveral blocks,
- with the unit size defined by block_size
- """
- #print 'web test'
- case_count = len(cases)
- blknum = 0
- if case_count % self.opts['block_size'] == 0:
- blknum = case_count / self.opts['block_size']
- else:
- blknum = case_count / self.opts['block_size'] + 1
-
- idx = 1
- test_set_queues = []
- while idx <= blknum:
- block_data = {}
- block_data["exetype"] = exetype
- block_data["type"] = ctype
- block_data["totalBlk"] = str(blknum)
- block_data["currentBlk"] = str(idx)
- block_data["casecount"] = str(case_count)
- start = (idx - 1) * self.opts['block_size']
- if idx == blknum:
- end = case_count
- else:
- end = idx * self.opts['block_size']
- block_data["cases"] = cases[start:end]
- test_set_queues.append(block_data)
- idx += 1
- self.opts['async_th'] = threading.Thread(
- target=_web_test_exec,
- args=(
- self.conn, self.server_url, self.opts['test_app_id'], \
- exetype, test_set_queues, self.result_obj)
- )
- self.opts['async_th'].start()
- return True
-
- def run_test(self, sessionid, test_set):
- """
- process the execution for a test set
- """
- if sessionid is None:
- return False
-
- if not "cases" in test_set:
- return False
- disabledlog = os.environ.get('disabledlog', '')
- cases, exetype, ctype = test_set[
- "cases"], test_set["exetype"], test_set["type"]
- #print 'exetype', exetype
- if len(cases) == 0:
- return False
- # start debug trace thread
- if disabledlog == 'True':
- pass
- else:
- self.conn.start_debug(self.opts['debug_log_base'])
- time.sleep(1)
-
- self.result_obj = TestSetResut(
- self.opts['testsuite_name'], self.opts['testset_name'])
-
- devid = self.conn.get_devid()
- if self.conn.is_NE_mode() or (devid and devid.find('None') > -1):
- result_list = []
- for case in cases:
- test_case = {}
- test_case['case_id'] = case['case_id']
- test_case['result'] = 'N/A'
- if devid.find('None') > -1:
- test_case['stdout'] = "target not found"
- else:
- issue_num = int(self.conn.is_NE_mode())
- err_msg = "precondition failed "
- if issue_num == 1:
- err_msg += "(not connected to wifi)"
- elif issue_num == 2:
- err_msg += "(not set email account)"
- elif issue_num == 3:
- err_msg += "(not available device network)"
- elif issue_num == 4:
- err_msg += "(not enable bluetooth)"
- elif issue_num == 5:
- err_msg += "(not enable nfc)"
- elif issue_num == 6:
- err_msg += "(not available sim card)"
- test_case['stdout'] = err_msg
-
- result_list.append(test_case)
-
- self.result_obj.extend_result(result_list)
- self.result_obj.set_status(1)
- return True
-
- if self.opts['test_type'] == "webapi":
- if ctype == 'ref':
- exetype = 'manual'
- return self.__run_web_test(sessionid, \
- self.opts['testset_name'], exetype, ctype, cases)
- elif self.opts['test_type'] == "coreapi":
- return self.__run_core_test(sessionid, \
- self.opts['testset_name'], exetype, cases)
- #elif self.opts['test_type'] == "jqunit":
- elif self.opts['test_type'] in ["jqunit", 'pyunit']:
- return self.__run_jqt_test(sessionid, \
- self.opts['testset_name'], cases)
- else:
- LOGGER.info("[ unsupported test suite type ! ]")
- return False
-
- def get_test_status(self, sessionid):
- """poll the test task status"""
- if sessionid is None:
- return None
- result = {}
- result["msg"] = []
- result["finished"] = str(self.result_obj.get_status())
- return result
-
- def get_test_result(self, sessionid):
- """get the test result for a test set """
- result = {}
- if sessionid is None:
- return result
-
- result = self.result_obj.get_result()
- return result
-
- def finalize_test(self, sessionid):
- """clear the test stub and related resources"""
- if sessionid is None:
- return False
-
- if self.result_obj is not None:
- self.result_obj.set_status(1)
-
- # stop test app
- if self.opts['test_type'] == "webapi":
- self.conn.kill_app(self.opts['test_app_id'])
- # uninstall test app
- if self.opts['auto_iu']:
- self.conn.uninstall_app(\
- self.opts['test_app_id'].split('.')[0][1:])
-
- # stop debug thread
- self.conn.stop_debug()
-
- return True
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-""" The implementation of pyunit test engine"""
-
-import os
-import time
-import sys
-import threading
-import uuid
-import StringIO
-import unittest
-from unittest import TestResult
-from datetime import datetime
-from testkitlite.util.log import LOGGER
-from testkitlite.util.result import TestSetResut
-
-
-DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
-result_buffer = None
-class LiteTestResult(TestResult):
-
- """Python unittest result wrapper"""
-
- def startTest(self, test):
- super(LiteTestResult, self).startTest(test)
- self._case = {}
- case_full_id = test.id()
- self._case['case_id'] = case_full_id.split('.')[-1]
- self._case['purpose'] = case_full_id
- self._case['start_at'] = datetime.now().strftime(DATE_FORMAT_STR)
-
- def stopTest(self, test):
- self._case['end_at'] = datetime.now().strftime(DATE_FORMAT_STR)
- super(LiteTestResult, self).stopTest(test)
- if result_buffer is not None:
- result_buffer.extend_result([self._case])
-
- def addSuccess(self, test):
- super(LiteTestResult, self).addSuccess(test)
- self._case['result'] = 'PASS'
-
- def addError(self, test, err):
- super(LiteTestResult, self).addError(test, err)
- _, _exc_str = self.errors[-1]
- self._case['result'] = 'BLOCK'
- self._case['stdout'] = '[message]' + _exc_str
-
- def addFailure(self, test, err):
- super(LiteTestResult, self).addFailure(test, err)
- _, _exc_str = self.failures[-1]
- self._case['result'] = 'FAIL'
- self._case['stdout'] = '[message]' + _exc_str
-
-
-def _pyunit_test_exec(test_session, cases, result_obj):
- """function for running core tests"""
- global result_buffer
- result_buffer = result_obj
- result_obj.set_status(0)
- total = unittest.TestSuite()
- for tc in cases['cases']:
- if tc['entry'].find(os.sep) != -1:
- arr = tc['entry'].split(os.sep)
- path = tc['entry'][:tc['entry'].rindex(os.sep)]
- case = arr[-1]
- else:
- path = os.getcwd()
- case = tc['entry']
- try:
- tests = unittest.TestLoader().discover(path, pattern='''%s''' %case)
- total.addTest(tests)
- # unittest.TextTestRunner(resultclass=LiteTestResult, buffer=True).run(tests)
- except ImportError as error:
- pass
- try:
- unittest.TextTestRunner(resultclass=LiteTestResult, buffer=True).run(total)
- except ImportError as error:
- pass
-
- #result_obj.extend_result(resultclass)
- result_obj.set_status(1)
-
-
-class TestWorker(object):
-
- """Test executor for testkit-lite"""
-
- def __init__(self, conn):
- super(TestWorker, self).__init__()
- self.conn = conn
- self.server_url = None
- self.result_obj = None
- self.opts = dict({'block_size': 300,
- 'test_type': None,
- 'auto_iu': False,
- 'fuzzy_match': False,
- 'self_exec': False,
- 'self_repeat': False,
- 'debug_mode': False
- })
-
- def init_test(self, params):
- """init the test envrionment"""
- self.opts['testset_name'] = params.get('testset-name', '')
- self.opts['testsuite_name'] = params.get('testsuite-name', '')
- self.opts['debug_log_base'] = params.get("debug-log-base", '')
- return str(uuid.uuid1())
-
- def run_test(self, sessionid, test_set):
- """
- process the execution for a test set
- """
- if sessionid is None:
- return False
- disabledlog = os.environ.get("disabledlog","")
- # start debug trace thread
- if len(disabledlog) > 0 :
- pass
- else:
- self.conn.start_debug(self.opts['debug_log_base'])
- time.sleep(1)
- self.result_obj = TestSetResut(
- self.opts['testsuite_name'], self.opts['testset_name'])
- # self.opts['async_th'] = threading.Thread(
- # target=_pyunit_test_exec,
- # args=(sessionid, test_set['test_set_src'], test_set, self.result_obj)
- # )
- self.opts['async_th'] = threading.Thread(
- target=_pyunit_test_exec,
- args=(sessionid, test_set, self.result_obj)
- )
-
- self.opts['async_th'].start()
- return True
-
- def get_test_status(self, sessionid):
- """poll the test task status"""
- if sessionid is None:
- return None
- result = {}
- result["msg"] = []
- result["finished"] = str(self.result_obj.get_status())
- return result
-
- def get_test_result(self, sessionid):
- """get the test result for a test set """
- result = {}
- if sessionid is None:
- return result
-
- result = self.result_obj.get_result()
- return result
-
- def finalize_test(self, sessionid):
- """clear the test stub and related resources"""
- if sessionid is None:
- return False
-
- if self.result_obj is not None:
- self.result_obj.set_status(1)
-
- # stop debug thread
- self.conn.stop_debug()
-
- return True
+++ /dev/null
-import os
-import re
-import time
-import sys
-import thread
-import threading
-import socket
-import json
-import hashlib
-import signal
-import logging
-import subprocess
-import ConfigParser
-from testkitlite.util import tr_utils
-from testkitlite.util.log import LOGGER as g_logger
-from urlparse import urlparse
-
-try:
- from selenium.webdriver.remote.webdriver import WebDriver
- from selenium.webdriver.support.ui import WebDriverWait
-except ImportError, err:
- g_logger.info("Failed to import 'selenium' module, please check your installation:")
- g_logger.info(" You can use 'sudo pip install selenium' to install the module!")
- raise ImportError
-
-TE = None
-EXE_LOCK = threading.Lock()
-DEFAULT_TIMEOUT = 90
-REF_SET_TYPE = 'ref'
-JS_SET_TYPE = 'js'
-SCRIPT_SET_TYPE = 'script'
-STR_PASS = 'PASS'
-STR_FAIL = 'FAIL'
-STR_BLOCK = 'BLOCK'
-STR_NOTRUN = 'n/a'
-DEFAULT_WD_URL = 'http://127.0.0.1:9515'
-MH_FILE = "/opt/testkit/lite3.0/mh.html"
-
-
-class TestExecuter:
-
- def __init__(self, test_env=None):
- self.runner_proc = test_env['runner_proc']
- self.exe_thread = None
- self.exe_status = 'READY'
- self.tests_json = ''
- self.target_platform = test_env['target_platform']
- self.web_driver = None
- self.wd_url = test_env.get("wd_url", '') or DEFAULT_WD_URL
- self.suite_name = test_env['suite_name']
- self.set_type = test_env['set_type']
- self.set_exetype = test_env['set_exetype']
- self.test_prefix = ''
- self.exe_socket_file = test_env['exe_socket_file']
- self.exe_socket_buff_size = test_env['exe_socket_buff_size']
- self.exe_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
- self.exe_socket.connect(self.exe_socket_file)
- self.TE_LOG = g_logger
- self.debugip = test_env.get("debugip", '')
- self.appid = test_env.get("appid", '')
- signal.signal(signal.SIGINT, self.__exitHandler)
- signal.signal(signal.SIGTERM, self.__exitHandler)
-
- def __exitHandler(self, a, b):
- if self.web_driver:
- self.web_driver.quit()
- self.web_driver = None
- with EXE_LOCK:
- self.exe_status = 'DONE'
-
- def __updateTestPrefix(self):
- if self.target_platform.upper().find('ANDROID') >= 0:
- url_components = urlparse(self.web_driver.current_url)
- if url_components.scheme == 'http':
- self.test_prefix = '%s://%s/' % (url_components.scheme,
- url_components.netloc)
- elif self.target_platform.upper().find('TIZEN') >=0:
- url_components = urlparse(self.web_driver.current_url)
- self.test_prefix = '%s://%s/' % (url_components.scheme,
- url_components.netloc)
-
-
-
- def __initWebDriver(self):
- from selenium import webdriver
- self.TE_LOG.info('init web driver')
- if self.web_driver:
- self.web_driver.quit()
- self.web_driver = None
-
- test_app = test_ext = ''
- driver_env = {}
- try:
- exec 'from testkitlite.capability.%s import initCapability' % self.target_platform
- if self.target_platform.upper().find('TIZEN') >= 0:
- test_app = self.appid
- test_ext = self.debugip
- capa = {'xwalkOptions': {'tizenAppId': test_app[1:-1], 'tizenDebuggerAddress': test_ext}}
- elif self.target_platform.upper().find('ANDROID') >= 0:
- test_app, test_ext = self.appid.split('/')
- driver_env = initCapability(test_app, test_ext)
- capa = driver_env['desired_capabilities']
- driver_env = initCapability(test_app, test_ext)
- self.test_prefix = driver_env['test_prefix']
- self.web_driver = WebDriver(self.wd_url, capa)
- url_compon = urlparse(self.web_driver.current_url)
- self.__updateTestPrefix()
- return True
- except Exception, e:
- if self.target_platform.upper().find('ANDROID') >= 0:
- try:
- test_ext = test_ext.strip('.').replace('Activity', '')
- tmps = test_ext.split('_')
- actv_name = ''.join([it.capitalize() for it in tmps if it])
- test_ext = '.%sActivity' % actv_name
- self.TE_LOG.info('activity : %s' %test_ext)
- driver_env = initCapability(test_app, test_ext)
- self.web_driver = WebDriver(self.wd_url, driver_env['desired_capabilities'])
- self.__updateTestPrefix()
- return True
- except Exception, e:
- try:
- test_app, test_ext = self.appid.split('/')
- test_ext = test_ext.replace('Activity', '')
- self.TE_LOG.info('activity : %s' %test_ext)
- driver_env = initCapability(test_app, test_ext)
- self.web_driver = WebDriver(self.wd_url, driver_env['desired_capabilities'])
- self.__updateTestPrefix()
- return True
- except Exception, e:
- self.TE_LOG.error('Retry to init Web Driver get failed: %s' % e)
- return False
- else:
- self.TE_LOG.error('Init Web Driver failed: %s' % e)
- return False
-
- def __talkWithRunnerRecv(self):
- try:
- exe_data = self.exe_socket.recv(self.exe_socket_buff_size)
- if exe_data is None:
- return (None, None)
- exe_json = json.loads(exe_data)
- command = exe_json['COMMAND']
- data = exe_json['DATA']
- except Exception, e:
- self.TE_LOG.debug('Receive data failed, %s' % e)
- time.sleep(2)
- return (None, None)
- return (command, data)
-
- def __talkWithRunnerSend(self, data=None):
- try:
- self.exe_socket.send(json.dumps(data))
- except Exception, e:
- self.TE_LOG.debug('Send data failed, %s' % e)
- time.sleep(2)
- return False
- return True
-
- def __initWebManualHarness(self):
- if self.target_platform.upper().find('CHROME') >= 0:
- self.web_driver.get('%s%s' % (self.test_prefix, MH_FILE))
- else:
- self.web_driver.get('%s/index.html' % self.test_prefix)
-
- try:
- harness_page_file = open(MH_FILE)
- harness_page_raw = harness_page_file.read()
- harness_page_file.close()
- except Exception, e:
- self.TE_LOG.debug('Read manual harness file failed: %s' % e)
- return False
- harness_page_raw = harness_page_raw.replace(
- '\n', '').replace('"', '\\"').replace("'", "\\'")
- self.web_driver.execute_script(
- "document.write(\"%s\")" % harness_page_raw)
- self.web_driver.execute_script("document.close()")
- self.web_driver.execute_script("init_mh()")
-
- return True
-
- def __runWebManualTests(self):
- if not self.__initWebManualHarness():
- self.TE_LOG.error(
- 'Init web manual harness failed, exit from executer')
- return False
-
- case_num = len(self.tests_json['cases'])
- i_case = 0
- while True:
- try:
- if i_case >= (case_num - 1):
- i_case = case_num - 1
- self.web_driver.execute_script(
- "document.getElementById(\"forward-bt\").disabled=\"true\"")
- else:
- self.web_driver.execute_script(
- "document.getElementById(\"forward-bt\").disabled=\"\"")
-
- if i_case <= 0:
- i_case = 0
- self.web_driver.execute_script(
- "document.getElementById(\"back-bt\").disabled=\"true\"")
- else:
- self.web_driver.execute_script(
- "document.getElementById(\"back-bt\").disabled=\"\"")
-
- if self.set_type == REF_SET_TYPE:
- self.web_driver.execute_script(
- "document.getElementById(\"test-entry\").textContent=\"%s%s\"" % (self.test_prefix, self.tests_json['cases'][i_case]['entry']))
- self.web_driver.execute_script(
- "document.getElementById(\"refer-test-entry\").textContent=\"%s%s\"" % (self.test_prefix, self.tests_json['cases'][i_case]['refer_entry']))
- self.web_driver.execute_script(
- "document.getElementById(\"run-refer-test-bt\").style.display=\"\"")
- self.web_driver.execute_script(
- "document.getElementById(\"refer-test-entry-area\").style.display=\"\"")
- elif self.set_type == JS_SET_TYPE:
- self.web_driver.execute_script(
- "document.getElementById(\"test-entry\").textContent=\"%s%s\"" % (self.test_prefix, self.tests_json['cases'][i_case]['entry']))
- self.web_driver.execute_script(
- "document.getElementById(\"run-refer-test-bt\").style.display=\"none\"")
- self.web_driver.execute_script(
- "document.getElementById(\"refer-test-entry-area\").style.display=\"none\"")
-
- WebDriverWait(self.web_driver, 3600).until(lambda strdiff: self.web_driver.execute_script(
- "return document.getElementById(\"case-info-area\").className") != "READY")
- i_case_status = self.web_driver.find_element_by_id(
- "case-info-area").get_attribute("class")
- self.web_driver.execute_script(
- "document.getElementById(\"case-info-area\").className = \"READY\"")
- if i_case_status in [STR_PASS, STR_FAIL, STR_BLOCK]:
- self.tests_json['cases'][i_case]['result'] = i_case_status
- i_case = i_case + 1
- elif i_case_status == "FORWARD":
- i_case = i_case + 1
- elif i_case_status == "BACK":
- i_case = i_case - 1
- else:
- break
- except Exception, e:
- self.tests_json['cases'][i_case]['result'] = STR_BLOCK
- self.TE_LOG.error("Run %s: failed: %s, exit from executer" %
- (self.tests_json['cases'][i_case]['case_id'], e))
- break
-
- def __checkPageNotFound(self, page_url=None):
- try:
- if self.web_driver.current_url.find('data:text/html,chromewebdata') >= 0:
- self.TE_LOG.debug("Page not found: %s" %
- self.web_driver.current_url)
- return False
- else:
- return True
- except Exception, e:
- self.TE_LOG.error("Failed to get current url")
- return False
-
- def __runRefTests(self, haha=None, kkkk=None):
- for i_case in self.tests_json['cases']:
- with EXE_LOCK:
- if self.exe_status == 'DONE':
- return False
-
- i_case['start_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- try:
- i_case_timeout = i_case['timeout']
- except Exception, e:
- i_case_timeout = DEFAULT_TIMEOUT
-
- i_page_url = '%s%s' % (self.test_prefix, i_case['entry'])
- try:
- self.web_driver.set_page_load_timeout(i_case_timeout)
- self.web_driver.implicitly_wait(i_case['onload_delay'])
- self.web_driver.get(i_page_url)
- except Exception, e:
- i_case['result'] = STR_BLOCK
- self.TE_LOG.info(
- "Cases %s: blocked by %s" % (i_case['case_id'], e))
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- continue
-
- if not self.__checkPageNotFound(i_page_url):
- i_case['result'] = STR_BLOCK
- self.TE_LOG.info(
- "Cases %s: blocked, page not found" % i_case['case_id'])
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- i_case['stdout'] = "page not found"
- continue
-
- try:
- test01_md5 = hashlib.md5(
- self.web_driver.get_screenshot_as_base64()).hexdigest().upper()
- except Exception, e:
- i_case['result'] = STR_BLOCK
- self.TE_LOG.info(
- "Cases %s: blocked by %s" % (i_case['case_id'], e))
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- continue
-
- try:
- i_refer_case_timeout = i_case['refer_timeout']
- except Exception, e:
- i_refer_case_timeout = DEFAULT_TIMEOUT
-
- i_ref_page_url = '%s%s' % (self.test_prefix, i_case['refer_entry'])
- try:
- self.web_driver.set_page_load_timeout(i_refer_case_timeout)
- self.web_driver.implicitly_wait(i_case['onload_delay'])
- self.web_driver.get(i_ref_page_url)
- except Exception, e:
- i_case['result'] = STR_BLOCK
- self.TE_LOG.info(
- "Cases %s: blocked by %s" % (i_case['case_id'], e))
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- continue
-
- if not self.__checkPageNotFound(i_ref_page_url):
- i_case['result'] = STR_BLOCK
- self.TE_LOG.info(
- "Cases %s: blocked, ref page not found" % i_case['case_id'])
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- continue
-
- try:
- test02_md5 = hashlib.md5(
- self.web_driver.get_screenshot_as_base64()).hexdigest().upper()
- except Exception, e:
- i_case['result'] = STR_BLOCK
- self.TE_LOG.info(
- "Cases %s: blocked by %s" % (i_case['case_id'], e))
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- continue
-
- if test01_md5 == test02_md5:
- i_case['result'] = STR_PASS
- else:
- i_case['result'] = STR_FAIL
-
- def __getCaseIndex(self, url):
- try:
- value_pos = url.rindex('value')
- if value_pos == -1:
- return 0
- eq_value = url[value_pos:]
- eq_index = eq_value.index('=')
- if eq_index == -1:
- return 0
- sub_value = eq_value[eq_index + 1:]
- if sub_value is not None:
- return sub_value
- except Exception, e:
- return 0
-
- def __checkUrlSame(self, pre_url, url):
- try:
- if pre_url == '' or url == '':
- return False
-
- index_pre_url = pre_url.index('?')
- if index_pre_url == -1:
- return False
- ab_pre_url = pre_url[0:index_pre_url]
-
- index_url = url.index('?')
- if index_url == -1:
- return False
- ab_url = url[0:index_url]
- if ab_pre_url == ab_url:
- return True
- else:
- return False
- except Exception:
- return False
-
- def __runJSTests(self, haha=None, kkkk=None):
- element_index = -1
- for i_case in self.tests_json['cases']:
- element_index += 1
- with EXE_LOCK:
- if self.exe_status == 'DONE':
- return False
- i_case['start_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- try:
- sub_index = 0
- url_equal = False
- if element_index:
- pre_url = self.tests_json['cases'][
- element_index - 1]['entry']
- url_equal = self.__checkUrlSame(pre_url, i_case['entry'])
- i_case_timeout = i_case['timeout']
- except Exception, e:
- i_case_timeout = DEFAULT_TIMEOUT
- #self.test_prefix = '/home/app/.config/xwalk-service/applications/css3backgr.WebAPICSS3BackgroundsTests'
- i_page_url = '%s%s' % (self.test_prefix, i_case['entry'])
- try:
- self.web_driver.set_page_load_timeout(i_case_timeout)
- sub_index = self.__getCaseIndex(i_case['entry'])
- if not url_equal:
- self.web_driver.implicitly_wait(i_case['onload_delay'])
- self.web_driver.get(i_page_url)
- except Exception, e:
- print 'exception'
- i_case['result'] = STR_BLOCK
- self.TE_LOG.debug(
- "Cases %s: blocked by %s" % (i_case['case_id'], e))
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- continue
-
- if not self.__checkPageNotFound(i_page_url):
- i_case['result'] = STR_BLOCK
- self.TE_LOG.info(
- "Cases %s: blocked, page not found" % i_case['case_id'])
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- i_case['stdout'] = "page not found"
- continue
-
- try:
- if sub_index:
- sub_index = int(sub_index) - 1
- table = self.web_driver.find_element_by_xpath(
- "//table[@id='results']")
- tr = table.find_elements_by_xpath(".//tbody/tr")[sub_index]
- sub_result = tr.find_elements_by_xpath(".//td")[0].text
- error_message = tr.find_elements_by_xpath(".//td")[2].text
- if sub_result.upper() == 'PASS':
- i_case['result'] = STR_PASS
- elif sub_result.upper() == 'FAIL':
- i_case['result'] = STR_FAIL
- i_case['stdout'] = error_message
- else:
- i_case['result'] = STR_BLOCK
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
- except Exception, e:
- try:
- result = self.web_driver.find_element_by_class_name('pass')
- except:
- i_case['result'] = STR_FAIL
- else:
- if result.text == STR_FAIL:
- i_case['result'] = STR_FAIL
- elif result.text == STR_PASS:
- i_case['result'] = STR_PASS
- else:
- i_case['result'] = STR_BLOCK
- i_case['end_at'] = time.strftime(
- "%Y-%m-%d %H:%M:%S", time.localtime())
-
- def __runScriptTests(self, haha=None, kkkk=None):
- for i_case in self.tests_json['cases']:
- with EXE_LOCK:
- if self.exe_status == 'DONE':
- return False
- try:
- i_case_timeout = int(i_case['timeout'])
- except Exception, e:
- i_case_timeout = DEFAULT_TIMEOUT
-
- try:
- i_case_proc = subprocess.Popen(
- args="%s" % i_case['entry'], shell=True)
- i_case_pre_time = time.time()
- while True:
- i_case_exit_code = i_case_proc.poll()
- i_case_elapsed_time = time.time() - i_case_pre_time
- if i_case_exit_code == None:
- if i_case_elapsed_time >= i_case_timeout:
- tr_utils.KillAllProcesses(ppid=i_case_proc.pid)
- i_case['result'] = STR_BLOCK
- self.TE_LOG.debug(
- "Run %s timeout" % i_case['case_id'])
- break
- elif str(i_case_exit_code) == str(i_case['expected_result']):
- i_case['result'] = STR_PASS
- break
- else:
- i_case['result'] = STR_FAIL
- break
- time.sleep(1)
- except Exception, e:
- i_case['result'] = STR_BLOCK
- self.TE_LOG.error(
- "Run %s: failed: %s, exit from executer" % (i_case['case_id'], e))
- break
-
- def __runTests(self, haha=None, kkkk=None):
- for i_case in self.tests_json['cases']:
- i_case['result'] = STR_NOTRUN
- if self.set_exetype == "manual":
- self.__runWebManualTests()
- elif self.set_type == REF_SET_TYPE:
- self.__runRefTests()
- elif self.set_type == JS_SET_TYPE:
- self.__runJSTests()
- elif self.set_type == SCRIPT_SET_TYPE:
- self.__runScriptTests()
-
- with EXE_LOCK:
- self.exe_status = 'DONE'
-
- return True
-
- def runTestsExecuter(self):
- if not self.set_type in [REF_SET_TYPE, JS_SET_TYPE, SCRIPT_SET_TYPE]:
- self.TE_LOG.error(
- "Unsupported set type %s, exit from executer" % self.set_type)
- return False
-
- if self.set_type in [REF_SET_TYPE, JS_SET_TYPE]:
- try:
- if not self.__initWebDriver():
- if self.web_driver:
- self.web_driver.quit()
- self.web_driver = None
- self.TE_LOG.error("Exit from executer")
- return False
- except Exception, e:
- if self.web_driver:
- self.web_driver.quit()
- self.TE_LOG.error(
- "Init Web Driver failed: %s, exit from executer" % e)
- return False
-
- while True:
- if not tr_utils.pidExists(self.runner_proc):
- if self.set_type in [REF_SET_TYPE, JS_SET_TYPE]:
- if self.web_driver:
- self.web_driver.quit()
- self.web_driver = None
- self.TE_LOG.debug('Can not find runner, exit from executer')
- return False
- exe_command, exe_data = self.__talkWithRunnerRecv()
- if exe_command == 'GET_STATUS':
- with EXE_LOCK:
- self.__talkWithRunnerSend(
- {'COMMAND': exe_command, 'DATA': self.exe_status})
- elif exe_command == 'TESTS':
- with EXE_LOCK:
- self.exe_status = 'RUNNING'
- self.tests_json = exe_data['data']
- self.exe_thread = thread.start_new_thread(
- self.__runTests, (1, 2))
- self.__talkWithRunnerSend(
- {'COMMAND': exe_command, 'DATA': 'OK'})
- elif exe_command == 'GET_RESULTS':
- if not self.__talkWithRunnerSend({'COMMAND': exe_command, 'DATA': self.tests_json}):
- continue
- with EXE_LOCK:
- self.exe_status = 'READY'
- elif exe_command == 'TERMINAL':
- if self.web_driver:
- self.web_driver.quit()
- self.web_driver = None
- with EXE_LOCK:
- self.exe_status = 'DONE'
- self.__talkWithRunnerSend(
- {'COMMAND': exe_command, 'DATA': 'OK'})
- else:
- continue
-
- def EndExecuter(self):
- if self.web_driver:
- self.web_driver.quit()
- self.web_driver = None
- return True
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-""" The implementation of default test engine"""
-import os
-import time
-import sys
-import json
-import socket
-import shutil
-import uuid
-import threading
-import re
-import ConfigParser
-from datetime import datetime
-from tempfile import mktemp
-import xml.etree.ElementTree as etree
-from testkitlite.engines import test_executer
-from shutil import copyfile
-from testkitlite.util import tr_utils
-from testkitlite.util.log import LOGGER
-from testkitlite.util.result import TestSetResut
-
-EXECUTER_POLLING_INTERVAL = 2
-CNT_RETRY = 10
-
-
-def initExecuter(test_env=None):
- TE = test_executer.TestExecuter(test_env)
- TE.runTestsExecuter()
-
-
-def _run_webdrvier_test(self, cases, result_obj):
- """
- process the execution for web api test
- may be splitted to serveral blocks,
- with the unit size defined by block_size
- """
- case_count = len(cases)
- blknum = 0
- if case_count % self.opts['block_size'] == 0:
- blknum = case_count / self.opts['block_size']
- else:
- blknum = case_count / self.opts['block_size'] + 1
-
- idx = 1
- test_set_queues = []
- while idx <= blknum:
- block_data = {}
- start = (idx - 1) * self.opts['block_size']
- if idx == blknum:
- end = case_count
- else:
- end = idx * self.opts['block_size']
- block_data = cases[start:end]
- for tc in block_data:
- tc.pop('purpose')
- test_set_queues.append({'cases': block_data})
- idx += 1
-
- self.testcases = []
- get_result = False
- abort_from_set = False
-
- for section_json in test_set_queues:
- if result_obj.get_status() == 1:
- break
- LOGGER.info("Load a new section for testing, please wait ...")
- get_result = False
- while True:
- if result_obj.get_status() == 1:
- break
- exe_command, exe_data = self.talkWithEXE(
- 'GET_STATUS', '', 0)
- if exe_command == 'GET_STATUS':
- if exe_data == 'READY':
- exe_command, exe_data = self.talkWithEXE(
- 'TESTS', {'data': section_json}, 0)
- if exe_command != 'TESTS' or exe_data != 'OK':
- LOGGER.debug('Send tests failed')
- result_obj.set_status(1)
- break
- continue
- elif exe_data == 'RUNNING':
- time.sleep(EXECUTER_POLLING_INTERVAL)
- continue
- elif exe_data == 'DONE':
- exe_command, exe_data = self.talkWithEXE(
- 'GET_RESULTS', '', 0)
- if exe_data is not None and len(exe_data):
- result_obj.extend_result(exe_data['cases'])
- get_result = True
- break
- elif exe_data == 'ERROR':
- LOGGER.error('Executer got error')
- get_result = True
- result_obj.set_status(1)
- break
- else:
- abort_from_set = True
- result_obj.set_status(1)
- break
- if abort_from_set:
- LOGGER.error('Exit from current set execution')
- return
- ### normally exit
- result_obj.set_status(1)
- exe_command, exe_data = self.talkWithEXE(
- 'TERMINAL', '', 1)
-
-
-class TestWorker(object):
-
- """Test executor for testkit-lite"""
-
- def __init__(self, conn):
- super(TestWorker, self).__init__()
- self.conn = conn
- self.server_url = None
- self.result_obj = None
- self.opts = dict({'block_size': 10,
- 'test_type': None,
- 'exe_socket_buff_size': 20480,
- 'runner_proc': os.getpid(),
- })
- self.testcases = []
- self.runner_proc = self.opts['runner_proc']
- self.exe_socket_file = os.path.expanduser(
- "~") + os.sep + str(self.runner_proc) + '.socket'
- self.exe_proc = None
- self.exe_socket = None
- self.exe_socket_connect = None
-
- def init_test(self, params):
- """init the test envrionment"""
- self.opts['testset_name'] = params.get('testset-name', '')
- self.opts['suite_name'] = params.get('testsuite-name', '')
- self.opts['debug_log_base'] = params.get("debug-log-base", '')
- self.opts['wd_url'] = params.get("wd_url", '')
- self.opts['target_platform'] = params.get("target_platform", '')
- self.opts['set_type'] = params.get("set_type", '')
- self.opts['set_exetype'] = params.get("set_exetype", '')
- self.opts['session_dir'] = params.get("session_dir", '')
- self.opts['log_debug'] = params.get("log_debug", '')
- self.opts['exe_socket_file'] = self.exe_socket_file
- test_launcher = params.get('test-launcher', None) or 'xwalk'
- test_extension = params.get('test-extension', None)
- test_widget = params.get('test-widget', None)
- #kill stub
- self.conn.kill_stub()
- # get app id from commodule
- _opts = self.conn.get_launcher_opt(test_launcher, test_extension, test_widget, self.opts['suite_name'], self.opts['testset_name'])
- self.opts['appid'] = _opts.get("test_app_id", '') if _opts else ''
- #self.opts['debugip'] = params.get("debugip", '')
- self.opts['debugip'] = os.environ.get("wd-debugip", '')
-
- if not self.__exitExecuter():
- LOGGER.debug('__exitExecuter failed')
- return None
-
- if self.__initExecuterSocket():
- time.sleep(EXECUTER_POLLING_INTERVAL)
- if (not self.exe_proc) or (not tr_utils.pidExists(self.exe_proc)):
- LOGGER.debug('Executer not existing')
- return None
- else:
- timecnt = 0
- blaunched = False
- while timecnt < CNT_RETRY:
- exe_command, exe_data = self.talkWithEXE(
- 'GET_STATUS', '', 0)
- if exe_command == 'GET_STATUS':
- if exe_data == 'READY':
- blaunched = True
- break
- else:
- timecnt += 1
- if not blaunched:
- LOGGER.info("[ launch webdriver failed! ]")
- return None
- else:
- return str(uuid.uuid1())
-
- def __initExecuter(self):
- try:
- new_proc = os.fork()
-
- if new_proc == 0:
- initExecuter(self.opts)
- sys.exit(0)
- else:
- self.exe_proc = new_proc
- LOGGER.debug('Runner Proc: %s, Executer Proc: %s' %
- (self.runner_proc, self.exe_proc))
- return True
- except OSError, e:
- return False
-
- def __exitExecuter(self):
- if self.exe_socket:
- self.exe_socket_connect.close()
- self.exe_socket.close()
- self.exe_socket = None
- try:
- os.remove(self.exe_socket_file)
- except Exception, e:
- pass
-
- if self.exe_proc and tr_utils.pidExists(self.exe_proc):
- if not tr_utils.KillAllProcesses(self.exe_proc):
- return False
- self.exe_proc = None
- return True
-
- def __initExecuterSocket(self):
- if not self.exe_socket:
- try:
- os.remove(self.exe_socket_file)
- except OSError:
- pass
- try:
- self.exe_socket = socket.socket(
- socket.AF_UNIX, socket.SOCK_STREAM)
- self.exe_socket.bind(self.exe_socket_file)
- self.exe_socket.listen(1)
- except Exception, e:
- LOGGER.error('Setup socket failed')
- return False
- if not self.__initExecuter():
- LOGGER.error('Init Executer failed')
- if self.exe_proc and tr_utils.pidExists(self.exe_proc):
- killProcGroup(self.exe_proc)
- self.exe_proc = None
- self.exe_socket.close()
- self.exe_socket = None
- return False
- self.exe_socket_connect, addr = self.exe_socket.accept()
- return True
-
- def talkWithEXE(self, command=None, data=None, recv_timeout=None):
- # LOGGER.debug('Start send: %s, %s' % (command, data))
- try:
- if self.exe_socket is None:
- return (None, None)
- self.exe_socket.settimeout(recv_timeout)
- self.exe_socket_connect.send(
- json.dumps({'COMMAND': command, 'DATA': data}))
- exe_data = self.exe_socket_connect.recv(
- self.opts['exe_socket_buff_size'])
- if not exe_data:
- return (None, None)
- exe_json = json.loads(exe_data)
- if exe_json['COMMAND']:
- command = exe_json['COMMAND']
- if exe_json['DATA']:
- data = exe_json['DATA']
- except Exception, e:
- LOGGER.error('Talk with executer failed: %s, kill executer' % e)
- self.__exitExecuter()
- return (None, None)
-
- return (command, data)
-
- def __saveSectionToSetJSON(self, testcases, exe_data):
- if exe_data:
- for i_case in exe_data['cases']:
- testcases.append(i_case)
-
- return testcases
-
- def run_test(self, sessionid, test_set):
- """
- process the execution for a test set
- """
- if sessionid is None:
- return False
-
- if not "cases" in test_set:
- return False
-
- if len(test_set["cases"]) == 0:
- return False
-
- self.result_obj = TestSetResut(
- self.opts['suite_name'], self.opts['testset_name'])
- cases, exetype, ctype = test_set[
- "cases"], test_set["exetype"], test_set["type"]
-
- self.opts['async_th'] = threading.Thread(
- target=_run_webdrvier_test,
- args=(self, cases, self.result_obj)
- )
- self.opts['async_th'].start()
- return True
-
- def get_test_status(self, sessionid):
- """poll the test task status"""
- if sessionid is None:
- return None
- result = {}
- result["msg"] = []
- result["finished"] = str(self.result_obj.get_status())
- return result
-
- def get_test_result(self, sessionid):
- """get the test result for a test set """
- result = {}
- if sessionid is None:
- return result
-
- result = self.result_obj.get_result()
- return result
-
- def finalize_test(self, sessionid):
- """clear the test stub and related resources"""
- if sessionid is None:
- return False
-
- if self.result_obj is not None:
- self.result_obj.set_status(1)
-
- # remove socketfile
-
- return True
+++ /dev/null
-[LOGGING]
-log_level=INFO
-
-[EXTENSION]
-crosswalk=--external-extensions-path=/usr/lib/tizen-extensions-crosswalk
-
-[TIZEN]
-tizen_user=app
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitliteutildir = /usr/lib/python2.7/dist-packages/testkitlite/util
-dist_testkitliteutil_SCRIPTS = *.py
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Liu,chengtao <chengtaox.liu@intel.com>
-""" The shell command executor module"""
-
-import os
-import sys
-import time
-import subprocess
-
-from testkitlite.util.killall import killall
-from testkitlite.util.str2 import str2str
-
-
-def shell_command(cmd, timeout=15):
- """shell communication for quick return in sync mode"""
- proc = subprocess.Popen(cmd,
- shell=True,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- time_cnt = 0
- exit_code = None
- result = []
- while time_cnt < timeout:
- exit_code = proc.poll()
- if not exit_code is None:
- break
- time_cnt += 0.2
- time.sleep(0.2)
-
- if exit_code is None:
- killall(proc.pid)
- exit_code = -1
- result = []
- elif not cmd.endswith('&'):
- while True:
- line = proc.stdout.readline()
- if not line or line.find('daemon started') >= 0:
- break
- result.append(line)
- return [exit_code, result]
-
-
-def shell_command_ext(cmd="",
- timeout=None,
- boutput=False,
- stdout_file=None,
- stderr_file=None,
- callbk=None):
- """shell executor, return [exitcode, stdout/stderr]
- timeout: None means unlimited timeout
- boutput: specify whether print output during the command running
- """
- if stdout_file is None:
- stdout_file = os.path.expanduser("~") + os.sep + "shell_stdout"
-
- if stderr_file is None:
- stderr_file = os.path.expanduser("~") + os.sep + "shell_stderr"
-
- exit_code = None
- wbuffile1 = file(stdout_file, "w")
- wbuffile2 = file(stderr_file, "w")
- rbuffile1 = file(stdout_file, "r")
- rbuffile2 = file(stderr_file, "r")
- cmd_open = subprocess.Popen(args=cmd,
- shell=True,
- stdout=wbuffile1,
- stderr=wbuffile2)
- rbuffile1.seek(0)
- rbuffile2.seek(0)
-
- def print_log():
- """print the stdout to terminate"""
- if callbk and callable(callbk):
- callbk(rbuffile1.read())
- else:
- sys.stdout.write(rbuffile1.read())
- sys.stdout.write(rbuffile2.read())
- sys.stdout.flush()
-
- while True:
- exit_code = cmd_open.poll()
- if exit_code is not None:
- break
- if boutput:
- print_log()
- if timeout is not None:
- timeout -= 0.1
- if timeout <= 0:
- exit_code = "timeout"
- killall(cmd_open.pid)
- time.sleep(3)
- break
- time.sleep(0.1)
-
- if boutput:
- print_log()
- rbuffile1.seek(0)
- rbuffile2.seek(0)
- stdout_log = str2str(rbuffile1.read())
- stderr_log = str2str(rbuffile2.read())
- if 'returncode=' in stdout_log:
- index = stdout_log.find('returncode=') + 11
- exit_code = str(stdout_log[index:]).strip('\r\n')
- stdout_log = '<![CDATA[' + stdout_log + ']]>'
- stderr_log = '<![CDATA[' + stderr_log + ']]>'
-
- wbuffile1.close()
- wbuffile2.close()
- rbuffile1.close()
- rbuffile2.close()
- os.remove(stdout_file)
- os.remove(stderr_file)
- return [exit_code, stdout_log, stderr_log]
+++ /dev/null
-#!/usr/bin/python
-#
-# Copyright (C) 2013 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Liu,chengtao <liux.chengtao@intel.com>
-"""General Config Class"""
-
-import os
-import ConfigParser
-from ConfigParser import NoOptionError, NoSectionError
-
-CONFIG_FILE = "/opt/testkit/lite3.0/testkitlite/commodule/CONFIG"
-cfg = ConfigParser.ConfigParser()
-if os.path.exists(CONFIG_FILE):
- cfg.read(CONFIG_FILE)
-else:
- cfg.read(os.path.join(os.getcwd(), "CONFIG"))
-
-
-class Config:
-
- LOG_LEVEL = cfg.get('LOGGING', 'log_level')
-
- @staticmethod
- def get_extension(extension_name):
- ret = ""
- try:
- if extension_name is not None:
- ret = cfg.get('EXTENSION', extension_name)
- except (NoOptionError, NoSectionError) as error:
- pass
- except IOError as error:
- pass
- return ret
+++ /dev/null
-#!/usr/bin/python
-#
-# Copyright (C) 2013 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Liu,chengtao <chengtaox.liu@intel.com>
-"""Test connector for test instance and target instance"""
-
-from testkitlite.util.log import LOGGER
-
-
-class ConnectorBuilder:
-
- """Communication module for test host and test remote"""
-
- def __init__(self, config):
- self.conn = None
- if "commodule" in config:
- try:
- exec "from testkitlite.commodule.%s import get_target_conn" % config[
- "commodule"]
- device_no = config.get('deviceid', None)
- if device_no is not None:
- self.conn = get_target_conn(device_no)
- else:
- self.conn = get_target_conn()
- except Exception as error:
- LOGGER.error("[ Error: Initialize commodule failed: '%s']\n" % error)
-
- def get_connector(self):
- """list the handler instance"""
- return self.conn
+++ /dev/null
-#!/usr/bin/python
-#
-# Copyright (C) 2013 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Liu,chengtao <liux.chengtao@intel.com>
-""" The definition of exceptions"""
-
-
-class InvalidDeviceException(Exception):
- """
- Device_Id not defined / Invalid Exception
- """
- __data = ""
- def __init__(self, data):
- self.__data = data
-
- def __str__(self):
- return self.__data
-
-class TestCaseNotFoundException(Exception):
- """
- Test case not found Exception
- """
- __data = ""
- def __init__(self, data):
- self.__data = data
-
- def __str__(self):
- return self.__data
-
-class TestEngineException(Exception):
- """
- Test case not found Exception
- """
- def __init__(self, name):
- self.__engine = name
-
- def __str__(self):
- return "Failed to load test engine '%s'" % self.__engine
\ No newline at end of file
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Liu,chengtao <chengtaox.liu@intel.com>
-""" The http request process module"""
-
-import json
-from testkitlite.util.log import LOGGER
-
-try:
- import requests
-except ImportError, err:
- LOGGER.info("Failed to import 'requests' module, please check your installation:")
- LOGGER.info(" You can use 'sudo pip install requests' to install the module!")
- raise ImportError
-
-def get_url(baseurl, api):
- """get full url string"""
- return "%s%s" % (baseurl, api)
-
-
-def http_request(url, rtype="POST", data=None, time_out=30):
- """
- http request to the device http server
- """
- result = None
- if rtype == "POST":
- headers = {'content-type': 'application/json'}
- try:
- ret = requests.post(url, data=json.dumps(
- data), headers=headers, timeout=time_out)
-
- if ret:
- result = ret.json()
- except Exception as error:
- LOGGER.error(str(error))
- pass
- elif rtype == "GET":
- try:
- ret = requests.get(url, params=data, timeout=time_out)
- if ret:
- result = ret.json()
- except Exception as error:
- LOGGER.error(str(error))
- pass
- return result
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-""" The process kill for os"""
-
-import os
-import platform
-import signal
-import re
-import ctypes
-
-
-def killall(ppid):
- """Kill all children process by parent process ID"""
- os_ver = platform.system()
- try:
- if os_ver == "Linux" or os_ver == "Darwin":
- ppid = str(ppid)
- pidgrp = []
- if not ppid.isdigit():
- return
- def getchildpids(ppid):
- """Return a list of children process"""
- command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
- ppid)
- pids = os.popen(command).read()
- pids = pids.split()
- return pids
-
- pidgrp.extend(getchildpids(ppid))
- for pid in pidgrp:
- pidgrp.extend(getchildpids(pid))
- # Insert self process ID to PID group list
- pidgrp.insert(0, ppid)
- while len(pidgrp) > 0:
- pid = pidgrp.pop()
- try:
- os.kill(int(pid), signal.SIGKILL)
- except OSError, error:
- pattern = re.compile('No such process')
- match = pattern.search(str(error))
- if not match:
- print "[ Error: fail to kill pid: %s," \
- " error: %s ]\n" % (int(pid), error)
- # kill for windows platform
- else:
- kernel32 = ctypes.windll.kernel32
- handle = kernel32.OpenProcess(1, 0, int(ppid))
- kernel32.TerminateProcess(handle, 0)
- except OSError, error:
- pattern = re.compile('No such process')
- match = pattern.search(str(error))
- if not match:
- print "[ Error: fail to kill pid: %s, error: %s ]\n" \
- % (int(ppid), error)
- return None
+++ /dev/null
-#!/usr/bin/python
-#
-# Copyright (C) 2013 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Liu,chengtao <liux.chengtao@intel.com>
-"""General Implementation"""
-
-import threading
-import logging
-import logging.handlers
-import sys
-import os
-
-# logger levels
-LEVELS = {"CRITICAL": 50,
- "ERROR": 40,
- "WARNING": 30,
- "INFO": 20,
- "DEBUG": 10,
- "NOTSET": 0
- }
-
-
-class Logger:
-
- """General Logger Class"""
- _instance = None
- _mutex = threading.Lock()
-
- def __init__(self, level="DEBUG", format_str="%(message)s"):
- """Generate root logger"""
- self._logger = logging.getLogger("TCT")
- self._level = LEVELS[level]
- self._logger.setLevel(LEVELS[level])
- self._formatter = logging.Formatter(format_str)
- self.add_print_logger()
-
- def add_print_logger(self, level="INFO"):
- """Generate console writer [StreamHandler]"""
- writer = logging.StreamHandler(sys.stdout)
- writer.setLevel(LEVELS[level])
- writer.setFormatter(self._formatter)
- self._logger.addHandler(writer)
-
- @staticmethod
- def get_logger(level="DEBUG", format_str="%(message)s"):
- """sinlgeton of Logger"""
- if Logger._instance is None:
- Logger._mutex.acquire()
- if Logger._instance is None:
- Logger._instance = Logger(level, format_str)
- else:
- pass
- Logger._mutex.release()
- return Logger._instance
-
- def debug(self, msg):
- """debug level message"""
- if msg is not None:
- sys.stdout.write(msg + '\r\n')
- sys.stdout.flush()
-
- def info(self, msg):
- """info level message"""
- if msg is not None:
- sys.stdout.write(msg + '\r\n')
- sys.stdout.flush()
-
- def warning(self, msg):
- """warning level message"""
- if msg is not None:
- self._logger.warning(msg)
-
- def error(self, msg):
- """error level message"""
- if msg is not None:
- sys.stdout.write(msg + '\r\n')
- sys.stdout.flush()
-
- def critical(self, msg):
- """critical level message"""
- if msg is not None:
- self._logger.critical(msg)
-
-from .config import Config
-
-LOGGER = Logger.get_logger(level=Config.LOG_LEVEL)
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Yuanyuan,Zou <yuanyuanx.zou@intel.com>
-
-""" kill testkit-lite """
-import os
-import re
-import platform
-if not platform.system() == "Windows":
- import dbus
-
-import time
-from testkitlite.util.log import LOGGER
-from testkitlite.util.killall import killall
-from testkitlite.util.autoexec import shell_command
-
-DEVICE_DBUS = "testkit-lite-dbus"
-DEVICE_WHITE_LIST = ['localhost', '127.0.0.1']
-
-
-def kill_testkit_lite(pid_file):
- """ kill testkit lite"""
- try:
- with open(pid_file, "r") as pidfile:
- pid = pidfile.readline().rstrip("\n")
- if pid:
- killall(pid)
- except IOError as error:
- pattern = re.compile('No such file or directory|No such process')
- match = pattern.search(str(error))
- if not match:
- LOGGER.info("[ Error: fail to kill existing testkit-lite, "\
- "error: %s ]\n" % error)
- return None
-
-def launch_dbus_deamon():
- exit_code, ret = shell_command(DEVICE_DBUS + '&')
- time.sleep(3)
-
-def get_device_lock(device_id):
- if not OS_VER == "Windows":
- LOGGER.debug("method using dbus is not implemented on windows")
- return True
-
- """ set device lock for current testkit lite"""
- if device_id in DEVICE_WHITE_LIST:
- return True
- bus = dbus.SessionBus()
- try:
- device_service = bus.get_object('com.intel.testkit', '/com/intel/testkit/devices')
- except Exception as error:
- launch_dbus_deamon()
- device_service = bus.get_object('com.intel.testkit', '/com/intel/testkit/devices')
-
- try:
- ret = device_service.addDevice(device_id)
- return bool(ret)
- except Exception as error:
- return False
-
-def release_device_lock(device_id):
- if not OS_VER == "Linux" and not OS_VER == "Darwin":
- LOGGER.debug("method using dbus is not implemented on windows")
- return True
-
- """ kill testkit lite"""
- if device_id in DEVICE_WHITE_LIST:
- return True
- bus = dbus.SessionBus()
- try:
- device_service = bus.get_object('com.intel.testkit', '/com/intel/testkit/devices')
- ret = device_service.removeDevice(device_id)
- return True
- except Exception as error:
- return False
-
-def clean_testxml(testxmls,remote_test):
- """clean all test xmls"""
- if remote_test:
- EXISTS = os.path.exists
- for testxml in testxmls:
- if EXISTS(testxml):
- fd_name = os.path.dirname(testxml)
- os.remove(testxml)
- os.rmdir(fd_name)
- return None
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Chengtao,Liu <chengtaox.liu@intel.com>
-""" The implementation test result"""
-
-import threading
-from testkitlite.util.log import LOGGER
-from testkitlite.util.str2 import str2str
-
-
-class TestSetResut(object):
-
- """ test result """
-
- _progress = "execute case: %s # %s...(%s)"
- _mutex = threading.Lock()
-
- def __init__(self, testsuite_name="", testset_name=""):
- self._suite_name = testsuite_name
- self._set_name = testset_name
- self._result = {"cases": []}
- self._finished = 0
-
- def set_status(self, flag=0):
- """set finished tag"""
- self._mutex.acquire()
- self._finished = flag
- self._mutex.release()
-
- def get_status(self):
- """return finished tag"""
- self._mutex.acquire()
- flag = self._finished
- self._mutex.release()
- return flag
-
- def set_result(self, tresult):
- """set cases result to result buffer"""
- self._mutex.acquire()
- self._result = tresult
- self._mutex.release()
-
- def extend_result(self, cases_result=None, print_out=True):
- """update cases result to the result buffer"""
- self._mutex.acquire()
- if cases_result is not None:
- self._result["cases"].extend(cases_result)
-
- if print_out:
- for case_it in cases_result:
- LOGGER.info(self._progress %
- (self._suite_name, case_it['case_id'], case_it['result']))
- if case_it['result'].lower() in ['fail', 'block'] and 'stdout' in case_it:
- LOGGER.info(str2str(case_it['stdout']))
- self._mutex.release()
-
- def get_result(self):
- """get cases result from the result buffer"""
- self._mutex.acquire()
- result = self._result
- self._mutex.release()
-
- return result
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-# Yuanyuan,Zou <zouyuanx@intel.com>
-""" prepare run , split xml ,run case , merge result """
-import traceback
-import os
-import platform
-import time
-import sys
-from datetime import datetime
-from shutil import copyfile
-import xml.etree.ElementTree as etree
-import ConfigParser
-from tempfile import mktemp
-from shutil import move
-from os import remove
-import copy
-import re
-import ConfigParser
-from testkitlite.util.log import LOGGER
-from testkitlite.util.str2 import str2xmlstr
-from testkitlite.util.errors import TestCaseNotFoundException
-from testkitlite.util.errors import TestEngineException
-
-if platform.system().startswith("Linux"):
- import fcntl
-if platform.system().startswith("Windows"):
- import win32con
- import win32file
- import pywintypes
-
-
-
-
-
-JOIN = os.path.join
-DIRNAME = os.path.dirname
-BASENAME = os.path.basename
-EXISTS = os.path.exists
-ABSPATH = os.path.abspath
-
-# test constants
-OPT_LAUNCHER = 'test-launcher'
-OPT_EXTENSION = 'test-extension'
-OPT_DEBUG_LOG = 'debug-log-base'
-OPT_CAPABILITY = 'capability'
-OPT_DEBUG = 'debug'
-OPT_RERUN = 'rerun'
-OPT_WIDGET = 'test-widget'
-OPT_STUB = 'stub-name'
-OPT_STUB_PORT = 'stub-port'
-OPT_SUITE = 'testsuite-name'
-OPT_SET = 'testset-name'
-OPT_test_set_src = 'test-set-src'
-
-TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
-tct_parser = ConfigParser.ConfigParser()
-tct_parser.read(TCT_CONFIG_FILE)
-
-DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
-DEVICE_EXECUTION_MODE_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
-DEVICE_SUITE_TARGET_30_STR = "{DEVICE_SUITE_TARGET_30}"
-DEVICE_EXECUTION_MODE_30_STR = "{DEVICE_EXECUTION_MODE_30}"
-
-class TestSession:
-
- """
- Parse the testdefinition.xml files.
- Apply filter for each run.
- Conduct tests execution.
- """
-
- def __init__(self, connector, worker):
- """ init all self parameters here """
- # dryrun
- self.bdryrun = False
- # non_active
- self.non_active = False
- # result file
- self.resultfile = None
- # external test
- self.external_test = None
- # filter rules
- self.filter_rules = None
- self.debug = False
- self.resultfiles = set()
- self.core_auto_files = []
- self.core_manual_files = []
- self.unit_test_files = []
- self.skip_all_manual = False
- self.testsuite_dict = {}
- self.exe_sequence = []
- self.testresult_dict = {"pass": 0, "fail": 0,
- "block": 0, "not_run": 0}
- self.current_test_xml = "none"
- self.first_run = True
- self.deviceid = None
- self.session_id = None
- self.set_parameters = {}
- self.connector = connector
- self.stub_name = "testkit-stub"
- self.testworker = worker
- self.capabilities = {}
- self.has_capability = False
- self.rerun = False
- self.test_prefix = ""
- self.filter_ok = False
- #self.wdurl = ""
- #self.debugip = ""
- self.targetplatform = ""
- self.system = platform.system()
- self.tizenV = None
- self.stub_port = "8000"
- self.skip_tc = None
-
- def set_global_parameters(self, options):
- "get all options "
- # apply dryrun
- if options.bdryrun:
- self.bdryrun = options.bdryrun
- # Disable set the result of core manual cases from the console
- if options.non_active:
- self.non_active = options.non_active
- # apply user specify test result file
- if options.resultfile:
- self.resultfile = options.resultfile
- # set the external test
- if options.exttest:
- self.external_test = options.exttest
- if options.debug:
- self.debug = options.debug
- if options.rerun:
- self.rerun = options.rerun
- if options.test_prefix:
- self.test_prefix = options.test_prefix
- if options.device_serial:
- self.deviceid = options.device_serial
- if options.worker:
- self.worker_name = options.worker
- else:
- self.worker_name = None
- #if options.targetplatform:
- self.targetplatform = os.environ.get("targetplatform",'')
- #modify the wdurl value, yangx.zhou@intel.com, 2014.09.18
- #if options.wdurl:
- # self.wdurl = options.wdurl
- #if options.debugip:
- # self.debugip = options.debugip
-
- def add_filter_rules(self, **kargs):
- """
- kargs: key:values - "":["",]
- """
- self.filter_rules = kargs
-
- def set_session_id(self, session_id):
- """ set the set test session id which is get form com_module """
- self.session_id = session_id
-
- def set_stubport(self, stubport):
- self.stub_port = stubport
-
- def set_tizenversion(self, tizenversion):
- self.tizenV = tizenversion
- self.testworker.set_TizenVersion(self.tizenV)
-
- def set_skip_tc(self, skip_tc):
- self.skip_tc = skip_tc
-
- def set_capability(self, capabilities):
- """ set capabilitys """
- self.capabilities = capabilities
- self.has_capability = True
-
- def prepare_run(self, testxmlfile, resultdir=None):
- """
- testxmlfile: target testxml file
- execdir and resultdir: should be the absolute path since TestSession
- is the common lib
- """
- # resultdir is set to current directory by default
- if not resultdir:
- resultdir = os.getcwd()
- self.session_dir = resultdir
- try:
- filename = testxmlfile
- filename = os.path.splitext(filename)[0]
- os_ver = platform.system()
- if os_ver == "Linux" or os_ver == "Darwin":
- file_items = filename.split('/')
- else:
- file_items = re.split(r'[/\\]+', filename)
- if len(file_items) < 2 or file_items[-2] == "" or file_items[-1] == "":
- return False
- filename = file_items[-2] + '_' + file_items[-1]
- if self.filter_rules["execution_type"] == ["manual"]:
- resultfile = "%s.manual.xml" % filename
- else:
- resultfile = "%s.auto.xml" % filename
- resultfile = JOIN(resultdir, resultfile)
- if not EXISTS(resultdir):
- os.mkdir(resultdir)
- LOGGER.info("[ analysis test xml file: %s ]" % resultfile)
- self.__prepare_result_file(testxmlfile, resultfile)
- self.__split_test_xml(resultfile, resultdir)
- except IOError as error:
- LOGGER.error(error)
- return False
- return True
-
- def __split_test_xml(self, resultfile, resultdir):
- """ split_test_xml into auto and manual"""
- setfind = etree.parse(resultfile).getiterator('set')
- if setfind:
- test_file_name = "%s" % BASENAME(resultfile)
- test_file_name = os.path.splitext(test_file_name)[0]
- self.__splite_external_test(
- resultfile, test_file_name, resultdir)
-
- def __splite_external_test(self, resultfile, test_file_name, resultdir):
- """select external_test"""
- testsuite_dict_value_list = []
- testsuite_dict_add_flag = 0
- filename_diff = 1
-
- parser = etree.parse(resultfile)
- for tsuite in parser.getiterator('suite'):
- root = etree.Element('test_definition')
- suitefilename = os.path.splitext(resultfile)[0]
- suitefilename += ".suite_%s.xml" % filename_diff
- suitefilename = JOIN(resultdir, suitefilename)
- tsuite.tail = "\n"
- root.append(tsuite)
- try:
- with open(suitefilename, 'w') as output:
- tree = etree.ElementTree(element=root)
- tree.write(output)
- except IOError as error:
- LOGGER.error("[ Error: create filtered result file: %s failed,\
- error: %s ]" % (suitefilename, error))
- case_suite_find = etree.parse(
- suitefilename).getiterator('testcase')
- if case_suite_find:
- #add by yangx.zhou@intel.com. 2014.09.12
- set_type = tsuite.find('set').get('type')
- if set_type == 'script' or set_type == 'pyunit' or set_type == 'androidunit':
- if set_type == 'script':
- self.external_test = None
- if self.filter_rules["execution_type"] == ["auto"]:
- self.core_auto_files.append(suitefilename)
- else:
- self.core_manual_files.append(suitefilename)
- self.resultfiles.add(suitefilename)
-
- #if tsuite.get('launcher'):
- elif set_type in ['js', 'ref','wrt', 'qunit']:
- #elif set_type in ['js','wrt', 'qunit']:
- testsuite_dict_value_list.append(suitefilename)
- if testsuite_dict_add_flag == 0:
- self.exe_sequence.append(test_file_name)
- testsuite_dict_add_flag = 1
- self.resultfiles.add(suitefilename)
-
- # elif set_type =='ref' and self.worker_name == "webdriver":
- # testsuite_dict_value_list.append(suitefilename)
- # if testsuite_dict_add_flag == 0:
- # self.exe_sequence.append(test_file_name)
- # testsuite_dict_add_flag = 1
- # self.resultfiles.add(suitefilename)
-
- else:
- if self.filter_rules["execution_type"] == ["auto"]:
- self.core_auto_files.append(suitefilename)
- else:
- self.core_manual_files.append(suitefilename)
- self.resultfiles.add(suitefilename)
- else:
- self.unit_test_files.append(suitefilename)
- self.resultfiles.add(suitefilename)
-
- filename_diff += 1
- if testsuite_dict_add_flag:
- self.testsuite_dict[test_file_name] = testsuite_dict_value_list
-
- def __prepare_result_file(self, testxmlfile, resultfile):
- """ write the test_xml content to resultfile"""
- try:
- parse_tree = etree.parse(testxmlfile)
- suiteparent = parse_tree.getroot()
- no_test_definition = 1
- if parse_tree.getiterator('test_definition'):
- no_test_definition = 0
- if no_test_definition:
- suiteparent = etree.Element('test_definition')
- suiteparent.tail = "\n"
- for suite in parse_tree.getiterator('suite'):
- suite.tail = "\n"
- suiteparent.append(suite)
- self.apply_filter(suiteparent)
- try:
- with open(resultfile, 'w') as output:
- tree = etree.ElementTree(element=suiteparent)
- tree.write(output)
- except IOError as error:
- LOGGER.error("[ Error: create filtered result file: %s failed,\
- error: %s ]" % (resultfile, error))
- except IOError as error:
- LOGGER.error(error)
- return False
-
- def run_case(self, latest_dir):
- """ run case """
- # case not found
- case_ids = self.filter_rules.get('id')
- #print 'disable dlog', self.disabledlog
- if case_ids and not self.filter_ok:
- raise TestCaseNotFoundException('Test case %s not found!' % case_ids)
-
- # run core auto cases
- self.__run_core_auto()
-
- # run webAPI cases
- self.__run_webapi_test(latest_dir)
-
- # run core manual cases
- self.__run_core_manual()
-
- # run unit test cases
- self.__run_unit_test()
-
- def __run_core_auto(self):
- """ core auto cases run"""
- self.core_auto_files.sort()
- for core_auto_file in self.core_auto_files:
- temp_test_xml = os.path.splitext(core_auto_file)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml += ".auto"
- # print identical xml file name
- if self.current_test_xml != temp_test_xml:
- time.sleep(3)
- LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
- self.current_test_xml = temp_test_xml
- self.__run_with_worker(core_auto_file)
-
- def __run_core_manual(self):
- """ core manual cases run """
- self.core_manual_files.sort()
- for core_manual_file in self.core_manual_files:
- temp_test_xml = os.path.splitext(core_manual_file)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml += ".manual"
- # print identical xml file name
- if self.current_test_xml != temp_test_xml:
- time.sleep(3)
- LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
- self.current_test_xml = temp_test_xml
- if self.non_active:
- self.skip_all_manual = True
- else:
- self.__run_with_worker(core_manual_file)
-
- def __run_unit_test(self):
- """ unit test cases run """
- for ut_file in self.unit_test_files:
- temp_test_xml = os.path.splitext(ut_file)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml = os.path.splitext(temp_test_xml)[0]
- temp_test_xml += ".auto"
- # print identical xml file name
- if self.current_test_xml != temp_test_xml:
- time.sleep(3)
- LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
- self.current_test_xml = temp_test_xml
- self.__run_with_worker(ut_file)
-
- def __run_webapi_test(self, latest_dir):
- """ run webAPI test"""
- if self.bdryrun:
- LOGGER.info("[ Web Test mode does not support dryrun ]")
- return True
-
- list_auto = []
- list_manual = []
- for i in self.exe_sequence:
- if i[-4::1] == "auto":
- list_auto.append(i)
- if i[-6::1] == "manual":
- list_manual.append(i)
- list_auto.sort()
- list_manual.sort()
- self.exe_sequence = []
- self.exe_sequence.extend(list_auto)
- self.exe_sequence.extend(list_manual)
-
- for webapi_total_file in self.exe_sequence:
- for webapi_file in self.testsuite_dict[webapi_total_file]:
- # print identical xml file name
- if self.current_test_xml != JOIN(latest_dir, webapi_total_file):
- time.sleep(3)
- LOGGER.info("\n[ testing xml: %s.xml ]\n"
- % JOIN(latest_dir, webapi_total_file))
- self.current_test_xml = JOIN(latest_dir, webapi_total_file)
-
- self.__run_with_worker(webapi_file)
-
- def __run_with_worker(self, suite_test_xml):
- """run_with_commodule,Initialization,check status,get result"""
- try:
- # prepare test set list
- test_xml_set_list = self.__split_xml_to_set(suite_test_xml)
- # create temporary parameter
- for test_xml_set in test_xml_set_list:
- LOGGER.info("\n[ run set: %s ]" % test_xml_set)
- # prepare the test JSON
- self.__prepare_external_test_json(test_xml_set)
-
- # init test here
- init_status = self.__init_com_module(test_xml_set)
- if not init_status:
- continue
- # send set JSON Data to com_module
- # if not self.worker_name and self.set_parameters['type'] == 'ref':
- # continue
- # else:
- u_ret = self.testworker.run_test(self.session_id, self.set_parameters)
- if not u_ret:
- continue
- while True:
- time.sleep(1)
- # check the test status ,if the set finished,get
- # the set_result,and finalize_test
- if self.__check_test_status():
- set_result = self.testworker.get_test_result(
- self.session_id)
- # write_result to set_xml
- self.__write_set_result(
- test_xml_set, set_result)
- # shut down server
- self.finalize_test(self.session_id)
- break
- except IOError as error:
- LOGGER.error(
- "[ Error: fail to run webapi test xml, error: %s ]" % error)
-
- def __split_xml_to_set(self, webapi_file):
- """split xml by <set>"""
-
- LOGGER.debug("[ split xml: %s by <set> ]" % webapi_file)
- LOGGER.debug("[ this might take some time, please wait ]")
- set_number = 1
- test_xml_set_list = []
- self.resultfiles.discard(webapi_file)
- test_xml_temp = etree.parse(webapi_file)
- for test_xml_temp_suite in test_xml_temp.getiterator('suite'):
- while set_number <= len(test_xml_temp_suite.getiterator('set')):
- #print 'debug',test_xml_temp_suite.find('set')[set_number].get('type')
- copy_url = os.path.splitext(webapi_file)[0]
- copy_url += "_set_%s.xml" % set_number
- copyfile(webapi_file, copy_url)
- test_xml_set_list.append(copy_url)
- self.resultfiles.add(copy_url)
- set_number += 1
- time.sleep(3)
- set_number -= 1
- LOGGER.info("[ total set number is: %s ]" % set_number)
-
- # only keep one set in each xml file and remove empty set
- test_xml_set_list_empty = []
- if len(test_xml_set_list) > 1:
- test_xml_set_list.reverse()
- for test_xml_set in test_xml_set_list:
- test_xml_set_tmp = etree.parse(test_xml_set)
- set_keep_number = 1
- for temp_suite in test_xml_set_tmp.getiterator('suite'):
- for test_xml_set_temp_set in temp_suite.getiterator('set'):
- if set_keep_number != set_number:
- temp_suite.remove(test_xml_set_temp_set)
- else:
- if not test_xml_set_temp_set.getiterator('testcase'):
- test_xml_set_list_empty.append(test_xml_set)
- set_keep_number += 1
- set_number -= 1
- test_xml_set_tmp.write(test_xml_set)
- for empty_set in test_xml_set_list_empty:
- LOGGER.debug("[ remove empty set: %s ]" % empty_set)
- test_xml_set_list.remove(empty_set)
- self.resultfiles.discard(empty_set)
- if len(test_xml_set_list) > 1:
- test_xml_set_list.reverse()
- return test_xml_set_list
-
- def lock(self, fl):
- try:
- if self.system.startswith("Linux"):
- #if self.system.startswith("Linux"):
- fcntl.flock(fl, fcntl.LOCK_EX)
- else:
- hfile = win32file._get_osfhandle(fl.fileno())
- ov = pywintypes.OVERLAPPED()
- win32file.LockFileEx(hfile, win32con.LOCKFILE_EXCLUSIVE_LOCK, 0, -0x10000, ov)
- except:
- print traceback.print_exc()
- return False
- else:
- return True
-
- def release(self, fl):
- if self.system.startswith("Linux"):
- fcntl.flock(fl, fcntl.LOCK_UN)
- elif self.system.startswith("Windows"):
- hfile = win32file._get_osfhandle(fl.fileno())
- win32file.UnlockFileEx(hfile, 0, -0x10000, pywintypes.OVERLAPPED())
-
- def merge_resultfile(self, start_time, latest_dir):
- """ merge_result_file """
- mergefile = mktemp(suffix='.xml', prefix='tests.', dir=latest_dir)
- mergefile = os.path.splitext(mergefile)[0]
- mergefile = os.path.splitext(mergefile)[0]
- mergefile = "%s.result" % BASENAME(mergefile)
- mergefile = "%s.xml" % mergefile
- mergefile = JOIN(latest_dir, mergefile)
- end_time = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
- LOGGER.info("\n[ test complete at time: %s ]" % end_time)
- LOGGER.debug("[ start merging test result xml files, "\
- "this might take some time, please wait ]")
- LOGGER.debug("[ merge result files into %s ]" % mergefile)
- root = etree.Element('test_definition')
- root.tail = "\n"
- totals = set()
-
- # merge result files
- resultfiles = self.resultfiles
- totals = self.__merge_result(resultfiles, totals)
- for total in totals:
- result_xml = etree.parse(total)
- for suite in result_xml.getiterator('suite'):
- if suite.getiterator('testcase'):
- suite.tail = "\n"
- root.append(suite)
-
- # print test summary
- self.__print_summary()
- # generate actual xml file
- LOGGER.info("[ generate result xml: %s ]" % mergefile)
- if self.skip_all_manual:
- LOGGER.info("[ some results of core manual cases are N/A,"
- "please refer to the above result file ]")
- LOGGER.info("[ merge complete, write to the result file,"
- " this might take some time, please wait ]")
- # get useful info for xml
- # add environment node
- # add summary node
- root.insert(0, get_summary(start_time, end_time))
- root.insert(0, self.__get_environment())
- # add XSL support to testkit-lite
- declaration_text = """<?xml version="1.0" encoding="UTF-8"?>
- <?xml-stylesheet type="text/xsl" href="testresult.xsl"?>\n"""
- try:
- with open(mergefile, 'w') as output:
- output.write(declaration_text)
- tree = etree.ElementTree(element=root)
- tree.write(output, xml_declaration=False, encoding='utf-8')
- except IOError as error:
- LOGGER.error(
- "[ Error: merge result file failed, error: %s ]" % error)
- # change <![CDATA[]]> to <![CDATA[]]>
- replace_cdata(mergefile)
- # copy result to -o option
- self._final_merge(mergefile)
-
- def _final_merge(self, mergefile):
- try:
- if self.resultfile:
- if os.path.splitext(self.resultfile)[-1] == '.xml':
- if not EXISTS(os.path.dirname(self.resultfile)):
- if len(os.path.dirname(self.resultfile)) > 0:
- os.makedirs(os.path.dirname(self.resultfile))
- LOGGER.info("[ copy result xml to output file: %s ]" % self.resultfile)
- copyfile(mergefile, self.resultfile)
- else:
- LOGGER.info(
- "[ Please specify and xml file for result output,"
- " not:%s ]" % self.resultfile)
- except IOError as error:
- LOGGER.error("[ Error: fail to copy the result file to: %s,"
- " please check if you have created its parent directory,"
- " error: %s ]" % (self.resultfile, error))
- '''
- if not EXISTS(self.resultfile):
- if not EXISTS(DIRNAME(self.resultfile)):
- if len(DIRNAME(self.resultfile)) > 0:
- os.makedirs(DIRNAME(self.resultfile))
- LOGGER.info("[ copy result xml to output file:"
- " %s ]" % self.resultfile)
- copyfile(mergefile, self.resultfile)
-
- else:
- suite_total = {}
- #print 'result file path : ' , self.resultfile
- xml_element_tree = etree.parse(self.resultfile).getroot()
- for suite in xml_element_tree.getiterator('suite'):
- suite_name = suite.get('name').strip()
- #print suite_name,'suite_name'
- if suite_name:
- if suite_name not in suite_total.keys():
- suite_total[suite_name] = []
- for set in suite.getiterator('set'):
- set_name = set.get('name').strip()
- if set_name:
- suite_total['%s' %suite_name].append(set_name)
-
- if xml_element_tree is not None:
- #f = open(self.resultfile, 'w')
- while True:
- #self.lock(f)
- f = open(self.resultfile, 'w')
- if self.lock(f):
- time.sleep(1)
- #pass
-
- root = etree.parse(mergefile).getroot()
- for suite in root.getiterator('suite'):
- suite_name = suite.get('name').strip()
- if suite_name in suite_total.keys():
- for set in suite.getiterator('set'):
- set_name = set.get('name').strip()
- if set_name in suite_total[suite_name]:
- # for testcase in set.getiterator('testcase'):
- for dest_suite in xml_element_tree.getiterator('suite'):
- if cmp(dest_suite.get('name').strip(),suite_name) ==0:
- for dest_set in dest_suite.getiterator('set'):
- if cmp(dest_set.get('name').strip(),set_name) == 0:
- #xml_element_tree.find(suite).find(set).append(testcase)
- for testcase in set.getiterator('testcase'):
- dest_set.append(testcase)
- else:
- for dest_suite in xml_element_tree.getiterator('suite'):
- if cmp(dest_suite.get('name').strip(),suite_name) ==0:
- dest_suite.append(set)
- suite_total[suite_name].append(set_name)
- else:
- xml_element_tree.append(suite)
- suite_total[suite_name] = []
- for set in suite.getiterator('set'):
- if set.get('name'):
- suite_total[suite_name].append(set.get('name'))
- try:
- f.write(etree.tostring(xml_element_tree))
- except:
- self.release(f)
- LOGGER.Warning("[ can not write to result file:" " %s]" %self.resultfile)
- break
- else:
- self.release(f)
- f.close()
- try:
- root = etree.parse(self.resultfile).getroot()
- except:
- break
- else:
- self.testresult_dict = {"pass":0 , "fail":0, "block":0, "not_run": 0}
- for result_testcase in root.getiterator("testcase"):
- if result_testcase.get("result") == "PASS":
- self.testresult_dict["pass"] += 1
- if result_testcase.get("result") == "FAIL":
- self.testresult_dict["fail"] += 1
- if result_testcase.get("result") == "BLOCK":
- self.testresult_dict["block"] += 1
- if result_testcase.get("result").lower() == "NOT_RUN":
- self.testresult_dict["not_run"] += 1
- self.__print_summary()
- break
- else:
- time.sleep(1)
- self.lock(f)
- '''
-
- def __merge_result(self, setresultfiles, totals):
- """ merge set result to total"""
- resultfiles = setresultfiles
- for resultfile in resultfiles:
- totalfile = os.path.splitext(resultfile)[0]
- totalfile = os.path.splitext(totalfile)[0]
- totalfile = os.path.splitext(totalfile)[0]
- totalfile = "%s.total" % totalfile
- totalfile = "%s.xml" % totalfile
- total_xml = etree.parse(totalfile)
- # LOGGER.info("|--[ merge webapi result file: %s ]" % resultfile)
- result_xml = etree.parse(resultfile)
- root = result_xml.getroot()
- for total_suite in total_xml.getiterator('suite'):
- for total_set in total_suite.getiterator('set'):
- for result_suite in result_xml.getiterator('suite'):
- for result_set in result_suite.getiterator('set'):
- # when total xml and result xml have same suite, set
- # print result_set.get('type'),'debug',resultfile
- if result_set.get('type') =='pyunit':
- for test_case in result_set.getiterator('testcase'):
- #print test_case.find('description/test_script_entry').text
- if (test_case.find('description/test_script_entry') is not None) and test_case.find('description/test_script_entry').text:
- result_set.remove(test_case)
- self.__merge_result_by_name(
- result_set, total_set, result_suite, total_suite)
- else:
- self.__merge_result_by_name(
- result_set, total_set, result_suite, total_suite)
- total_xml.write(totalfile)
- totals.add(totalfile)
- return totals
-
- def __merge_result_by_name(
- self, result_set, total_set, result_suite, total_suite):
- ''' merge result select by name'''
- if result_set.get('name') == total_set.get('name') \
- and result_suite.get('name') == total_suite.get('name'):
- if result_set.get('set_debug_msg'):
- total_set.set("set_debug_msg", result_set.get('set_debug_msg'))
- result_case_iterator = result_set.getiterator(
- 'testcase')
- if result_case_iterator:
- for result_case in result_case_iterator:
- try:
- if self.skip_tc and str(self.skip_tc).find(result_case.get('id')) > -1:
- continue
- self.__count_result(result_case)
- total_set.append(result_case)
- except IOError as error:
- LOGGER.error("[ Error: fail to append %s, error: %s ]"
- % (result_case.get('id'), error))
- def __count_result(self, result_case):
- """ record the pass,failed,block,N/A case number"""
- if not result_case.get('result'):
- result_case.set('result', 'N/A')
- # add empty result node structure for N/A case
- resinfo_elm = etree.Element('result_info')
- res_elm = etree.Element('actual_result')
- start_elm = etree.Element('start')
- end_elm = etree.Element('end')
- stdout_elm = etree.Element('stdout')
- stderr_elm = etree.Element('stderr')
- resinfo_elm.append(res_elm)
- resinfo_elm.append(start_elm)
- resinfo_elm.append(end_elm)
- resinfo_elm.append(stdout_elm)
- resinfo_elm.append(stderr_elm)
- result_case.append(resinfo_elm)
- res_elm.text = 'N/A'
- if result_case.get('result') == "PASS":
- self.testresult_dict["pass"] += 1
- if result_case.get('result') == "FAIL":
- self.testresult_dict["fail"] += 1
- if result_case.get('result') == "BLOCK":
- self.testresult_dict["block"] += 1
- if result_case.get('result') == "N/A":
- self.testresult_dict["not_run"] += 1
-
- def __get_environment(self):
- """ get environment """
- device_info = self.connector.get_device_info()
- build_infos = self.connector.get_buildinfo(self.tizenV)
- # add environment node
- environment = etree.Element('environment')
- environment.attrib['device_id'] = device_info["device_id"]
- environment.attrib['device_model'] = device_info["device_model"]
- environment.attrib['device_name'] = device_info["device_name"]
- environment.attrib['host'] = platform.platform()
- environment.attrib['lite_version'] = get_version_info()
- environment.attrib['resolution'] = device_info["resolution"]
- environment.attrib['screen_size'] = device_info["screen_size"]
- environment.attrib['build_id'] = device_info['build_id']
- environment.attrib['manufacturer'] = build_infos['manufacturer']
- other = etree.Element('other')
- other.text = ""
- environment.append(other)
- environment.tail = "\n"
-
- return environment
-
- def __print_summary(self):
- """ print test summary infomation"""
- LOGGER.info("[ test summary ]")
- total_case_number = int(self.testresult_dict["pass"]) \
- + int(self.testresult_dict["fail"]) \
- + int(self.testresult_dict["block"]) \
- + int(self.testresult_dict["not_run"])
- #LOGGER.info(" [ total case number: %s ]" % (total_case_number))
- if total_case_number == 0:
- LOGGER.info("[Warning: found 0 case from the result files, "
- "if it's not right, please check the test xml files, "
- "or the filter values ]")
- else:
- LOGGER.info(" [ total case number: %s ]" % (total_case_number))
- LOGGER.info(" [ pass rate: %.2f%% ]" % (float(
- self.testresult_dict["pass"]) * 100 / int(total_case_number)))
- LOGGER.info(" [ PASS case number: %s ]" %
- self.testresult_dict["pass"])
- LOGGER.info(" [ FAIL case number: %s ]" %
- self.testresult_dict["fail"])
- LOGGER.info(" [ BLOCK case number: %s ]" %
- self.testresult_dict["block"])
- LOGGER.info(" [ N/A case number: %s ]" %
- self.testresult_dict["not_run"])
-
- def __prepare_external_test_json(self, resultfile):
- """Run external test"""
- parameters = {}
- xml_set_tmp = resultfile
- # split set_xml by <case> get case parameters
- LOGGER.debug("[ split xml: %s by <case> ]" % xml_set_tmp)
- LOGGER.debug("[ this might take some time, please wait ]")
- try:
- parse_tree = etree.parse(xml_set_tmp)
- root_em = parse_tree.getroot()
- tsuite = root_em.getiterator('suite')[0]
- case_tmp = []
- parameters.setdefault("suite_name", tsuite.get('name'))
- for tset in root_em.getiterator('set'):
- case_order = 1
- parameters.setdefault("casecount", str(len(tset.getiterator('testcase'))))
- parameters.setdefault("current_set_name", xml_set_tmp)
- parameters.setdefault("name", tset.get('name'))
- parameters.setdefault("type", tset.get('type'))
- parameters.setdefault("exetype", '')
- #add test set location, yangx.zhou@intel.com
- parameters.setdefault("location", '')
- if tset.get("location") is not None:
- parameters["location"] = tset.get("location")
-
- # if tset.get("test_set_src") is not None:
- # set_entry = self.test_prefix + tset.get("test_set_src")
- # parameters.setdefault("test_set_src", set_entry)
-
- for tcase in tset.getiterator('testcase'):
- if self.skip_tc and str(self.skip_tc).find(tcase.get('id')) > -1:
- continue
-
- case_detail_tmp = {}
- step_tmp = []
- parameters["exetype"] = tcase.get('execution_type')
- case_detail_tmp.setdefault("case_id", tcase.get('id'))
- case_detail_tmp.setdefault("purpose", tcase.get('purpose'))
- case_detail_tmp.setdefault("order", str(case_order))
- case_detail_tmp.setdefault("onload_delay", "3")
- if parameters["location"] != '':
- case_detail_tmp.setdefault("location", parameters["location"])
- else:
- case_detail_tmp.setdefault("location", "device")
-
- if tcase.find('description/test_script_entry') is not None:
- tc_entry = tcase.find(
- 'description/test_script_entry').text
- if not tc_entry:
- tc_entry = ""
-
- tc_entry = tc_entry.replace(DEVICE_SUITE_TARGET_30_STR,DEVICE_SUITE_TARGET_30)
- tc_entry = tc_entry.replace(DEVICE_EXECUTION_MODE_30_STR,DEVICE_EXECUTION_MODE_30)
-
- case_detail_tmp["entry"] = self.test_prefix + tc_entry
- if tcase.find(
- 'description/test_script_entry').get('timeout'):
- case_detail_tmp["timeout"] = tcase.find(
- 'description/test_script_entry'
- ).get('timeout')
- if tcase.find(
- 'description/test_script_entry'
- ).get('test_script_expected_result'):
- case_detail_tmp["expected_result"] = tcase.find(
- 'description/test_script_entry'
- ).get('test_script_expected_result')
- if tcase.find(
- 'description/test_script_entry'
- ).get('location'):
- case_detail_tmp["location"] = tcase.find(
- 'description/test_script_entry'
- ).get('location')
- tc_refer_entry = ""
- if tcase.find('description/refer_test_script_entry') is not None:
- tc_refer_entry = tcase.find(
- 'description/refer_test_script_entry').text
-
- case_detail_tmp["refer_entry"] = tc_refer_entry
-
- if tcase.find('description/refer_test_script_entry')is not None:
- case_detail_tmp["refer_timeout"] = tcase.find(
- 'description/refer_test_script_entry').get('timeout')
- if tcase.find('description/refer_test_script_entry')is not None:
- case_detail_tmp["refer_expected_result"] = tcase.find(
- 'description/refer_test_script_entry').get('test_script_expected_result')
- if tcase.find('description/refer_test_script_entry') is not None:
- case_detail_tmp["refer_location"] = tcase.find(
- 'description/refer_test_script_entry').get('location')
-
- if tcase.getiterator("step"):
- for this_step in tcase.getiterator("step"):
- step_detail_tmp = {}
- step_detail_tmp.setdefault("order", "1")
- step_detail_tmp["order"] = str(
- this_step.get('order'))
-
- if this_step.find("step_desc") is not None:
- text = this_step.find("step_desc").text
- if text is not None:
- step_detail_tmp["step_desc"] = text
-
- if this_step.find("expected") is not None:
- text = this_step.find("expected").text
- if text is not None:
- step_detail_tmp["expected"] = text
-
- step_tmp.append(step_detail_tmp)
-
- case_detail_tmp['steps'] = step_tmp
-
- if tcase.find('description/pre_condition') is not None:
- text = tcase.find('description/pre_condition').text
- if text is not None:
- case_detail_tmp["pre_condition"] = text
-
- if tcase.find('description/post_condition') is not None:
- text = tcase.find('description/post_condition').text
- if text is not None:
- case_detail_tmp['post_condition'] = text
-
- if tcase.get('onload_delay') is not None:
- case_detail_tmp[
- 'onload_delay'] = tcase.get('onload_delay')
- # Check performance test
- if tcase.find('measurement') is not None:
- measures = tcase.getiterator('measurement')
- measures_array = []
- for measure in measures:
- measure_json = {}
- measure_json['name'] = measure.get('name')
- measure_json['file'] = measure.get('file')
- measures_array.append(measure_json)
- case_detail_tmp['measures'] = measures_array
- case_tmp.append(case_detail_tmp)
- case_order += 1
- parameters.setdefault("cases", case_tmp)
- if self.bdryrun:
- parameters.setdefault("dryrun", True)
- self.set_parameters = parameters
-
- #add by yangx.zhou@intel.com, 2014.09.11
- # if self.worker_name !=None and self.worker_name == 'webdriver':
- # value = 'webdriver'
- value = None
- if parameters['type']!= None and self.worker_name == None:
- # if parameters['type'] == 'script':
- # value = 'default'
- if parameters['type'] == 'androidunit':
- value = 'androidunit'
- #value ='default'
- elif parameters['type'] == 'pyunit' :
- value = 'pyunit'
- elif parameters['type'] == 'qunit':
- value = 'default'
- if value != None:
- try:
- exec "from testkitlite.engines.%s import TestWorker" %value
- LOGGER.info("TestWorker is %s" %value)
- except Exception as error:
- #print 'path: ', os.getcwd()
- raise TestEngineException(value)
- else:
- self.testworker = TestWorker(self.connector)
- except IOError as error:
- LOGGER.error("[ Error: fail to prepare cases parameters, "
- "error: %s ]\n" % error)
- return False
- return True
-
- def apply_filter(self, root_em):
- """ apply filter """
- rules = self.filter_rules
- for tsuite in root_em.getiterator('suite'):
- if rules.get('suite'):
- if tsuite.get('name') not in rules['suite']:
- root_em.remove(tsuite)
- for tset in tsuite.getiterator('set'):
- if rules.get('set'):
- if tset.get('name') not in rules['set']:
- tsuite.remove(tset)
-
- for tsuite in root_em.getiterator('suite'):
- for tset in tsuite.getiterator('set'):
- # if there are capabilities ,do filter
- if self.has_capability:
- tset_status = self.__apply_capability_filter_set(tset)
- if not tset_status:
- tsuite.remove(tset)
- continue
- for tcase in tset.getiterator('testcase'):
- if not self.__apply_filter_case_check(tcase):
- tset.remove(tcase)
- else:
- self.filter_ok = True
-
- def __apply_filter_case_check(self, tcase):
- """filter cases"""
- rules = self.filter_rules
- for key in rules.iterkeys():
- if key in ["suite", "set"]:
- continue
- # Check attribute
- t_val = tcase.get(key)
- if t_val:
- if not t_val in rules[key]:
- return False
- else:
- # Check sub-element
- items = tcase.getiterator(key)
- if items:
- t_val = []
- for i in items:
- t_val.append(i.text)
- if len(set(rules[key]) & set(t_val)) == 0:
- return False
- else:
- return False
- return True
-
- def __apply_capability_filter_set(self, tset):
- """ check the set required capability with self.capabilities """
-
- for tcaps in tset.getiterator('capabilities'):
- for tcap in tcaps.getiterator('capability'):
- capname = None
- capvalue = None
- capname = tcap.get('name').lower()
- if tcap.find('value') is not None:
- capvalue = tcap.find('value').text
-
- if capname in self.capabilities:
- if capvalue is not None:
- if capvalue != self.capabilities[capname]:
- # if capability value is not equal ,remove the case
- return False
- else:
- # if does not hava this capability ,remove case
- return False
- return True
-
- # sdx@kooltux.org: parse measures returned by test script
- # and insert in XML result
- # see xsd/test_definition.xsd: measurementType
- _MEASURE_ATTRIBUTES = ['name', 'value', 'unit',
- 'target', 'failure', 'power']
-
- def __insert_measures(self, case, buf, pattern="###[MEASURE]###"):
- """ get measures """
- measures = self.__extract_measures(buf, pattern)
- for measure in measures:
- m_elm = etree.Element('measurement')
- for key in measure:
- m_elm.attrib[key] = measure[key]
- case.append(m_elm)
-
- def __extract_measures(self, buf, pattern):
- """
- This function extracts lines from <buf> containing the defined
- <pattern>. For each line containing the pattern, it extracts the
- string to the end of line Then it splits the content in multiple
- fields using the defined separator <field_sep> and maps the fields
- to measurement attributes defined in xsd. Finally, a list containing
- all measurement objects found in input buffer is returned
- """
- out = []
- for line in buf.split("\n"):
- pos = line.find(pattern)
- if pos < 0:
- continue
-
- measure = {}
- elts = collections.deque(line[pos + len(pattern):].split(':'))
- for k in self._MEASURE_ATTRIBUTES:
- if len(elts) == 0:
- measure[k] = ''
- else:
- measure[k] = elts.popleft()
-
- # don't accept unnamed measure
- if measure['name'] != '':
- out.append(measure)
- return out
-
- def __init_com_module(self, testxml):
- """
- send init test to com_module
- if webapi test,com_module will start testkit-stub
- else com_module send the test case to devices
- """
- starup_prms = self.__prepare_starup_parameters(testxml)
- # init stub and get the session_id
- session_id = self.testworker.init_test(starup_prms)
- if session_id == None:
- LOGGER.error("[ Error: Initialization Error]")
- return False
- else:
- self.set_session_id(session_id)
- return True
-
- def __prepare_starup_parameters(self, testxml):
- """ prepare_starup_parameters """
-
- starup_parameters = {}
- LOGGER.info("[ preparing for startup options ]")
- try:
- parse_tree = etree.parse(testxml)
- tsuite = parse_tree.getroot().getiterator('suite')[0]
- tset = parse_tree.getroot().getiterator('set')[0]
- #if tset.get("launcher") is not None:
- # starup_parameters[OPT_LAUNCHER] = tset.get("launcher")
- #else:
- # starup_parameters[OPT_LAUNCHER] = tsuite.get("launcher")
-
-
- if self.external_test is not None:
- starup_parameters[OPT_LAUNCHER] = self.external_test
- starup_parameters[OPT_EXTENSION] = self.external_test.split(' ')[0]
-
- tp = tset.get('type')
-
- if tp == "wrt":
- starup_parameters[OPT_LAUNCHER] = "xwalk -iu"
- starup_parameters[OPT_EXTENSION] = "xwalk"
- elif tp in ['js','qunit', 'ref']:
- starup_parameters[OPT_LAUNCHER] = "xwalk"
- # jh0219.han@samsung.com //in
- elif tp == "uifw":
- starup_parameters[OPT_LAUNCHER] = "xwalk -a"
- elif tp == "uifwr":
- starup_parameters[OPT_LAUNCHER] = "xwalk -r"
- # jh0219.han@samsung.com //out
- #print starup_parameters[OPT_LAUNCHER],'debug'
- # if self.external_test is not None:
- # starup_parameters[OPT_LAUNCHER] = self.external_test
- # starup_parameters[OPT_EXTENSION] = self.external_test.split(' ')[0]
-
- if tsuite.get("extension") is not None:
- starup_parameters[OPT_EXTENSION] = tsuite.get("extension")
- if tsuite.get("widget") is not None:
- starup_parameters[OPT_WIDGET] = tsuite.get("widget")
- starup_parameters[OPT_SUITE] = tsuite.get("name")
- starup_parameters[OPT_SET] = tset.get("name")
- starup_parameters[OPT_STUB] = self.stub_name
- starup_parameters[OPT_STUB_PORT] = self.stub_port
- starup_parameters['tizen-version'] =self.tizenV
-
- # if self.external_test is not None and \
- # starup_parameters[OPT_LAUNHER].find(self.external_test) == -1:
- # if self.external_test is not None:
- # starup_parameters[OPT_LAUNCHER] = self.external_test
- # starup_parameters[OPT_EXTENSION] = self.external_test.split(' ')[0]
- #print starup_parameters[OPT_LAUNCHER]
- starup_parameters[OPT_DEBUG] = self.debug
- if self.resultfile:
- debug_dir = DIRNAME(self.resultfile)
- debug_name = os.path.splitext(BASENAME(self.resultfile))[0]
- if not EXISTS(debug_dir):
- os.makedirs(debug_dir)
- else:
- debug_dir = DIRNAME(testxml)
- debug_name = os.path.splitext(BASENAME(testxml))[0]
- starup_parameters[OPT_DEBUG_LOG] = JOIN(debug_dir, debug_name)
- self.debug_log_file = starup_parameters[OPT_DEBUG_LOG] + '.dlog'
- if self.rerun:
- starup_parameters[OPT_RERUN] = self.rerun
- if len(self.capabilities) > 0:
- starup_parameters[OPT_CAPABILITY] = self.capabilities
- # for webdriver
- starup_parameters['target_platform'] = self.targetplatform
- #starup_parameters['debugip'] = self.debugip
- #starup_parameters['wd_url'] = self.wdurl
- starup_parameters['set_type'] = self.set_parameters['type']
- starup_parameters['set_exetype'] = self.set_parameters['exetype']
- starup_parameters['session_dir'] = self.session_dir
- starup_parameters['log_debug'] = self.debug
-
- except IOError as error:
- LOGGER.error(
- "[ Error: prepare starup parameters, error: %s ]" % error)
- return starup_parameters
-
- def __check_test_status(self):
- '''
- get_test_status from com_module
- check the status
- if end ,return ture; else return False
- '''
- # check test running or end
- # if the status id end return True ,else return False
- session_status = self.testworker.get_test_status(self.session_id)
- if not session_status == None:
- if session_status["finished"] == "0":
- progress_msg_list = session_status["msg"]
- for line in progress_msg_list:
- LOGGER.info(line)
- return False
- elif session_status["finished"] == "1":
- return True
- else:
- LOGGER.error("[ session status error ,pls finalize test ]\n")
- # return True to finished this set ,becasue server error
- return True
-
- def finalize_test(self, sessionid):
- '''shut_down testkit-stub'''
- try:
- self.testworker.finalize_test(sessionid)
- except Exception as error:
- LOGGER.error("[ Error: fail to close webapi http server, "
- "error: %s ]" % error)
-
- def get_capability(self, file_name):
- """get_capability from file """
- if file_name is None:
- return True
- capability_xml = file_name
- capabilities = {}
- try:
- parse_tree = etree.parse(capability_xml)
- root_em = parse_tree.getroot()
- for tcap in root_em.getiterator('capability'):
- capability = get_capability_form_node(tcap)
- capabilities = dict(capabilities, **capability)
-
- self.set_capability(capabilities)
- return True
- except IOError as error:
- LOGGER.error(
- "[ Error: fail to parse capability xml, error: %s ]" % error)
- return False
-
- def __write_set_result(self, testxmlfile, result):
- """
- get the result JSON form com_module,
- write them to orignal testxmlfile
- """
- #print 'debug', set_result
- # write the set_result to set_xml
- set_result_xml = testxmlfile
- # covert JOSN to python dict string
- set_result = result
- if 'resultfile' in set_result:
- write_file_result(set_result_xml, set_result, self.debug_log_file)
- else:
- write_json_result(set_result_xml, set_result, self.debug_log_file)
-
-
-def get_capability_form_node(capability_em):
- ''' splite capability key and value form element tree'''
- tmp_key = ''
- capability = {}
- tcap = capability_em
- if tcap.get("name"):
- tmp_key = tcap.get("name").lower()
-
- if tcap.get("type").lower() == 'boolean':
- if tcap.get("support").lower() == 'true':
- capability[tmp_key] = True
-
- if tcap.get("type").lower() == 'integer':
- if tcap.get("support").lower() == 'true':
- if tcap.getiterator(
- "value") and tcap.find("value").text is not None:
- capability[tmp_key] = int(tcap.find("value").text)
-
- if tcap.get("type").lower() == 'string':
- if tcap.get("support").lower() == 'true':
- if tcap.getiterator(
- "value") and tcap.find("value").text is not None:
- capability[tmp_key] = tcap.find("value").text
-
- return capability
-
-
-def get_version_info():
- """
- get testkit tool version ,just read the version in VERSION file
- VERSION file must put in /opt/testkit/lite3.0/
- """
- try:
- config = ConfigParser.ConfigParser()
- if platform.system() == "Linux":
- config.read('/opt/testkit/lite3.0/VERSION')
- else:
- version_file = os.path.join(sys.path[0], 'VERSION')
- config.read(version_file)
- version = config.get('public_version', 'version')
- return version
- except KeyError as error:
- LOGGER.error(
- "[ Error: fail to parse version info, error: %s ]\n" % error)
- return ""
-
-
-def replace_cdata(file_name):
- """ replace some character"""
- try:
- abs_path = mktemp()
- new_file = open(abs_path, 'w')
- old_file = open(file_name)
- for line in old_file:
- line_temp = line.replace('<![CDATA', '<![CDATA')
- new_file.write(line_temp.replace(']]>', ']]>'))
- new_file.close()
- old_file.close()
- remove(file_name)
- move(abs_path, file_name)
- except IOError as error:
- LOGGER.error("[ Error: fail to replace cdata in the result file, "
- "error: %s ]\n" % error)
-
-
-def extract_notes(buf, pattern):
- """util func to split lines in buffer, search for pattern on each line
- then concatenate remaining content in output buffer"""
- out = ""
- for line in buf.split("\n"):
- pos = line.find(pattern)
- if pos >= 0:
- out += line[pos + len(pattern):] + "\n"
- return out
-
-# sdx@kooltux.org: parse notes in buffer and insert them in XML result
-
-
-def insert_notes(case, buf, pattern="###[NOTE]###"):
- """ insert notes"""
- desc = case.find('description')
- if desc is None:
- return
-
- notes_elm = desc.find('notes')
- if notes_elm is None:
- notes_elm = etree.Element('notes')
- desc.append(notes_elm)
- if notes_elm.text is None:
- notes_elm.text = extract_notes(buf, pattern)
- else:
- notes_elm.text += "\n" + extract_notes(buf, pattern)
-
-
-def get_summary(start_time, end_time):
- """ set summary node """
- summary = etree.Element('summary')
- summary.attrib['test_plan_name'] = "Empty test_plan_name"
- start_at = etree.Element('start_at')
- start_at.text = start_time
- end_at = etree.Element('end_at')
- end_at.text = end_time
- summary.append(start_at)
- summary.append(end_at)
- summary.tail = "\n "
- return summary
-
-
-def write_file_result(set_result_xml, set_result, debug_log_file):
- """write xml result file"""
- result_file = set_result['resultfile']
- try:
- test_tree = etree.parse(set_result_xml)
- test_em = test_tree.getroot()
- result_tree = etree.parse(result_file)
- result_em = result_tree.getroot()
- dubug_file = BASENAME(debug_log_file)
- for result_suite in result_em.getiterator('suite'):
- for result_set in result_suite.getiterator('set'):
- for test_suite in test_em.getiterator('suite'):
- for test_set in test_suite.getiterator('set'):
- if result_set.get('name') == \
- test_set.get('name'):
- result_set.set("set_debug_msg", dubug_file)
- test_suite.remove(test_set)
- test_suite.append(result_set)
- test_tree.write(set_result_xml)
- os.remove(result_file)
- LOGGER.info("[ cases result saved to resultfile ]\n")
- except OSError as error:
- traceback.print_exc()
- LOGGER.error(
- "[ Error: fail to write cases result, error: %s ]\n" % error)
-
-
-def __expand_subcases(tset, tcase, sub_num, result_msg, detail=None):
- sub_case_result = result_msg.split("[assert]")[1:]
- if not detail:
- for i in range(sub_num):
- sub_case = copy.deepcopy(tcase)
- sub_case.set("id", "/".join([tcase.get("id"), str(i+1)]))
- sub_case.set("purpose", "/".join([tcase.get("purpose"), str(i+1)]))
- sub_case.remove(sub_case.find("./result_info"))
- result_info = etree.SubElement(sub_case, "result_info")
- actual_result = etree.SubElement(result_info, "actual_result")
- stdout = etree.SubElement(result_info, "stdout")
- if i < len(sub_case_result):
- sub_info = sub_case_result[i].split('[message]')
- #print sub_info
- sub_case.set("result", sub_info[0].upper())
- actual_result.text = sub_info[0].upper()
- stdout.text = sub_info[1]
- else:
- sub_case.set("result", "")
- actual_result.text = ""
- stdout.text = ""
- tset.append(sub_case)
- else:
- for i in range(sub_num):
- print 'debug', detail[i], i
- sub_case = copy.deepcopy(tcase)
- sub_case.set("id", "/".join([tcase.get("id"), str(i+1)]))
- sub_case.set("purpose", "/".join([tcase.get("purpose"), str(i+1)]))
- sub_case.remove(sub_case.find("./result_info"))
- result_info = etree.SubElement(sub_case, "result_info")
- actual_result = etree.SubElement(result_info, "actual_result")
- stdout = etree.SubElement(result_info, "stdout")
- #add 1392 co 1395,1396 --1399 tab
- if i > len(detail) -1:
- sub_info = detail[i]['stdout'].split('[message]')
- sub_case.set("result", "BLOCK")
- actual_result.text = "BLOCK"
- else:
- sub_case.set("result", detail[i]['result'])
- actual_result.text = detail[i]['result'].upper()
- #actual_result.text = sub_info[0].upper()
- stdout.text = detail[i]['stdout']
- #stdout.text = sub_info[1]
- # else:
- # sub_case.set("result", "")
- # actual_result.text = ""
- # stdout.text = ""
- tset.append(sub_case)
-
- tset.remove(tcase)
-
-
-def __write_by_create(tset, case_results, cm):
- for case_result in case_results:
- tcase = etree.Element('testcase')
- tcase.set('id', case_result['case_id'])
- tcase.set('purpose', case_result['purpose'])
- tcase.set('result', case_result['result'].upper())
- tcase.set('component',cm)
- result_info = etree.SubElement(tcase, "result_info")
- actual_result = etree.SubElement(result_info, "actual_result")
- actual_result.text = case_result['result'].upper()
- start = etree.SubElement(result_info, "start")
- end = etree.SubElement(result_info, "end")
- stdout = etree.SubElement(result_info, "stdout")
- stderr = etree.SubElement(result_info, "stderr")
- if 'start_at' in case_result:
- start.text = case_result['start_at']
- if 'end_at' in case_result:
- end.text = case_result['end_at']
- if 'stdout' in case_result:
- stdout.text = str2xmlstr(case_result['stdout'])
- if 'stderr' in case_result:
- stderr.text = str2xmlstr(case_result['stderr'])
- tset.append(tcase)
-
-
-def __write_by_caseid(tset, case_results):
- #tset.set("set_debug_msg", "N/A")
- for tcase in tset.getiterator('testcase'):
- for case_result in case_results:
- if tcase.get("id") == case_result['case_id']:
- tcase.set('result', case_result['result'].upper())
- # Check performance test
- if tcase.find('measurement') is not None:
- for measurement in tcase.getiterator(
- 'measurement'):
- if 'measures' in case_result:
- m_results = case_result['measures']
- for m_result in m_results:
- if measurement.get('name') == \
- m_result['name'] and 'value' in m_result:
- measurement.set(
- 'value', m_result[
- 'value'])
- if tcase.find("./result_info") is not None:
- tcase.remove(tcase.find("./result_info"))
- result_info = etree.SubElement(tcase, "result_info")
- actual_result = etree.SubElement(
- result_info, "actual_result")
- actual_result.text = case_result['result'].upper()
- start = etree.SubElement(result_info, "start")
- end = etree.SubElement(result_info, "end")
- stdout = etree.SubElement(result_info, "stdout")
- stderr = etree.SubElement(result_info, "stderr")
- if 'start_at' in case_result:
- start.text = case_result['start_at']
- if 'end_at' in case_result:
- end.text = case_result['end_at']
- if 'stdout' in case_result:
- stdout.text = str2xmlstr(case_result['stdout'])
- if 'stderr' in case_result:
- stderr.text = str2xmlstr(case_result['stderr'])
- if tcase.get("subcase") is not None:
- #print 'subcase', tcase.get('subcase')
- sub_num = int(tcase.get("subcase"))
- result_msg = case_result['stdout']
- __expand_subcases(tset, tcase, sub_num, result_msg)
-
-def __write_by_class(tset, case_results):
- tset.set("set_debug_msg", "N/A")
- for tcase in tset.getiterator('testcase'):
- #for key in case_results.keys():
- sub_no = int(tcase.get('subcase'))
- text = tcase.find('description/test_script_entry').text
- if text in case_results:
- # tcase.set('result', case_result['result'].upper())
- if tcase.find("./result_info") is not None:
- tcase.remove(tcase.find("./result_info"))
- result_info = etree.SubElement(tcase, "result_info")
- if sub_no == len(case_results[text]):
- for case_result in case_results[text]:
- actual_result = etree.SubElement(
- result_info, "actual_result")
- actual_result.text = case_result['result'].upper()
- start = etree.SubElement(result_info, "start")
- end = etree.SubElement(result_info, "end")
- stdout = etree.SubElement(result_info, "stdout")
- stderr = etree.SubElement(result_info, "stderr")
- if 'start_at' in case_result:
- start.text = case_result['start_at']
- if 'end_at' in case_result:
- end.text = case_result['end_at']
- if 'stdout' in case_result:
- stdout.text = str2xmlstr(case_result['stdout'])
- if 'stderr' in case_result:
- stderr.text = str2xmlstr(case_result['stderr'])
- else:
- for case_result in case_results[text]:
- actual_result = etree.SubElement(
- result_info, "actual_result")
- actual_result.text = case_result['result'].upper()
- start = etree.SubElement(result_info, "start")
- end = etree.SubElement(result_info, "end")
- stdout = etree.SubElement(result_info, "stdout")
- stderr = etree.SubElement(result_info, "stderr")
- if 'start_at' in case_result:
- start.text = case_result['start_at']
- if 'end_at' in case_result:
- end.text = case_result['end_at']
- if 'stdout' in case_result:
- stdout.text = str2xmlstr(case_result['stdout'])
- if 'stderr' in case_result:
- stderr.text = str2xmlstr(case_result['stderr'])
- for i in range(sub_no - len(case_results[text])):
- case_result = case_results[text][-1]
- actual_result = etree.SubElement(
- result_info, "actual_result")
- actual_result.text = case_result['result'].upper()
- start = etree.SubElement(result_info, "start")
- end = etree.SubElement(result_info, "end")
- stdout = etree.SubElement(result_info, "stdout")
- stderr = etree.SubElement(result_info, "stderr")
- if 'start_at' in case_result:
- start.text = case_result['start_at']
- if 'end_at' in case_result:
- end.text = case_result['end_at']
- if 'stdout' in case_result:
- stdout.text = str2xmlstr(case_result['stdout'])
- if 'stderr' in case_result:
- stderr.text = str2xmlstr(case_result['stderr'])
-
-
- if tcase.get("subcase") is not None:
- sub_num = int(tcase.get("subcase"))
- result_msg = case_result['stdout']
- __expand_subcases(tset, tcase, sub_num, result_msg, case_results[text])
-
-def sort_result(case_results):
- total = dict()
- for result in case_results:
- if result['case_class'] in total:
- total[result['case_class']].append(result)
- else:
- total[result['case_class']] = [result]
- return total
-
-def write_json_result(set_result_xml, set_result, debug_log_file):
- ''' fetch result form JSON'''
- case_results = set_result["cases"]
- try:
- parse_tree = etree.parse(set_result_xml)
- #print 'debug tree', debug_log_file
- root_em = parse_tree.getroot()
- dubug_file = BASENAME(debug_log_file)
- for tset in root_em.getiterator('set'):
- tset.set("set_debug_msg", dubug_file)
- if tset.get('type') == 'pyunit':
- cm = tset.find('testcase').get('component')
- __write_by_create(tset, case_results, cm)
- elif tset.get('type') == 'androidunit':
- total = sort_result(case_results)
- __write_by_class(tset, total)
- else:
- __write_by_caseid(tset, case_results)
- parse_tree.write(set_result_xml)
- LOGGER.info("[ cases result saved to resultfile ]\n")
- except IOError as error:
- traceback.print_exc()
- LOGGER.error(
- "[ Error: fail to write cases result, error: %s ]\n" % error)
+++ /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 of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-""" string convertor"""
-
-from types import IntType, FloatType, LongType
-import string
-
-
-def str2str(src):
- """string to printable string"""
- if isinstance(src, unicode):
- return src.encode("utf8")
-
- if isinstance(src, str):
- accept = string.punctuation + string.letters + string.digits + ' \r\n'
- return filter(lambda x: x in accept, src)
-
- return ""
-
-
-def str2val(src):
- """string to program value"""
- ret = None
- try:
- ret = eval(str2str(src))
- except:
- pass
- return ret
-
-
-def str2bool(src):
- """string to boolean"""
- if "TRUE" == str2str(src).upper():
- return True
- if "FALSE" == str2str(src).upper():
- return False
- return None
-
-
-def str2number(src):
- """string to boolean"""
- val = str2val(str2str(src))
- if type(val) in [IntType, FloatType, LongType]:
- return val
- else:
- return None
-
-
-def str2xmlstr(src):
- """string to xml string value"""
- return src.replace('\n', '\\n')
+++ /dev/null
-import os
-import signal
-import sys
-import logging
-
-LOG = logging.getLogger("TestRunner")
-
-
-def pidExists(pid):
- if pid < 0:
- return False
- try:
- os.kill(pid, 0)
- except OSError as e:
- return False
- else:
- return True
-
-
-def IsWindows():
- return sys.platform == 'cygwin' or sys.platform.startswith('win')
-
-
-def KillAllProcesses(ppid=None):
- if IsWindows():
- subprocess.check_call("TASKKILL /F /PID %s /T" % ppid)
- else:
- ppid = str(ppid)
- pidgrp = []
-
- def GetChildPids(ppid):
- command = "ps -ef | awk '{if ($3 ==%s) print $2;}'" % str(ppid)
- pids = os.popen(command).read()
- pids = pids.split()
-
- return pids
-
- pidgrp.extend(GetChildPids(ppid))
- for pid in pidgrp:
- pidgrp.extend(GetChildPids(pid))
-
- pidgrp.insert(0, ppid)
- while len(pidgrp) > 0:
- pid = pidgrp.pop()
- try:
- os.kill(int(pid), signal.SIGKILL)
- return True
- except OSError:
- try:
- os.popen("kill -9 %d" % int(pid))
- return True
- except:
- return False
+++ /dev/null
-#!/usr/bin/python
-#
-# Copyright (C) 2014 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Nicolas Zingile <n.zingile@gmail.com>
-
-"""Merger module for testkit xml files"""
-
-from lxml import etree
-import os
-
-#------------------------- Global variables -------------------------#
-
-TESTDEFATTRS = {}
-TESTDEFCHILDS = {"environment" : False, "summary" : False, "suite" : False}
-ENVATTRS = {"build_id" : False, "device_id" : False, "device_model" : False,
- "device_name" : False, "host" : False, "lite_version" : False,
- "manufacturer" : False, "resolution" : False, "screen_size" : False}
-ENVCHILDS = {"other" : False}
-SUMATTRS = {"test_plan_name" : False}
-SUMCHILDS = {"start_at" : True, "end_at" : True}
-SUITEATTRS = {"name" : True, "launcher" : False,'category':None,'extension':None}
-SUITECHILDS = {"set" : True}
-SETATTRS = {"name" : True, "set_debug_msg" : False,'type':None}
-SETCHILDS = {"testcase" : False,'capabilities':False}
-TCATTRS = {"component" : True, "execution_type" : True, "id" :True,
- "name" : False, "priority" : True, "purpose" : True,"onload_delay":None,
- "result" : True, "status" : True, "type" : True}
-TCCHILDS = {"description" : False ,"result_info":False}
-
-DESCATTRS ={}
-DESCCHILDS = {"test_script_entry": True,"refer_test_script_entry":False,"pre_condition" : False, "post_condition" : False, "steps" : False}
-RESULTCHILD = {'actual_result':True,'start':False,'end':False,'stdout':False}
-RESINFOATTRS = {}
-RESINFOCHILDS = {"actual_result" : True, "start" :False, "end" : False,
- "stdout" : False, "stderr" : False}
-
-class ElementError(Exception):
- """Custom class to handle the merging exceptions"""
- pass
-
-def check_element(element, attrdico, childsdico):
- """Checks a node of the testkit result xml tree.
-
- Allows to verify the integrity of a testkit result xml node.
- Check if element contains allowed attributes and if the value of
- those attributes is filled if it should be.
- Check if the child nodes of element are allowed and if so, checks
- if the child node contains text if it should.
-
- Args:
- element : Element to check
- attrdico: A dict that contains information on attributes of element
- keys: String - allowed attributes of the element
- values: Booleans indicating if the keys should be filled
- childsdico: A dict that contains information on sub elements of element
- keys: String - allowed sub elements of element
- values: Booleans indicating if the keys should contain text
- Returns:
-
- Raises:
- ElementError
- """
- for attrname, attrvalue in element.attrib.items():
- if attrname in attrdico.keys():
- if not attrvalue and attrdico.get(attrname):
- raise ElementError("Attribute '" + attrname + "' of element '" + element.tag
- + "' is not defined")
- else:
- raise ElementError("Attribute '" + attrname + "' is not authorized as an attribute of the '" + element.tag + "' element")
- for child in list(element):
- if (child.tag not in childsdico.keys()):
- raise ElementError("Element '" + child.tag + " should not be a child element of '" + element.tag + "'")
- elif (not child.text and childsdico.get(child.tag)):
- raise ElementError("The element '" + child.tag + "' should contain some text")
-
-def create_xmltree():
- """Creates an ElementTree object.
- Args:
-
- Return:
- An ElementTree object that represents en empty testkit result xml file.
- """
- root = etree.Element("test_definition")
- xmltree = etree.ElementTree(root)
- print "xml tree created !"
-
- return xmltree
-
-def create_envandsum(srcxmltree, destxmltree):
- """Creates the environment and the summary nodes of
- an ElementTree object.
-
- Copy the environment and the summary nodes of srcxmltree in
- the destxmltree. The destxmltree only contains the root element.
-
- Args:
- srcxmltree: Source xmltree from where we want to copy some nodes.
- destxmltree: Destination xmltree to augment with some nodes.
-
- Returns:
- An ElementTree that partially represents a testkit result xml file.
- """
- testdef = destxmltree.getroot()
- environment = srcxmltree.find("/environment")
- summary = srcxmltree.find("/summary")
- testdef.append(environment)
- testdef.append(summary)
-
- return destxmltree
-
-def check_testdefinition(xmltree):
- """Checks the test_definition node of a testkit result xml.
-
- Checkis that all the sub elements of the test_definition node are present
- and that integrity of that sub elements is good.
-
- Args:
- xmltree: An ElementTree that represents a testkit result xml tree.
-
- Returns:
-
- Raises:
- ElementError
- """
- testdef = xmltree.getroot()
- check_element(testdef, TESTDEFATTRS, TESTDEFCHILDS)
- environment = testdef.find("./environment")
- summary = testdef.find("summary")
- if environment is not None:
- check_element(environment, ENVATTRS, ENVCHILDS)
- else:
- raise ElementError("Element 'test_definition' should contain an 'environment' element")
- if summary is not None:
- check_element(summary, SUMATTRS, SUMCHILDS)
- else:
- raise ElementError("Element 'test_definition' should contain a 'summary' element")
- for asuite in testdef.findall("./suite"):
- check_suite(asuite)
-
-def check_suite(eltsuite):
- """Checks the integrity of a suite element.
-
- Args:
- eltsuite: A suite element to check
-
- Returns:
- """
- check_element(eltsuite, SUITEATTRS, SUITECHILDS)
- for child in list(eltsuite):
- check_set(child)
-
-def check_set(eltset):
- """Checks the integrity of a set element.
-
- Args:
- eltset: A set element to check.
-
- Returns:
- """
- check_element(eltset, SETATTRS, SETCHILDS)
- for child in list (eltset):
- check_testcase(child)
-
-def check_testcase(eltcase):
- """Checks the integrity of a testcase element.
-
- Also verify that the result of the eltcase is present and consistent
-
- Args:
- eltcase: A testcase element to check
-
- Returns:
-
- Raises:
- ElementError
- """
- try:
- result = eltcase.get("result")
- actual_result = eltcase.find("./result_info/actual_result").text
- allowed_results = ["PASS", "FAIL", "N/A","BLOCK","TIMEOUT"]
- except AttributeError:
- raise ElementError("result of the testcase is not valid !")
- if result not in allowed_results or result != actual_result:
- raise ElementError("The testcase '" + eltcase.get("id") + "' doesn't have a consistent result")
- check_element(eltcase, TCATTRS, TCCHILDS)
- for child in list (eltcase):
- if child.tag == "description":
- # print "-- checking description node"
- check_element(child, DESCATTRS, DESCCHILDS)
- elif child.tag == "result_info":
- # print "-- checking result_info node"
- check_element(child, RESINFOATTRS, RESINFOCHILDS)
- #elif child.tag == "categories":
- # pass
- else:
- raise ElementError("Element '" + child.tag + "' is not allowed")
-
-def solve_conflicts(sourcecase, destcase):
- """Selects a result when same testcase is encountered in both source and destination
- testkit xml files.
-
- The result is chosen according to the following priority : FAIL > N/A > PASS.
-
- Args:
- sourcecase: A testcase element of the source testkit xml result file
- destcase: A testcase element of the destination testkit xml result file
-
- Returns:
- """
- srcresult = sourcecase.get('result')
- destresult = destcase.get('result')
- if (srcresult == destresult) or (destresult == 'FAIL') \
- or (srcresult == 'PASS' and destresult == 'N/A'):
- pass
- else:
- destcase.set('result', srcresult)
- destcase.find('./result_info/actual_result').text = srcresult
-
-def merge_testkitxml (sourcexmltree, destxmltree=None):
- """Merge two testkit xml result files.
-
- Merge the information of sourcexmltree in destxmltree. If destxmltree is
- not definded, creates a new ElementTree and copy all the information of
- sourcexmltree in it.
-
- Args:
- sourcexmltree: The source ElementTree object that represents the
- testkit result xml source file
- destxmltree: The destination ElementTree object that represents the
- testkit result xml destination file
- Returns:
- An ElementTree that represents the result of the merging of the sourcexmltree
- and destxmltree
- """
- print "## Checking source xml file ..."
- check_testdefinition(sourcexmltree)
- print "source xml file is correct. Ok\n"
- if destxmltree is None:
- print "Destination xml file doesn't exist... will be created"
- destxmltree = create_xmltree()
- create_envandsum(sourcexmltree, destxmltree)
- for asuite in sourcexmltree.iter('suite'):
- destsuite = destxmltree.find("/suite[@name='" + asuite.get('name') + "']")
- if destsuite is not None:
- for aset in asuite.iter('set'):
- destset = destsuite.find("./set[@name='" + aset.get('name') + "']")
- if destset is not None:
- for acase in aset.iter('testcase'):
- destcase = destset.find("./testcase[@id='" + acase.get('id') + "']")
- if destcase is not None:
- solve_conflicts(acase, destcase)
- else:
- destset.append(acase)
- else:
- destsuite.append(aset)
- else:
- destxmltree.getroot().append(asuite)
-
- return destxmltree
+++ /dev/null
-# Copyright (C) 2012 Intel Corporation
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-#
-# Authors:
-# Zhang, Huihui <huihuix.zhang@intel.com>
-# Wendong,Sui <weidongx.sun@intel.com>
-
-testkitxsddir = /opt/testkit/lite3.0/xsd
-dist_testkitxsd_DATA = *.js *.xsl *.css *.png *.txt *.xml *.xsd release-notes
+++ /dev/null
-function getScrollTop() {
- return f_scrollTop();
-}
-
-function f_scrollTop() {
- return f_filterResults (
- $(window) ? $(window).scrollTop() : 0,
- document.documentElement ? document.documentElement.scrollTop : 0,
- document.body ? document.body.scrollTop : 0
- );
-}
-
-function f_filterResults(n_win, n_docel, n_body) {
- var n_result = n_win ? n_win : 0;
- if (n_docel && (!n_result || (n_result > n_docel)))
- n_result = n_docel;
- return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
-}
-
-function setScrollTop() {
- $(window) ? $(window).scrollTop(0): 0;
- document.documentElement ? document.documentElement.scrollTop = 0 :0;
- document.body ? document.body.scrollTop = 0 : 0;
-}
-
-function goTopEx() {
- $node = $('#goTopBtn');
-
- if (getScrollTop() > 0) {
- $node.show();
- } else {
- $node.hide();
- }
-
- $(window).scroll(function () {
- if (getScrollTop() > 0) {
- $node.show();
- } else {
- $node.hide();
- }
- });
-
- $node.click(function () {
- setScrollTop();
- });
-}
-
+++ /dev/null
-/*! jQuery v1.7.1 jquery.com | jquery.org/license */
-(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
-f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
-{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
+++ /dev/null
-# XSLT style for Test Case and Test Result
-
-## File structure
-
-- readme.txt
-- test_definition.xsd // The schema of test definition
-- tests.css // CSS style for showing test cases and results
-- testresult.xsl
-- testcase.xsl
-- tests.xml //example of test cases
-- result.xml //example of test result
-
-## Applying the style
-
-### Update in definition and result XML
-
-To apply this style for the definition XML of test cases, please add below statement before the root element of XML (the tag "test_definition").
-
-`<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>`
-
-... such as:
-
-```
-<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
-<test_definition>
-```
-
-To apply this style for the test-result XML, please add below statement before the root element of XML (the tag "test_definition").
-
-`<?xml-stylesheet type="text/xsl" href="./testresult.xsl"?>`
-
-... such as:
-
-```
-<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet type="text/xsl" href="./testresult.xsl"?>
-<test_definition>
-```
-
-### Deploy XSLT and CSS style
-
-Please add at least the 3 files into each test package.
-
-- tests.css
-- testresult.xsl
-- testcase.xsl
-
-... such as:
-
-```
-tct-alarm-tizen-tests/
-|-- ...
-|-- testcase.xsl
-|-- testresult.xsl
-|-- tests.css
-|-- ...
-```
-
+++ /dev/null
--- version 1.0.1-2 --
-
- adding 2 new case types "compliance" and "user_experience"
-
--- version 1.0.1-3 --
-
- Add a new sub-element "spec" (type: string) under the "testcase" element.
-
--- version 1.0.1-4 --
-
- Add 2 new priority "P3" and "P4"
-
--- version 1.0.1-5 --
- Add a new root "test_definition", and the element "suite" has been move into it as children elements.
-
--- version 1.0.1-6 --
- A new optional attribute "launcher" is added in the element "testdefinition" for supporting identifying which kind of test suites the XML is designed for
-
--- version 1.0.1-7 --
-The Xslt related files are merged into this repo.
-including
-
- tests.css // CSS style for showing test cases and results
- testresult.xsl
- testcase.xsl
- tests.xml //example of test cases
- result.xml //example of test result
- application.js //Javascript for "back to top"
- jquery.min.js //JQuery
- back_top.png //image for "back to top"
-
-Modification in Schema:
-
-1\ the optional attribute "launcher" is moved into suite, not in "testdefinition" element any longer.
-
-2\ "spec" element is removed. and a new "specs" structure is added as below
-
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications"
- section="Widget" specification="Widget Packaging and XML Configuration"
- interface="Widget" usage="true" />
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
-All spec-related infomation are re-organized as XML element and attributes.
-
-In Xslt,
-
-1\ a float image "Back to top" is available on right-bottom for scrolling to top.
-
-2\ html anchor is adder for scrolling back to suite summary table, and case detail tables.
-
--- version 1.0.1-8 --
-1\ For more flexible, rename the attribute "method_or_attribute" to "element_name".
-2\ Add a new attribute "element_type" to describe the type of the corresponding specification item
-
-related example and Xlst is also updated for above.
-
--- version 1.0.1-9 --
-1\ add an attribute "cts_version" in the element "environment/BuildInfoType" for saving the version of CTS tool
-2\ add an attribute "file" in "measurement/simpleMeasurementType"
-3\ update the result XSLt for showing cts_version
-4\ update the result XSLt for showing ¡°Test Blocked¡± instead of "Test N/A"
-5\ add a summary table for showing all FAIL cases.
-
-
--- version 1.0.2-1 --
-1\ add a new int optional attribute "onload_delay" with default "3"
-
--- version 1.0.2-2 --
-1\ Add a new sub element "capabilities" under the element "testcase"
-2\ Add a new boolean attribute "check_unsupport_error" in the element "testcase"
-
--- version 1.0.2-3 --
-1\ Move the sub element "capabilities" from the element "testcase" to the element "set"
-
-
--- version 1.0.2-4 --
-1\ Add a unique limitation for suite name
-2\ Add a new optional attribute "launcher" in set
-
-
--- version 1.0.2-5 --
-1\ Add a attribute "set_debug_msg" in set for recording the name of log file.
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet type="text/xsl" href="testresult.xsl"?>
-<test_definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="http://tempuri.org" type="" xsi:noNamespaceSchemaLocation="test_definition.xsd">
- <environment device_id="generic/sdk/generic:4.0.4/MR1/302030:eng/test-keys" device_model="unknown" device_name="MR8" firmware_version="4.0.4" host="zhongqing-dev.sh.intel.com (Linux - 2.6.38.6-26.rc1.fc15.i686)" os_version="4.0.4" resolution="1280*800" screen_size="250*150" cts_version="2.3.0-3">
- <other> Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
- Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
- Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
- </other>
- </environment>
- <summary test_plan_name="tmp_test_1">
- <start_at>Fri Jul 13 04:04:59 CST 2012</start_at>
- <end_at>Fri Jul 13 05:01:53 CST 2012</end_at>
- </summary>
- <suite name="webapi-tizen-alarm-tests" type="">
- <set name="Alarm1">
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative create constructor with delay
- </step_desc>
- <expected>AlarmRelative create succeed with constructor with
- delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>PASS</actual_result>
- <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="BLOCK">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method get: default check
- </step_desc>
- <expected>AlarmManager method get: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>BLOCK</actual_result>
- <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute attribute when create with date
- </step_desc>
- <expected>AlarmAbsolute attribute return correct value when
- create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>N/R</actual_result>
- <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method add: add relative alarm
- </step_desc>
- <expected>AlarmManager method add: add relative alarm succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative attribute when create with delay
- </step_desc>
- <expected>AlarmRelative attribute return correct value when
- create succeed with with delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_getAll" priority="P1" purpose="check AlarmManager method getAll: default check" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method getAll: default check
- </step_desc>
- <expected>AlarmManager method getAll: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_03" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="Blocked">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute attribute when create with date
- </step_desc>
- <expected>AlarmAbsolute attribute return correct value when
- create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=3
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1" purpose="check AlarmAbsolute method getNextScheduledDate when create with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute method getNextScheduledDate when
- create with date
- </step_desc>
- <expected>AlarmAbsolute method getNextScheduledDate return
- correct value when create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_constructor_date" priority="P1" purpose="check AlarmAbsolute create constructor with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute create constructor with date
- </step_desc>
- <expected>AlarmAbsolute create succeed with constructor with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1" purpose="check AlarmRelative method getNextScheduleddelay when create with delay" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative method getNextScheduleddelay when
- create with delay
- </step_desc>
- <expected>AlarmRelative method getNextScheduleddelay return
- correct value when create succeed with with delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_01" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative attribute when create with delay
- </step_desc>
- <expected>AlarmRelative attribute return correct value when
- create succeed with with delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=1
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_abs" priority="P1" purpose="check AlarmManager method add: add absolute alarm" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method add: add absolute alarm
- </step_desc>
- <expected>AlarmManager method add: add absolute alarm succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_02" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute attribute when create with date
- </step_desc>
- <expected>AlarmAbsolute attribute return correct value when
- create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=2
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_removeAll" priority="P1" purpose="check AlarmManager method removeAll: default check" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method removeAll: default check
- </step_desc>
- <expected>AlarmManager method removeAll: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_remove" priority="P1" purpose="check AlarmManager method remove: default check" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method remove: default check
- </step_desc>
- <expected>AlarmManager method remove: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManagerObject_exist" priority="P1" purpose="check AlarmManagerObject existance" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManagerObject exist</step_desc>
- <expected>AlarmManagerObject exist</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_01" priority="P1" purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Check AlarmManager constants:</step_desc>
- <expected>AlarmManager constants value is correct:</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=1
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>
- <stdout>Can't find variable: tizen</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_02" priority="P1" purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Check AlarmManager constants:</step_desc>
- <expected>AlarmManager constants value is correct:</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=2
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>
- <stdout>Can't find variable: tizen</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_03" priority="P1" purpose="Check AlarmManager constants:PERIOD_DAY" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Check AlarmManager constants:</step_desc>
- <expected>AlarmManager constants value is correct:</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=3
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>
- <stdout>Can't find variable: tizen</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_04" priority="P1" purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Check AlarmManager constants:</step_desc>
- <expected>AlarmManager constants value is correct:</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=4
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>
- <stdout>Can't find variable: tizen</stdout>
- </result_info>
- </testcase>
- </set>
- <set name="Alarm">
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative create constructor with delay
- </step_desc>
- <expected>AlarmRelative create succeed with constructor with
- delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>PASS</actual_result>
- <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method get: default check
- </step_desc>
- <expected>AlarmManager method get: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute attribute when create with date
- </step_desc>
- <expected>AlarmAbsolute attribute return correct value when
- create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method add: add relative alarm
- </step_desc>
- <expected>AlarmManager method add: add relative alarm succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative attribute when create with delay
- </step_desc>
- <expected>AlarmRelative attribute return correct value when
- create succeed with with delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- </set>
- </suite>
- <suite name="webapi-tizen-alarm-tests1" type="">
- <set name="Alarm4">
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative create constructor with delay
- </step_desc>
- <expected>AlarmRelative create succeed with constructor with
- delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>PASS</actual_result>
- <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method get: default check
- </step_desc>
- <expected>AlarmManager method get: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute attribute when create with date
- </step_desc>
- <expected>AlarmAbsolute attribute return correct value when
- create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method add: add relative alarm
- </step_desc>
- <expected>AlarmManager method add: add relative alarm succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative attribute when create with delay
- </step_desc>
- <expected>AlarmRelative attribute return correct value when
- create succeed with with delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_getAll" priority="P1" purpose="check AlarmManager method getAll: default check" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method getAll: default check
- </step_desc>
- <expected>AlarmManager method getAll: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_03" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute attribute when create with date
- </step_desc>
- <expected>AlarmAbsolute attribute return correct value when
- create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=3
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1" purpose="check AlarmAbsolute method getNextScheduledDate when create with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute method getNextScheduledDate when
- create with date
- </step_desc>
- <expected>AlarmAbsolute method getNextScheduledDate return
- correct value when create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_constructor_date" priority="P1" purpose="check AlarmAbsolute create constructor with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute create constructor with date
- </step_desc>
- <expected>AlarmAbsolute create succeed with constructor with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1" purpose="check AlarmRelative method getNextScheduleddelay when create with delay" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative method getNextScheduleddelay when
- create with delay
- </step_desc>
- <expected>AlarmRelative method getNextScheduleddelay return
- correct value when create succeed with with delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_01" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative attribute when create with delay
- </step_desc>
- <expected>AlarmRelative attribute return correct value when
- create succeed with with delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=1
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_abs" priority="P1" purpose="check AlarmManager method add: add absolute alarm" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method add: add absolute alarm
- </step_desc>
- <expected>AlarmManager method add: add absolute alarm succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_02" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute attribute when create with date
- </step_desc>
- <expected>AlarmAbsolute attribute return correct value when
- create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=2
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_removeAll" priority="P1" purpose="check AlarmManager method removeAll: default check" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method removeAll: default check
- </step_desc>
- <expected>AlarmManager method removeAll: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_remove" priority="P1" purpose="check AlarmManager method remove: default check" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method remove: default check
- </step_desc>
- <expected>AlarmManager method remove: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManagerObject_exist" priority="P1" purpose="check AlarmManagerObject existance" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManagerObject exist</step_desc>
- <expected>AlarmManagerObject exist</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_01" priority="P1" purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Check AlarmManager constants:</step_desc>
- <expected>AlarmManager constants value is correct:</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=1
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>
- <stdout>Can't find variable: tizen</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_02" priority="P1" purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Check AlarmManager constants:</step_desc>
- <expected>AlarmManager constants value is correct:</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=2
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>
- <stdout>Can't find variable: tizen</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_03" priority="P1" purpose="Check AlarmManager constants:PERIOD_DAY" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Check AlarmManager constants:</step_desc>
- <expected>AlarmManager constants value is correct:</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=3
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>
- <stdout>Can't find variable: tizen</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_04" priority="P1" purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Check AlarmManager constants:</step_desc>
- <expected>AlarmManager constants value is correct:</expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=4
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>
- <stdout>Can't find variable: tizen</stdout>
- </result_info>
- </testcase>
- </set>
- <set name="Alarm3">
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative create constructor with delay
- </step_desc>
- <expected>AlarmRelative create succeed with constructor with
- delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>PASS</actual_result>
- <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method get: default check
- </step_desc>
- <expected>AlarmManager method get: default check succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmAbsolute attribute when create with date
- </step_desc>
- <expected>AlarmAbsolute attribute return correct value when
- create with date
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmManager method add: add relative alarm
- </step_desc>
- <expected>AlarmManager method add: add relative alarm succeed
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
- <stdout>Test time out</stdout>
- </result_info>
- </testcase>
- <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>check AlarmRelative attribute when create with delay
- </step_desc>
- <expected>AlarmRelative attribute return correct value when
- create succeed with with delay
- </expected>
- </step>
- </steps>
- <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2
- </test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- <result_info>
- <actual_result>FAIL</actual_result>
- <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
- <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
- <stdout/>
- </result_info>
- </testcase>
- </set>
- </suite>
-</test_definition>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
- <xs:element name="suite">
- <xs:complexType>
- <xs:sequence minOccurs="1" maxOccurs="unbounded">
- <xs:element ref="set" minOccurs="0" maxOccurs="unbounded"/>
- </xs:sequence>
- <xs:attributeGroup ref="set_attribute_group"/>
- <xs:attribute name="launcher" type="xs:string"/>
- </xs:complexType>
- <xs:unique name="uniqueSetName">
- <xs:selector xpath=".//set"/>
- <xs:field xpath="@name"/>
- </xs:unique>
- </xs:element>
- <xs:element name="set">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="capabilities" type="CapabilitiesType" minOccurs="0" maxOccurs="1"/>
- <xs:sequence minOccurs="1" maxOccurs="unbounded">
- <xs:element ref="testcase" minOccurs="0" maxOccurs="unbounded"/>
- </xs:sequence>
- </xs:sequence>
- <xs:attributeGroup ref="set_attribute_group"/>
- <xs:attribute name="launcher" type="xs:string"/>
- <xs:attribute name="set_debug_msg" type="xs:string"/>
- </xs:complexType>
- <xs:unique name="uniqueCaseName">
- <xs:selector xpath=".//testcase"/>
- <xs:field xpath="@id"/>
- </xs:unique>
- </xs:element>
- <xs:element name="testcase">
- <xs:complexType>
- <xs:sequence minOccurs="1">
- <xs:element ref="description"/>
- <xs:element name="categories" type="categories" minOccurs="0" maxOccurs="1"/>
- <xs:element name="measurement" type="measurementType" minOccurs="0" maxOccurs="unbounded"/>
- <xs:element name="series" type="seriesType" minOccurs="0" maxOccurs="unbounded"/>
- <xs:element name="specs" type="specsType" minOccurs="0" maxOccurs="1"/>
- <xs:element name="result_info" type="result_info_type" minOccurs="0"/>
- </xs:sequence>
- <xs:attributeGroup ref="case_attribute_group"/>
- </xs:complexType>
- </xs:element>
- <xs:element name="steps">
- <xs:complexType>
- <xs:sequence minOccurs="0" maxOccurs="unbounded">
- <xs:element ref="step"/>
- </xs:sequence>
- </xs:complexType>
- <xs:unique name="uniqueStepName">
- <xs:selector xpath=".//step"/>
- <xs:field xpath="@order"/>
- </xs:unique>
- </xs:element>
- <xs:attributeGroup name="set_attribute_group">
- <xs:attribute name="name" type="xs:anyURI" use="required"/>
- <xs:attribute name="type" type="xs:string"/>
- </xs:attributeGroup>
- <xs:attributeGroup name="case_attribute_group">
- <xs:attribute name="id" use="required">
- <xs:simpleType>
- <xs:restriction base="xs:string">
- <xs:minLength value="1"/>
- <xs:whiteSpace value="collapse"/>
- </xs:restriction>
- </xs:simpleType>
- </xs:attribute>
- <xs:attribute name="priority" type="priority_simple_type" use="required"/>
- <xs:attribute name="execution_type" type="execution_type_simple_type" use="required"/>
- <xs:attribute name="component" type="xs:string"/>
- <xs:attribute name="requirement_ref" type="xs:anyURI" use="optional"/>
- <xs:attribute name="status" type="status_type" use="required"/>
- <xs:attribute name="type" type="case_type_type" use="required"/>
- <xs:attribute name="purpose" type="xs:string"/>
- <xs:attribute name="result" type="xs:string"/>
- <xs:attribute name="onload_delay" type="xs:int" use="optional" default="3"/>
- </xs:attributeGroup>
- <xs:simpleType name="priority_simple_type">
- <xs:restriction base="xs:string">
- <xs:enumeration value="P0"/>
- <xs:enumeration value="P1"/>
- <xs:enumeration value="P2"/>
- <xs:enumeration value="P3"/>
- <xs:enumeration value="P4"/>
- </xs:restriction>
- </xs:simpleType>
- <xs:simpleType name="execution_type_simple_type">
- <xs:restriction base="xs:string">
- <xs:enumeration value="auto"/>
- <xs:enumeration value="manual"/>
- </xs:restriction>
- </xs:simpleType>
- <xs:simpleType name="status_type">
- <xs:restriction base="xs:string">
- <xs:enumeration value="designed"/>
- <xs:enumeration value="ready"/>
- <xs:enumeration value="approved"/>
- </xs:restriction>
- </xs:simpleType>
- <xs:simpleType name="case_type_type">
- <xs:restriction base="xs:string">
- <xs:enumeration value="functional_positive"/>
- <xs:enumeration value="functional_negative"/>
- <xs:enumeration value="security"/>
- <xs:enumeration value="performance"/>
- <xs:enumeration value="reliability"/>
- <xs:enumeration value="portability"/>
- <xs:enumeration value="maintainability"/>
- <xs:enumeration value="compliance"/>
- <xs:enumeration value="user_experience"/>
- <xs:enumeration value="undefined"/>
- </xs:restriction>
- </xs:simpleType>
- <xs:element name="purpose" type="xs:anySimpleType"/>
- <xs:element name="notes" type="xs:string"/>
- <xs:element name="pre_condition" type="xs:string"/>
- <xs:element name="post_condition" type="xs:string"/>
- <xs:element name="description">
- <xs:complexType>
- <xs:sequence minOccurs="1" maxOccurs="unbounded">
- <xs:choice minOccurs="0" maxOccurs="1">
- <xs:element ref="notes"/>
- </xs:choice>
- <xs:choice minOccurs="0" maxOccurs="1">
- <xs:element ref="pre_condition"/>
- </xs:choice>
- <xs:choice minOccurs="0" maxOccurs="1">
- <xs:element ref="post_condition"/>
- </xs:choice>
- <xs:element ref="steps" minOccurs="1" maxOccurs="1"/>
- <xs:choice minOccurs="0" maxOccurs="1">
- <xs:element ref="test_script_entry"/>
- </xs:choice>
- </xs:sequence>
- </xs:complexType>
- </xs:element>
- <xs:element name="step">
- <xs:complexType>
- <xs:sequence>
- <xs:element name="step_desc" type="xs:string"/>
- <xs:element name="expected" type="xs:string"/>
- </xs:sequence>
- <xs:attribute name="order" type="xs:int"/>
- </xs:complexType>
- </xs:element>
- <xs:element name="test_script_entry">
- <xs:complexType>
- <xs:simpleContent>
- <xs:extension base="xs:string">
- <xs:attribute name="test_script_expected_result" type="xs:string" default="0"/>
- <xs:attribute name="timeout" type="xs:int" default="90"/>
- <xs:attribute name="location" type="xs:string" default="device"/>
- </xs:extension>
- </xs:simpleContent>
- </xs:complexType>
- </xs:element>
- <xs:complexType name="result_info_type">
- <xs:sequence minOccurs="0">
- <xs:element name="actual_result" type="xs:string"/>
- <xs:element name="start" type="xs:string"/>
- <xs:element name="end" type="xs:string"/>
- <xs:element name="stdout" type="xs:string" minOccurs="0"/>
- <xs:element name="stderr" type="xs:string" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="measurementType">
- <xs:attribute name="name" type="xs:string"/>
- <xs:attribute name="value" type="xs:string"/>
- <xs:attribute name="unit" type="xs:string"/>
- <xs:attribute name="target" type="xs:string"/>
- <xs:attribute name="failure" type="xs:string"/>
- <xs:attribute name="power" type="xs:string"/>
- </xs:complexType>
- <xs:complexType name="seriesType">
- <xs:sequence>
- <xs:element name="measurement" type="simpleMeasurementType" minOccurs="1" maxOccurs="unbounded"/>
- </xs:sequence>
- <xs:attribute name="name" type="xs:string"/>
- <xs:attribute name="group" type="xs:string"/>
- <xs:attribute name="unit" type="xs:string"/>
- <xs:attribute name="interval" type="xs:string"/>
- <xs:attribute name="interval_unit" type="xs:string"/>
- <xs:attribute name="power" type="xs:string"/>
- </xs:complexType>
- <xs:complexType name="simpleMeasurementType">
- <xs:attribute name="value" type="xs:string"/>
- <xs:attribute name="file" type="xs:string"/>
- </xs:complexType>
- <xs:complexType name="categories">
- <xs:sequence>
- <xs:element name="category" type="xs:string" maxOccurs="unbounded" minOccurs="0"/>
- </xs:sequence>
- </xs:complexType>
- <xs:element name="test_definition">
- <xs:complexType>
- <xs:sequence minOccurs="1" maxOccurs="unbounded">
- <xs:element name="environment" type="BuildInfoType" minOccurs="0"/>
- <xs:element name="summary" type="summaryType" minOccurs="0"/>
- <xs:element ref="suite" minOccurs="1" maxOccurs="unbounded"/>
- </xs:sequence>
- </xs:complexType>
- <xs:unique name="uniqueSuiteName">
- <xs:selector xpath=".//suite"/>
- <xs:field xpath="@name"/>
- </xs:unique>
- </xs:element>
- <xs:complexType name="BuildInfoType">
- <xs:sequence>
- <xs:element name="other" type="xs:string"/>
- </xs:sequence>
- <xs:attribute name="device_name" type="xs:string"/>
- <xs:attribute name="device_model" type="xs:string"/>
- <xs:attribute name="os_version" type="xs:string"/>
- <xs:attribute name="device_id" type="xs:string"/>
- <xs:attribute name="firmware_version" type="xs:string"/>
- <xs:attribute name="screen_size" type="xs:string"/>
- <xs:attribute name="resolution" type="xs:string"/>
- <xs:attribute name="host" type="xs:string"/>
- <xs:attribute name="cts_version" type="xs:string"/>
- <xs:attribute name="build_id" type="xs:string"/>
- </xs:complexType>
- <xs:complexType name="summaryType">
- <xs:sequence>
- <xs:element name="start_at" type="xs:string"/>
- <xs:element name="end_at" type="xs:string"/>
- </xs:sequence>
- <xs:attribute name="test_plan_name" type="xs:string"/>
- </xs:complexType>
- <xs:complexType name="specsType">
- <xs:sequence>
- <xs:element name="spec" type="specType" maxOccurs="unbounded"/>
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="specType">
- <xs:sequence>
- <xs:element name="spec_assertion" type="spec_assertionType"/>
- <xs:element name="spec_url" type="xs:string"/>
- <xs:element name="spec_statement" type="xs:string"/>
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="spec_assertionType">
- <xs:attribute name="category" type="xs:string" use="required"/>
- <xs:attribute name="section" type="xs:string" use="required"/>
- <xs:attribute name="specification" type="xs:string" use="required"/>
- <xs:attribute name="interface" type="xs:string" use="required"/>
- <xs:attribute name="element_name" type="xs:string" use="optional"/>
- <xs:attribute name="usage" type="xs:boolean" default="false"/>
- <xs:attribute name="element_type" type="xs:string"/>
- </xs:complexType>
- <xs:complexType name="CapabilitiesType">
- <xs:sequence>
- <xs:element name="capability" type="CapabilityType" minOccurs="1" maxOccurs="unbounded"/>
- </xs:sequence>
- </xs:complexType>
- <xs:complexType name="CapabilityType">
- <xs:sequence minOccurs="0">
- <xs:element name="value" type="xs:string"/>
- </xs:sequence>
- <xs:attribute name="name" type="xs:string" use="required"/>
- </xs:complexType>
-</xs:schema>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "tests.css";
- </STYLE>
- <head>
- <script type="text/javascript" src="jquery.min.js"/>
- </head>
- <body>
- <div id="testcasepage">
- <div id="title">
- <table>
- <tr>
- <td>
- <h1>Test Cases</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="suites">
- <a name="contents"/>
- <table>
- <tr>
- <th>Test Suite</th>
- <th>Total</th>
- <th>Auto</th>
- <th>Manual</th>
- </tr>
- <tr>
- <td>
- Total
- </td>
- <td>
- <xsl:value-of select="count(test_definition/suite/set//testcase)"/>
- </td>
- <td>
- <xsl:value-of select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])"/>
- </td>
- <td>
- <xsl:value-of select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])"/>
- </td>
- </tr>
- <xsl:for-each select="test_definition/suite">
- <tr>
- <td>
- <a>
- <xsl:attribute name="href">
- #<xsl:value-of select="@name"/>
- </xsl:attribute>
- <xsl:value-of select="@name"/>
- </a>
- </td>
- <td>
- <xsl:value-of select="count(set//testcase)"/>
- </td>
- <td>
- <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])"/>
- </td>
- <td>
- <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])"/>
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </div>
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1>Detailed Test Cases</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="cases">
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name"/>
- <div id="btc">
- <a href="#contents">Back to Contents</a>
- </div>
- <div id="suite_title">
- Test Suite:
- <xsl:value-of select="@name"/>
- <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Type</th>
- <th>Component</th>
- <th>Execution Type</th>
- <th>Description</th>
- <th>Specification</th>
- </tr>
- <xsl:for-each select=".//set">
- <xsl:sort select="@name"/>
- <tr>
- <td colspan="7">
- Test Set:
- <xsl:value-of select="@name"/>
- </td>
- </tr>
- <xsl:for-each select=".//testcase">
- <!-- xsl:sort select="@id" /> -->
- <tr>
- <td>
- <xsl:value-of select="@id"/>
- </td>
- <td>
- <xsl:value-of select="@purpose"/>
- </td>
- <td>
- <xsl:value-of select="@type"/>
- </td>
- <td>
- <xsl:value-of select="@component"/>
- </td>
- <td>
- <xsl:value-of select="@execution_type"/>
- </td>
- <td>
- <p>
- Pre_condition:
- <xsl:value-of select=".//description/pre_condition"/>
- </p>
- <p>
- Post_condition:
- <xsl:value-of select=".//description/post_condition"/>
- </p>
- <p>
- Test Script Entry:
- <xsl:value-of select=".//description/test_script_entry"/>
- </p>
- <p>
- Steps:
- <p/>
- <xsl:for-each select=".//description/steps/step"><xsl:sort select="@order"/>
- Step
- <xsl:value-of select="@order"/>
- :
- <xsl:value-of select="./step_desc"/>
- ;
- <p/>
- Expected Result:
- <xsl:value-of select="./expected"/>
- <p/>
- </xsl:for-each>
- </p>
- </td>
- <td>
- <xsl:for-each select=".//specs/spec"><b>[Spec_Assertion]:</b><br/>
- [Category]:
- <xsl:value-of select="./spec_assertion/@category"/>
- <br/>
- [Section]:
- <xsl:value-of select="./spec_assertion/@section"/>
- <br/>
- [Specification]:
- <xsl:value-of select="./spec_assertion/@specification"/>
- <br/>
- [Interface]:
- <xsl:value-of select="./spec_assertion/@interface"/>
- <br/>
- <xsl:choose><xsl:when test="./spec_assertion/@element_name">
- [<xsl:value-of select="./spec_assertion/@element_type"/>]:
- <xsl:value-of select="./spec_assertion/@element_name"/>
- <br/>
- </xsl:when></xsl:choose>
- [URL]:
- <xsl:value-of select="./spec_url"/>
- <br/>
- [Statement]:
- <xsl:value-of select="./spec_statement"/>
- <br/>
- </xsl:for-each>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- </div>
- <div id="goTopBtn">
- <img border="0" src="./back_top.png"/>
- </div>
- <script type="text/javascript" src="application.js"/>
- <script language="javascript" type="text/javascript">
- $(document).ready(function(){
- goTopEx();
- });
- </script>
- </body>
- </html>
- </xsl:template>
-</xsl:stylesheet>
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
- <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
- <xsl:template match="/">
- <html>
- <STYLE type="text/css">
- @import "tests.css";
- </STYLE>
- <head>
- <script type="text/javascript" src="jquery.min.js"/>
- </head>
- <body>
- <div id="testcasepage">
- <div id="title">
- <table>
- <tr>
- <td>
- <h1>Test Report</h1>
- </td>
- </tr>
- </table>
- </div>
- <div id="device">
- <table>
- <tr>
- <th colspan="2">Device Information</th>
- </tr>
- <tr>
- <td>Device Name</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@device_name">
- <xsl:if test="test_definition/environment/@device_name = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@device_name"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Device Model</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@device_model">
- <xsl:if test="test_definition/environment/@device_model = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@device_model"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>OS Version</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@os_version">
- <xsl:if test="test_definition/environment/@os_version = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@os_version"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Device ID</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@device_id">
- <xsl:if test="test_definition/environment/@device_id = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@device_id"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Firmware Version</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@firmware_version">
- <xsl:if test="test_definition/environment/@firmware_version = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@firmware_version"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Build ID</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@build_id">
- <xsl:if test="test_definition/environment/@build_id = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@build_id"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Screen Size</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@screen_size">
- <xsl:if test="test_definition/environment/@screen_size = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@screen_size"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Resolution</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@resolution">
- <xsl:if test="test_definition/environment/@resolution = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@resolution"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Host Info</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@host">
- <xsl:if test="test_definition/environment/@host = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@host"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>CTS Version</td>
- <td>
- <xsl:choose>
- <xsl:when test="test_definition/environment/@cts_version">
- <xsl:if test="test_definition/environment/@cts_version = ''">
- N/A
- </xsl:if>
- <xsl:value-of select="test_definition/environment/@cts_version"/>
- </xsl:when>
- <xsl:otherwise>
- N/A
- </xsl:otherwise>
- </xsl:choose>
- </td>
- </tr>
- <tr>
- <td>Others</td>
- <td>
- <xsl:if test="test_definition/environment/other = ''">
- N/A
- </xsl:if>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word" select="test_definition/environment/other"/>
- </xsl:call-template>
- </td>
- </tr>
- </table>
- </div>
- <div id="summary">
- <table>
- <tr>
- <th colspan="2">Test Summary</th>
- </tr>
- <tr>
- <td>Test Plan Name</td>
- <td>
- <xsl:value-of select="test_definition/summary/@test_plan_name"/>
- </td>
- </tr>
- <tr>
- <td>Tests Total</td>
- <td>
- <xsl:value-of select="count(test_definition//suite/set/testcase)"/>
- </td>
- </tr>
- <tr>
- <td>Test Passed</td>
- <td>
- <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'PASS'])"/>
- </td>
- </tr>
- <tr>
- <td>Test Failed</td>
- <td>
- <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'FAIL'])"/>
- </td>
- </tr>
- <tr>
- <td>Test Block</td>
- <td>
- <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])"/>
- </td>
- </tr>
- <tr>
- <td>Test Not Run</td>
- <td>
- <xsl:value-of select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])"/>
- </td>
- </tr>
- <tr>
- <td>Start time</td>
- <td>
- <xsl:value-of select="test_definition/summary/start_at"/>
- </td>
- </tr>
- <tr>
- <td>End time</td>
- <td>
- <xsl:value-of select="test_definition/summary/end_at"/>
- </td>
- </tr>
- </table>
- </div>
- <div id="suite_summary">
- <div id="title">
- <a name="contents"/>
- <table>
- <tr>
- <td class="title">
- <h1>Test Summary by Suite</h1>
- </td>
- </tr>
- </table>
- </div>
- <table>
- <tr>
- <th>Suite</th>
- <th>Passed</th>
- <th>Failed</th>
- <th>Blocked</th>
- <th>Not Run</th>
- <th>Total</th>
- </tr>
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name"/>
- <tr>
- <td>
- <a>
- <xsl:attribute name="href">
- #<xsl:value-of select="@name"/>
- </xsl:attribute>
- <xsl:value-of select="@name"/>
- </a>
- </td>
- <td>
- <xsl:value-of select="count(set//testcase[@result = 'PASS'])"/>
- </td>
- <td>
- <xsl:value-of select="count(set//testcase[@result = 'FAIL'])"/>
- </td>
- <td>
- <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])"/>
- </td>
- <td>
- <xsl:value-of select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])"/>
- </td>
- <td>
- <xsl:value-of select="count(set//testcase)"/>
- </td>
- </tr>
- </xsl:for-each>
- </table>
- </div>
- <div id="fail_cases">
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1 align="center">
- Test Failures (
- <xsl:value-of select="count(test_definition/suite/set//testcase[@result = 'FAIL'])"/>
- )
- </h1>
- </td>
- </tr>
- </table>
- </div>
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name"/>
- <div id="btc">
- <a href="#contents">Back to Contents</a>
- </div>
- <div id="suite_title">
- Test Suite:
- <xsl:value-of select="@name"/>
- <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <xsl:sort select="@name"/>
- <tr>
- <td colspan="4">
- Test Set:
- <xsl:value-of select="@name"/>
- </td>
- </tr>
- <xsl:for-each select=".//testcase">
- <xsl:sort select="@id"/>
- <xsl:choose>
- <xsl:when test="@result">
- <xsl:if test="@result = 'FAIL'">
- <tr>
- <td>
- <xsl:value-of select="@id"/>
- </td>
- <td>
- <xsl:value-of select="@purpose"/>
- </td>
- <td class="red_rate">
- <xsl:value-of select="@result"/>
- </td>
- <td>
- <xsl:value-of select=".//result_info/stdout"/>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:if>
- </xsl:when>
- </xsl:choose>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- <div id="cases">
- <div id="title">
- <table>
- <tr>
- <td class="title">
- <h1 align="center">Detailed Test Results</h1>
- </td>
- </tr>
- </table>
- </div>
- <xsl:for-each select="test_definition/suite">
- <xsl:sort select="@name"/>
- <div id="btc">
- <a href="#contents">Back to Contents</a>
- </div>
- <div id="suite_title">
- Test Suite:
- <xsl:value-of select="@name"/>
- <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
- </div>
- <table>
- <tr>
- <th>Case_ID</th>
- <th>Purpose</th>
- <th>Result</th>
- <th>Stdout</th>
- </tr>
- <xsl:for-each select=".//set">
- <xsl:sort select="@name"/>
- <tr>
- <td colspan="4">
- Test Set:
- <xsl:value-of select="@name"/>
- </td>
- </tr>
- <xsl:for-each select=".//testcase">
- <xsl:sort select="@id"/>
- <tr>
- <td>
- <xsl:value-of select="@id"/>
- </td>
- <td>
- <xsl:value-of select="@purpose"/>
- </td>
- <xsl:choose>
- <xsl:when test="@result">
- <xsl:if test="@result = 'FAIL'">
- <td class="red_rate">
- <xsl:value-of select="@result"/>
- </td>
- </xsl:if>
- <xsl:if test="@result = 'PASS'">
- <td class="green_rate">
- <xsl:value-of select="@result"/>
- </td>
- </xsl:if>
- <xsl:if test="@result = 'BLOCK' ">
- <td>
- BLOCK
- </td>
- </xsl:if>
- <xsl:if test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
- <td>
- Not Run
- </td>
- </xsl:if>
- </xsl:when>
- <xsl:otherwise>
- <td>
- </td>
- </xsl:otherwise>
- </xsl:choose>
- <td>
- <xsl:value-of select=".//result_info/stdout"/>
- <xsl:if test=".//result_info/stdout = ''">
- N/A
- </xsl:if>
- </td>
- </tr>
- </xsl:for-each>
- </xsl:for-each>
- </table>
- </xsl:for-each>
- </div>
- </div>
- <div id="goTopBtn">
- <img border="0" src="./back_top.png"/>
- </div>
- <script type="text/javascript" src="application.js"/>
- <script language="javascript" type="text/javascript">
- $(document).ready(function(){
- goTopEx();
- });
- </script>
- </body>
- </html>
- </xsl:template>
- <xsl:template name="br-replace">
- <xsl:param name="word"/>
- <xsl:variable name="cr">
- <xsl:text>
- </xsl:text>
- </xsl:variable>
- <xsl:choose>
- <xsl:when test="contains($word,$cr)">
- <xsl:value-of select="substring-before($word,$cr)"/>
- <br/>
- <xsl:call-template name="br-replace">
- <xsl:with-param name="word" select="substring-after($word,$cr)"/>
- </xsl:call-template>
- </xsl:when>
- <xsl:otherwise>
- <xsl:value-of select="$word"/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-</xsl:stylesheet>
+++ /dev/null
-@charset "UTF-8";\r
-/* CSS Document */\r
-#testcasepage div,\r
-#testcasepage h1,\r
-#testcasepage p,\r
-#testcasepage table,\r
-#testcasepage tr,\r
-#testcasepage th,\r
-#testcasepage td {\r
- margin: 0;\r
- padding: 0;\r
- border: 0;\r
- font-weight: inherit;\r
- font-style: inherit;\r
- font-size: 0.96em;\r
- font-family: arial;\r
- vertical-align: baseline;\r
-}\r
-\r
-#testcasepage p {\r
- text-align: left;\r
-}\r
-\r
-#suite_title {\r
- text-align: left;\r
-}\r
-\r
-#btc {\r
- text-align: right;\r
-}\r
-\r
-#testcasepage table {\r
- border-collapse: separate;\r
- border-spacing: 0;\r
- margin-bottom: 1.4em;\r
- vertical-align: middle;\r
-}\r
-\r
-#testcasepage th,\r
-#testcasepage td {\r
- text-align: left;\r
- font-weight: normal;\r
- padding: 4px 10px 4px 5px;\r
- vertical-align: middle;\r
-}\r
-\r
-#cases table {\r
- width: 101%;\r
-}\r
-\r
-#fail_cases table {\r
- width: 101%;\r
-}\r
-\r
-#title table {\r
- width: 101%;\r
-}\r
-\r
-#device table {\r
- width: 50%;\r
-}\r
-\r
-#summary table {\r
- width: 50%;\r
-}\r
-\r
-#testcasepage th {\r
- border-bottom: 1px solid #000;\r
- background-color: #AAAAAA;\r
- border-left: 1px solid #000;\r
- border-top: 1px solid #000;\r
- color: #000;\r
- font-weight: bold;\r
- vertical-align: bottom;\r
-}\r
-\r
-#testcasepage th:last-child,\r
-#testcasepage td:last-child {\r
- border-right: 1px solid #000;\r
-}\r
-\r
-#testcasepage td {\r
- border-left: 1px solid;\r
- font-weight: normal;\r
- border-bottom: 1px solid;\r
-}\r
-\r
-#testcasepage td.yellow_rate {\r
- background-color: #ffcc00;\r
-}\r
-\r
-#testcasepage td.green_rate {\r
- background-color: #33cc33;\r
-}\r
-\r
-#testcasepage td.dgreen_rate {\r
- background-color: #339933;\r
-}\r
-\r
-#testcasepage td.red_rate {\r
- background-color: #FF3333;\r
-}\r
-\r
-#title table,\r
-#title tr,\r
-#title td {\r
- border-left: none;\r
- border-bottom: none;\r
- text-align: center;\r
-}\r
-\r
-#title td:last-child {\r
- border-right: none;\r
-}\r
-\r
-#testcasepage h1 {\r
- font-size: 2em;\r
- font-family: Arial, sans-serif;\r
- font-weight: bold;\r
- line-height: 1;\r
- color: #000;\r
- margin-bottom: 0.75em;\r
- padding-top: 0.25em;\r
- font-weight: bold;\r
-}\r
-\r
-#goTopBtn {\r
- right: 0px;\r
- bottom: 0px;\r
- position: fixed; +position: absolute;\r
- top: expression(parseInt(document.body.scrollTop) + document.body.clientHeight - 40);\r
-}\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<?xml-stylesheet type="text/xsl" href="testcase.xsl"?>
-<test_definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test_definition.xsd">
- <suite name="webapi-w3c-widget-tests">
- <set name="WidgetPackaging">
- <testcase purpose="Tests the user agent's ability to process files with no file extension. " type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="auto" priority="P3" id="dm">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</step_desc>
- <expected>To pass, the user agent start file of the widget must be index.htm</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Tizen" specification="Tizen Packaging and XML Configuration" interface="Tizen" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests the user agent's ability to process files with a file extension other than .wgt." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dn">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</step_desc>
- <expected>To pass, the user agent start file of the widget must be index.htm</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the ability of the UA to verify a zip archive." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="do">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</step_desc>
- <expected>To pass, the user agent must treat this as an invalid widget (archive is spanned).</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the user agent's ability to get a widget over HTTP and respect the application/widget mimetype. The server from which this test is served from has been set up to label the 'test' resource as an 'application/widget'." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="z3">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</step_desc>
- <expected>To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only because of sniffing).</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the user agent's ability to get a widget over HTTP and respect the 'application/widget' mimetype. The server from which this test is served from has been set up to label the 'test.html' resource as an 'application/widget'." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="z4">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</step_desc>
- <expected>To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only via sniffing).</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that an empty defaultlocale attribute is ignored (and does not cause the widget to be treated as invalid)." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore00">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</step_desc>
- <expected>To pass, the widget must simply run..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that the user agent applies rule for getting a single attribute value to the defaultlocale attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore01">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</step_desc>
- <expected> To pass, the name of the widget must be the value PASS..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that the user agent matches obscure, yet valid, language tags." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore02">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</step_desc>
- <expected> To pass, the widgets description must be the value PASS..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that a language tag already part of the UA's locales list is ignored when it is repeated for defaultlocale attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore03">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</step_desc>
- <expected>To pass, the specified value should not be added twice to the locales list of the UA..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that the default locale is added to the end of the user agent's locale list (and does not override the default language, which is assumed to be 'en')." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore04">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</step_desc>
- <expected>To pass, the name of the widget must be PASS..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that the value of defaultlocale is also used to in folder-based localization." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocuse00">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</step_desc>
- <expected>To pass, the index.html of the folder 'locales/esx-al/' should be loaded and say PASS..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that the value of defaultlocale works in conjunction to xml:lang on the widget element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocuse01">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</step_desc>
- <expected>To pass, the name of the widget must be PASS..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that the UA rejects configuration documents that don't have correct widget element at the root." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aa">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</step_desc>
- <expected> To pass, the UA must treat this as an invalid widget (the root element is not widget)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that the UA rejects configuration documents that don't have correct widget element at the root." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ab">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</step_desc>
- <expected> To pass, the UA must treat this as an invalid widget (the namespace is wrong)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that the UA rejects configuration documents that don't have correct widget element at the root." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ac">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</step_desc>
- <expected>To pass, the UA must treat this as an invalid widget (the namespace is missing)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly processes a author element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="af">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</step_desc>
- <expected>To pass, the author name must be the string "PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ag">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</step_desc>
- <expected>To pass, the widget author must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ah">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</step_desc>
- <expected>To pass, the author name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at start/end trimmed)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ai">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</step_desc>
- <expected>To pass, the author email must be the string "PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aj">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</step_desc>
- <expected>To pass, the author name must be the string "PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ak">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</step_desc>
- <expected>To pass, the author name must be the string "PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the ability of the user agent to handle an empty author element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="al">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</step_desc>
- <expected>To pass, the author name must be an empty string..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the ability of the user agent to correctly process the author href attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="am">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</step_desc>
- <expected>To pass, the value of author href must be "PASS:PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the ability of the user agent to correctly process the author href attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="an">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</step_desc>
- <expected>To pass, the value of author href must be ignored..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly processes a name element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ao">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</step_desc>
- <expected>To pass, the widget name must be the string "PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ap">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</step_desc>
- <expected>To pass, the widget name must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aq">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</step_desc>
- <expected>To pass, the widget name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at front/back trimmed)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ar">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</step_desc>
- <expected>To pass, the widget short name must be the string "PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="as">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</step_desc>
- <expected>To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="at">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</step_desc>
- <expected>To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly processes the short attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="au">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</step_desc>
- <expected>To pass, the widget short name must be an empty string..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the ability of the user agent to handle an empty name element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="av">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</step_desc>
- <expected>To pass, the widget name must be an empty string..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that a user agent correctly processes a name element with xml:lang attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="oa">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</step_desc>
- <expected>To pass, the widget name must be the string "PASS"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that the user agent does not attempt to load a default start file when a custom start file has been declared." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aw">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</step_desc>
- <expected>To pass, the widget start file must point to "pass.html" and the icons list must contain a pointer to "icon.png" at the root of the widget..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ax">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</step_desc>
- <expected>To pass, the widget height must be either the numeric value 123 or a value greater than 0..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ay">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</step_desc>
- <expected>To pass, the user agent must ignore the value of the height attribute (the value is composed of characters)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="az">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</step_desc>
- <expected>To pass, the widget height must be the numeric value 100 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a1">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</step_desc>
- <expected>To pass, the widget height must be the numeric value 123 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a2">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</step_desc>
- <expected>To pass, the widget height must be ignored (the value is an empty string, hence it would be ignored)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a3">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</step_desc>
- <expected>To pass, the widget height must be ignored (the value is a sequence of space characters, hence it would be ignored)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a4">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</step_desc>
- <expected>To pass, the widget height must be ignored (the value is an empty string)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that the UA skips preference elements without a name attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a5">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</step_desc>
- <expected>To pass, widget preferences must remain an empty list (i.e., the preference is skipped)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that the UA skips preference element already defined." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a6">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</step_desc>
- <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a7">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</step_desc>
- <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a8">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</step_desc>
- <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "true"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that the UA sets the readonly attribute to false by default." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a9">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</step_desc>
- <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test that the UA skips multiple preference element already defined." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ba">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</step_desc>
- <expected>To pass, widget preference must contain one preference whose name is "a" and whose value is "a" and whose readonly attr value must be "false"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test the UA's ability store preferences whose name vary only in case." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bb">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</step_desc>
- <expected>To pass, widget preference must contain two preferences: 1 must have a name "a" and whose value is "a" and whose readonly attr value must be "false". 2 must have a name "A" and whose value is "b" and whose readonly attribute value must be "false"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Tests that the UA applies the rule for getting a single attribute value to name, value, and readonly attributes." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bc">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</step_desc>
- <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in an arbitrary folder." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bg">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</step_desc>
- <expected>To pass, the user agent must treat this widget as an invalid widget (config file is not at the root)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- <testcase purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in a locale folder." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bh">
- <description>
- <pre_condition/>
- <post_condition/>
- <steps>
- <step order="1">
- <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</step_desc>
- <expected>To pass, the user agent must treat this widget as an invalid widget (config file is not at the root, but in locale folder)..</expected>
- </step>
- </steps>
- <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</test_script_entry>
- </description>
- <specs>
- <spec>
- <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
- <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
- <spec_statement>spec_statement</spec_statement>
- </spec>
- </specs>
- </testcase>
- </set>
- </suite>
-</test_definition>
--- /dev/null
+Dependency:
+================
+python2.7, python-pip, requests
+ sudo apt-get install python-pip
+ sudo pip install requests
+ sudo apt-get install python-dbus
+
+Change the owner and group of /opt
+ sudo chown [user]:[user] /opt
+
+How to install :
+================
+ - Install TCT from source code:
+ sudo python tct-setup.py
+
+ - Remove tct related folders in /opt
+ (** caution : all files in /opt/tct, /opt/testkit, /opt/tools will be removed)
+ sudo python tct-setup.py clean
+
+ - Upgrade the tct related folders in /opt
+ sudo python tct-setup.py upgrade
+
+How to use :
+================
+ - Set environment on your target device
+ sudo python /opt/tct/{TCTProject}/scripts/tct-config-device.py
+
+ - Execute the following command to launch TCT-Manager
+ sudo tct-mgr
+
+ - Execute the following command in order to use TCT-Shell
+ tct-shell
+
+For Windows :
+================
+ - Prerequisites
+ 1. Windows 7 - 32/64 bit
+ 2. JDK 1.7 - 32bit ( You should install 32bit version.
+ 3. python 2.7 - 32bit, should be set as environment path
+ - Please use python 2.7 version, not 3.0 - https://www.python.org/downloads/windows/
+ - python lib which should be installed
+ : install pip
+ 1. Navigate to C:\Python27\Scripts
+ 2. open command window on C:\Python27\Scripts
+ 3. $ easy_install-2.7 pip
+ : install requests
+ 1. downlaod requests source code : https://github.com/kennethreitz/requests/
+ 2. unzip source code and open command window on unziped folder
+ 3. $ python setup.py install
+
+ - Install / run in command prompt
+ (Run below scripts at the file location. You can launch the command prompt by [shift]+[mouse right click] on windows explorer)
+ 1. Install : python tct-setup.py
+ 2. Run : tct-mgr.bat
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" profile="mobile">
+ <suite name="Tizen.Accounts.Tests" category="C# Device APIs">
+ <auto_tcn>98</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>98</total_tcn>
+ <pkg_name>mobile/Tizen.Accounts.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Alarm.Tests" category="C# Device APIs">
+ <auto_tcn>27</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>27</total_tcn>
+ <pkg_name>mobile/Tizen.Alarm.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Applications.ComponentBased.ComponentManager.Tests" category="C# Device APIs">
+ <auto_tcn>26</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>26</total_tcn>
+ <pkg_name>mobile/Tizen.Applications.ComponentBased.ComponentManager.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Applications.EventManager.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>2</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>mobile/Tizen.Applications.EventManager.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Applications.EventManager.Tests" category="C# Device APIs">
+ <auto_tcn>126</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>126</total_tcn>
+ <pkg_name>mobile/Tizen.Applications.EventManager.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Applications.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>40</manual_tcn>
+ <total_tcn>40</total_tcn>
+ <pkg_name>mobile/Tizen.Applications.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Applications.Tests" category="C# Device APIs">
+ <auto_tcn>294</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>294</total_tcn>
+ <pkg_name>mobile/Tizen.Applications.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.AttachPanel.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>6</manual_tcn>
+ <total_tcn>6</total_tcn>
+ <pkg_name>mobile/Tizen.AttachPanel.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.AttachPanel.Tests" category="C# Device APIs">
+ <auto_tcn>17</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>17</total_tcn>
+ <pkg_name>mobile/Tizen.AttachPanel.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.AudioIO.Tests" category="C# Device APIs">
+ <auto_tcn>118</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>118</total_tcn>
+ <pkg_name>mobile/Tizen.AudioIO.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Badge.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>4</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>mobile/Tizen.Badge.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Badge.Tests" category="C# Device APIs">
+ <auto_tcn>29</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>29</total_tcn>
+ <pkg_name>mobile/Tizen.Badge.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Bluetooth.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>209</manual_tcn>
+ <total_tcn>209</total_tcn>
+ <pkg_name>mobile/Tizen.Bluetooth.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Bluetooth.Tests" category="C# Device APIs">
+ <auto_tcn>125</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>125</total_tcn>
+ <pkg_name>mobile/Tizen.Bluetooth.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Calendar.Tests" category="C# Device APIs">
+ <auto_tcn>112</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>112</total_tcn>
+ <pkg_name>mobile/Tizen.Calendar.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Camera.Tests" category="C# Device APIs">
+ <auto_tcn>162</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>162</total_tcn>
+ <pkg_name>mobile/Tizen.Camera.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Common.Tests" category="C# Device APIs">
+ <auto_tcn>39</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>39</total_tcn>
+ <pkg_name>mobile/Tizen.Common.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.ComponentBased.Default.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>4</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>mobile/Tizen.ComponentBased.Default.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.ComponentBased.Default.Tests" category="C# Device APIs">
+ <auto_tcn>5</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>5</total_tcn>
+ <pkg_name>mobile/Tizen.ComponentBased.Default.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.ComponentBased.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>31</manual_tcn>
+ <total_tcn>31</total_tcn>
+ <pkg_name>mobile/Tizen.ComponentBased.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.ComponentBased.Tests" category="C# Device APIs">
+ <auto_tcn>8</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>8</total_tcn>
+ <pkg_name>mobile/Tizen.ComponentBased.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Connection.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>2</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>mobile/Tizen.Connection.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Connection.Tests" category="C# Device APIs">
+ <auto_tcn>91</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>91</total_tcn>
+ <pkg_name>mobile/Tizen.Connection.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Contacts.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>2</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>mobile/Tizen.Contacts.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Contacts.Tests" category="C# Device APIs">
+ <auto_tcn>102</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>102</total_tcn>
+ <pkg_name>mobile/Tizen.Contacts.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Context.Tests" category="C# Device APIs">
+ <auto_tcn>22</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>22</total_tcn>
+ <pkg_name>mobile/Tizen.Context.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.DataControl.Tests" category="C# Device APIs">
+ <auto_tcn>112</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>112</total_tcn>
+ <pkg_name>mobile/Tizen.DataControl.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Device.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>17</manual_tcn>
+ <total_tcn>17</total_tcn>
+ <pkg_name>mobile/Tizen.Device.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Device.Tests" category="C# Device APIs">
+ <auto_tcn>30</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>30</total_tcn>
+ <pkg_name>mobile/Tizen.Device.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.DevicePolicyManager.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>15</manual_tcn>
+ <total_tcn>15</total_tcn>
+ <pkg_name>mobile/Tizen.DevicePolicyManager.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.DevicePolicyManager.Tests" category="C# Device APIs">
+ <auto_tcn>53</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>53</total_tcn>
+ <pkg_name>mobile/Tizen.DevicePolicyManager.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.DotnetUtil.Tests" category="C# Device APIs">
+ <auto_tcn>1</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>mobile/Tizen.DotnetUtil.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Download.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>1</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>mobile/Tizen.Download.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Download.Tests" category="C# Device APIs">
+ <auto_tcn>53</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>53</total_tcn>
+ <pkg_name>mobile/Tizen.Download.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.ElmSharp.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>327</manual_tcn>
+ <total_tcn>327</total_tcn>
+ <pkg_name>mobile/Tizen.ElmSharp.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.ElmSharp.Tests" category="C# Device APIs">
+ <auto_tcn>1196</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1196</total_tcn>
+ <pkg_name>mobile/Tizen.ElmSharp.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Email.Tests" category="C# Device APIs">
+ <auto_tcn>13</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>13</total_tcn>
+ <pkg_name>mobile/Tizen.Email.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Feedback.Tests" category="C# Device APIs">
+ <auto_tcn>9</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>9</total_tcn>
+ <pkg_name>mobile/Tizen.Feedback.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.FidoClient.Tests" category="C# Device APIs">
+ <auto_tcn>29</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>29</total_tcn>
+ <pkg_name>mobile/Tizen.FidoClient.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Geofence.Tests" category="C# Device APIs">
+ <auto_tcn>69</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>69</total_tcn>
+ <pkg_name>mobile/Tizen.Geofence.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Information.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>27</manual_tcn>
+ <total_tcn>27</total_tcn>
+ <pkg_name>mobile/Tizen.Information.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Information.Tests" category="C# Device APIs">
+ <auto_tcn>62</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>62</total_tcn>
+ <pkg_name>mobile/Tizen.Information.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Inputmethod.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>3</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>mobile/Tizen.Inputmethod.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Inputmethod.Tests" category="C# Device APIs">
+ <auto_tcn>84</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>84</total_tcn>
+ <pkg_name>mobile/Tizen.Inputmethod.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Inputmethodmanager.Tests" category="C# Device APIs">
+ <auto_tcn>7</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>7</total_tcn>
+ <pkg_name>mobile/Tizen.Inputmethodmanager.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.IoTConnectivityClient.Tests" category="C# Device APIs">
+ <auto_tcn>143</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>143</total_tcn>
+ <pkg_name>mobile/Tizen.IoTConnectivityClient.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.IoTConnectivityServer.Tests" category="C# Device APIs">
+ <auto_tcn>112</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>112</total_tcn>
+ <pkg_name>mobile/Tizen.IoTConnectivityServer.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Location.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>2</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>mobile/Tizen.Location.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Location.Tests" category="C# Device APIs">
+ <auto_tcn>127</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>127</total_tcn>
+ <pkg_name>mobile/Tizen.Location.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Log.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>1</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>mobile/Tizen.Log.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Log.Tests" category="C# Device APIs">
+ <auto_tcn>6</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>6</total_tcn>
+ <pkg_name>mobile/Tizen.Log.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.MachineLearning.Inference.Tests" category="C# Device APIs">
+ <auto_tcn>30</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>30</total_tcn>
+ <pkg_name>mobile/Tizen.MachineLearning.Inference.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Maps.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>23</manual_tcn>
+ <total_tcn>23</total_tcn>
+ <pkg_name>mobile/Tizen.Maps.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Maps.Tests" category="C# Device APIs">
+ <auto_tcn>224</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>224</total_tcn>
+ <pkg_name>mobile/Tizen.Maps.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.MediaCodec.Tests" category="C# Device APIs">
+ <auto_tcn>26</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>26</total_tcn>
+ <pkg_name>mobile/Tizen.MediaCodec.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.MediaController.Tests" category="C# Device APIs">
+ <auto_tcn>312</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>312</total_tcn>
+ <pkg_name>mobile/Tizen.MediaController.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.MediaKey.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>3</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>mobile/Tizen.MediaKey.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.MediaKey.Tests" category="C# Device APIs">
+ <auto_tcn>2</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>mobile/Tizen.MediaKey.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.MediaPlayer.Tests" category="C# Device APIs">
+ <auto_tcn>358</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>358</total_tcn>
+ <pkg_name>mobile/Tizen.MediaPlayer.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.MediaVision.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>4</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>mobile/Tizen.MediaVision.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.MediaVision.Tests" category="C# Device APIs">
+ <auto_tcn>380</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>380</total_tcn>
+ <pkg_name>mobile/Tizen.MediaVision.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Mediacontent.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>1</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>mobile/Tizen.Mediacontent.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Mediacontent.Tests" category="C# Device APIs">
+ <auto_tcn>811</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>811</total_tcn>
+ <pkg_name>mobile/Tizen.Mediacontent.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Messages.Tests" category="C# Device APIs">
+ <auto_tcn>33</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>33</total_tcn>
+ <pkg_name>mobile/Tizen.Messages.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Metadata.Tests" category="C# Device APIs">
+ <auto_tcn>77</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>77</total_tcn>
+ <pkg_name>mobile/Tizen.Metadata.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Mime.Tests" category="C# Device APIs">
+ <auto_tcn>4</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>mobile/Tizen.Mime.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Multimedia.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>55</manual_tcn>
+ <total_tcn>55</total_tcn>
+ <pkg_name>mobile/Tizen.Multimedia.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Multimedia.Tests" category="C# Device APIs">
+ <auto_tcn>229</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>229</total_tcn>
+ <pkg_name>mobile/Tizen.Multimedia.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.MultimediaUtil.Tests" category="C# Device APIs">
+ <auto_tcn>166</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>166</total_tcn>
+ <pkg_name>mobile/Tizen.MultimediaUtil.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.NUI.Components.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>6</manual_tcn>
+ <total_tcn>6</total_tcn>
+ <pkg_name>mobile/Tizen.NUI.Components.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.NUI.Components.Tests" category="C# Device APIs">
+ <auto_tcn>140</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>140</total_tcn>
+ <pkg_name>mobile/Tizen.NUI.Components.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.NUI.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>83</manual_tcn>
+ <total_tcn>83</total_tcn>
+ <pkg_name>mobile/Tizen.NUI.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.NUI.Tests" category="C# Device APIs">
+ <auto_tcn>2096</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>2096</total_tcn>
+ <pkg_name>mobile/Tizen.NUI.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Network.Stc.Tests" category="C# Device APIs">
+ <auto_tcn>28</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>28</total_tcn>
+ <pkg_name>mobile/Tizen.Network.Stc.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Nfc.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>35</manual_tcn>
+ <total_tcn>35</total_tcn>
+ <pkg_name>mobile/Tizen.Nfc.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Nfc.Tests" category="C# Device APIs">
+ <auto_tcn>49</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>49</total_tcn>
+ <pkg_name>mobile/Tizen.Nfc.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Nlp.Tests" category="C# Device APIs">
+ <auto_tcn>19</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>19</total_tcn>
+ <pkg_name>mobile/Tizen.Nlp.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.NotificationEventListener.Tests" category="C# Device APIs">
+ <auto_tcn>85</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>85</total_tcn>
+ <pkg_name>mobile/Tizen.NotificationEventListener.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Notifications.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>33</manual_tcn>
+ <total_tcn>33</total_tcn>
+ <pkg_name>mobile/Tizen.Notifications.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Notifications.Tests" category="C# Device APIs">
+ <auto_tcn>132</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>132</total_tcn>
+ <pkg_name>mobile/Tizen.Notifications.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Nsd.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>15</manual_tcn>
+ <total_tcn>15</total_tcn>
+ <pkg_name>mobile/Tizen.Nsd.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Nsd.Tests" category="C# Device APIs">
+ <auto_tcn>34</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>34</total_tcn>
+ <pkg_name>mobile/Tizen.Nsd.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.OAuth2.Tests" category="C# Device APIs">
+ <auto_tcn>70</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>70</total_tcn>
+ <pkg_name>mobile/Tizen.OAuth2.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Packagemanager.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>5</manual_tcn>
+ <total_tcn>5</total_tcn>
+ <pkg_name>mobile/Tizen.Packagemanager.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Packagemanager.Tests" category="C# Device APIs">
+ <auto_tcn>69</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>69</total_tcn>
+ <pkg_name>mobile/Tizen.Packagemanager.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.PhonenumberUtils.Tests" category="C# Device APIs">
+ <auto_tcn>7</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>7</total_tcn>
+ <pkg_name>mobile/Tizen.PhonenumberUtils.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.PrivacyPrivilegeManager.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>40</manual_tcn>
+ <total_tcn>40</total_tcn>
+ <pkg_name>mobile/Tizen.PrivacyPrivilegeManager.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Privilege.Tests" category="C# Device APIs">
+ <auto_tcn>19</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>19</total_tcn>
+ <pkg_name>mobile/Tizen.Privilege.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Push.Tests" category="C# Device APIs">
+ <auto_tcn>22</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>22</total_tcn>
+ <pkg_name>mobile/Tizen.Push.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Radio.Tests" category="C# Device APIs">
+ <auto_tcn>39</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>39</total_tcn>
+ <pkg_name>mobile/Tizen.Radio.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Recorder.Tests" category="C# Device APIs">
+ <auto_tcn>113</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>113</total_tcn>
+ <pkg_name>mobile/Tizen.Recorder.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.RemoteView.Tests" category="C# Device APIs">
+ <auto_tcn>17</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>17</total_tcn>
+ <pkg_name>mobile/Tizen.RemoteView.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.ScreenMirroring.Tests" category="C# Device APIs">
+ <auto_tcn>49</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>49</total_tcn>
+ <pkg_name>mobile/Tizen.ScreenMirroring.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Securerepository.Tests" category="C# Device APIs">
+ <auto_tcn>124</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>124</total_tcn>
+ <pkg_name>mobile/Tizen.Securerepository.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Sensor.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>104</manual_tcn>
+ <total_tcn>104</total_tcn>
+ <pkg_name>mobile/Tizen.Sensor.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Sensor.Tests" category="C# Device APIs">
+ <auto_tcn>221</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>221</total_tcn>
+ <pkg_name>mobile/Tizen.Sensor.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Shortcut.Tests" category="C# Device APIs">
+ <auto_tcn>70</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>70</total_tcn>
+ <pkg_name>mobile/Tizen.Shortcut.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Smartcard.Tests" category="C# Device APIs">
+ <auto_tcn>11</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>11</total_tcn>
+ <pkg_name>mobile/Tizen.Smartcard.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.StreamRecorder.Tests" category="C# Device APIs">
+ <auto_tcn>88</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>88</total_tcn>
+ <pkg_name>mobile/Tizen.StreamRecorder.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Stt.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>19</manual_tcn>
+ <total_tcn>19</total_tcn>
+ <pkg_name>mobile/Tizen.Stt.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Stt.Tests" category="C# Device APIs">
+ <auto_tcn>40</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>40</total_tcn>
+ <pkg_name>mobile/Tizen.Stt.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.SttEngine.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>25</manual_tcn>
+ <total_tcn>25</total_tcn>
+ <pkg_name>mobile/Tizen.SttEngine.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.SyncManager.Tests" category="C# Device APIs">
+ <auto_tcn>31</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>31</total_tcn>
+ <pkg_name>mobile/Tizen.SyncManager.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.System.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>3</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>mobile/Tizen.System.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.System.Tests" category="C# Device APIs">
+ <auto_tcn>17</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>17</total_tcn>
+ <pkg_name>mobile/Tizen.System.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Systemsettings.Tests" category="C# Device APIs">
+ <auto_tcn>10</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>10</total_tcn>
+ <pkg_name>mobile/Tizen.Systemsettings.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.TEEC.Tests" category="C# Device APIs">
+ <auto_tcn>10</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>10</total_tcn>
+ <pkg_name>mobile/Tizen.TEEC.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Telephony.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>13</manual_tcn>
+ <total_tcn>13</total_tcn>
+ <pkg_name>mobile/Tizen.Telephony.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Telephony.Tests" category="C# Device APIs">
+ <auto_tcn>53</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>53</total_tcn>
+ <pkg_name>mobile/Tizen.Telephony.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.ToastMessage.Tests" category="C# Device APIs">
+ <auto_tcn>3</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>mobile/Tizen.ToastMessage.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Tracer.Tests" category="C# Device APIs">
+ <auto_tcn>5</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>5</total_tcn>
+ <pkg_name>mobile/Tizen.Tracer.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Tts.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>11</manual_tcn>
+ <total_tcn>11</total_tcn>
+ <pkg_name>mobile/Tizen.Tts.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Tts.Tests" category="C# Device APIs">
+ <auto_tcn>39</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>39</total_tcn>
+ <pkg_name>mobile/Tizen.Tts.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.TtsEngine.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>22</manual_tcn>
+ <total_tcn>22</total_tcn>
+ <pkg_name>mobile/Tizen.TtsEngine.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Usb.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>4</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>mobile/Tizen.Usb.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Usb.Tests" category="C# Device APIs">
+ <auto_tcn>57</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>57</total_tcn>
+ <pkg_name>mobile/Tizen.Usb.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.VoiceControl.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>9</manual_tcn>
+ <total_tcn>9</total_tcn>
+ <pkg_name>mobile/Tizen.VoiceControl.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.VoiceControl.Tests" category="C# Device APIs">
+ <auto_tcn>64</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>64</total_tcn>
+ <pkg_name>mobile/Tizen.VoiceControl.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WatchApplication.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>17</manual_tcn>
+ <total_tcn>17</total_tcn>
+ <pkg_name>mobile/Tizen.WatchApplication.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WatchApplication.Tests" category="C# Device APIs">
+ <auto_tcn>35</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>35</total_tcn>
+ <pkg_name>mobile/Tizen.WatchApplication.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WebView.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>8</manual_tcn>
+ <total_tcn>8</total_tcn>
+ <pkg_name>mobile/Tizen.WebView.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WebView.Tests" category="C# Device APIs">
+ <auto_tcn>92</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>92</total_tcn>
+ <pkg_name>mobile/Tizen.WebView.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WiFi.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>5</manual_tcn>
+ <total_tcn>5</total_tcn>
+ <pkg_name>mobile/Tizen.WiFi.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WiFi.Tests" category="C# Device APIs">
+ <auto_tcn>101</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>101</total_tcn>
+ <pkg_name>mobile/Tizen.WiFi.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WidgetApplication.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>10</manual_tcn>
+ <total_tcn>10</total_tcn>
+ <pkg_name>mobile/Tizen.WidgetApplication.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WidgetApplication.Tests" category="C# Device APIs">
+ <auto_tcn>6</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>6</total_tcn>
+ <pkg_name>mobile/Tizen.WidgetApplication.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WidgetControl.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>5</manual_tcn>
+ <total_tcn>5</total_tcn>
+ <pkg_name>mobile/Tizen.WidgetControl.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.WidgetControl.Tests" category="C# Device APIs">
+ <auto_tcn>21</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>21</total_tcn>
+ <pkg_name>mobile/Tizen.WidgetControl.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Wifidirect.Manual.Tests" category="C# Device APIs">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>43</manual_tcn>
+ <total_tcn>43</total_tcn>
+ <pkg_name>mobile/Tizen.Wifidirect.Manual.Tests-6.0.zip</pkg_name>
+ </suite>
+ <suite name="Tizen.Wifidirect.Tests" category="C# Device APIs">
+ <auto_tcn>96</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>96</total_tcn>
+ <pkg_name>mobile/Tizen.Wifidirect.Tests-6.0.zip</pkg_name>
+ </suite>
+</ns3:testplan>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<buildinfos xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+xsi:noNamespaceSchemaLocation="buildinfo.xsd">\r
+ <buildinfo name="model" support="true" type="String">\r
+ <value>SM-Z130H</value>\r
+ </buildinfo>\r
+ <buildinfo name="manufacturer" support="true" type="String">\r
+ <value>samsung</value>\r
+ </buildinfo>\r
+ <buildinfo name="buildVersion" support="true" type="String">\r
+ <value>Z130HDDE0ANL7</value>\r
+ </buildinfo>\r
+</buildinfos>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<capabilities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+xsi:noNamespaceSchemaLocation="capability.xsd">\r
+ <capability name="http://tizen.org/feature/account" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/battery" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/bookmark" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/calendar" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/camera" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/camera.back" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/camera.back.flash" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/camera.front" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/camera.front.flash" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/contact" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/database.encryption" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/datasync" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/datacontrol" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/download" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/fmradio" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/graphics.acceleration" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/input.keyboard" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/input.keyboard.layout" support="qwerty" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/location" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/location.gps" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/location.wps" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/email" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/microphone" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/multi_point_touch.pinch_zoom" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/multi_point_touch.point_count" support="10" type="Integer">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/network.bluetooth" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.bluetooth.health" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.nfc" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.nfc.card_emulation" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.nfc.reserved_push" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.push" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.secure_element" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.telephony" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.telephony.mms" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.wifi" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.wifi.direct" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/notification" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/opengles" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/opengles.texture_format" support="etc" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/opengles.texture_format.3dc" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/opengles.texture_format.atc" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/opengles.texture_format.etc" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/opengles.texture_format.ptc" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/opengles.texture_format.pvrtc" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/opengles.texture_format.utc" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/opengles.version.1_1" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/opengles.version.2_0" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.core.api.version" support="2.3" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/platform.core.cpu.arch" support="x86" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/platform.core.cpu.arch.armv6" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.core.cpu.arch.armv7" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.core.cpu.arch.x86" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.core.fpu.arch" support="sse3" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/platform.core.fpu.arch.sse2" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.core.fpu.arch.sse3" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.core.fpu.arch.ssse3" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.core.fpu.arch.vfpv2" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.core.fpu.arch.vfpv3" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.native.api.version" support="2.3" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/platform.native.osp_compatible" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.version" support="2.3.0" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/platform.web.api.version" support="2.3" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/profile" support="MOBILE" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/screen" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.auto_rotation" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.bpp" support="32" type="Integer">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/screen.coordinate_system.size.large" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.coordinate_system.size.normal" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.dpi" support="207" type="Integer">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/screen.height" support="800" type="Integer">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/screen.output.hdmi" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.output.rca" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal.1080.1920" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal.240.400" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal.320.320" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal.320.480" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal.480.800" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal.540.960" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal.600.1024" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal.720.1280" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.width" support="480" type="Integer">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/sensor.accelerometer" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.accelerometer.wakeup" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.barometer" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.barometer.wakeup" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.gyroscope" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.gyroscope.wakeup" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.heart_rate_monitor" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.magnetometer" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.magnetometer.wakeup" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.pedometer" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.photometer" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.photometer.wakeup" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.proximity" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.proximity.wakeup" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.tiltmeter" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.tiltmeter.wakeup" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.ultraviolet" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.wrist_up" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/shell.appwidget" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sip.voip" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/speech.recognition" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/speech.synthesis" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/systemsetting" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/systemsetting.home_screen" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/systemsetting.incoming_call" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/systemsetting.lock_screen" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/systemsetting.notification_email" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/usb.accessory" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/usb.host" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/vision.face_recognition" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/vision.image_recognition" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/vision.qrcode_generation" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/vision.qrcode_recognition" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/websetting" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/system/platform.name" support="Tizen" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/archive" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/badge" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/exif" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/led" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/multimedia.transcoder" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/capability/network.bluetooth.always_on" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.bluetooth.audio.call" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.bluetooth.audio.media" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.bluetooth.hid" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.bluetooth.le" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/network.bluetooth.opp" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/platform.core.cpu.frequency" support="0" type="Integer">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/platform.version.name" support="" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/screen.size.all" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.large" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/screen.size.normal.360.480" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.activity_recognition" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.gesture_recognition" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.gravity" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.humidity" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.linear_acceleration" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.rotation_vector" support="true" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/sensor.temperature" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/system/build.date" support="2015.02.23" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/system/build.string" support="Tizen-2.3.0_Mobile-Emulator_20150223.1659" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/system/build.time" support="16:59:07" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/system/manufacturer" support="Tizen" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/system/tizenid" support="3PXV0WmJ+1caWiHvW7/s1APzFAA=" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/system/model_name" support="Emulator" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/system/platform.communication_processor" support="none" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/system/platform.processor" support="Emulator" type="String">\r
+ </capability>\r
+ <capability name="http://tizen.org/feature/web.service" support="false" type="boolean"/>\r
+ <capability name="http://tizen.org/feature/humanactivitymonitor" support="true" type="boolean"/>\r
+</capabilities>
\ No newline at end of file
--- /dev/null
+Reference : http://168.219.209.56/confluence/display/Tizen3/Running+Web+TCT+for+Tizen+3.0\r
+\r
+---------------------------------------------------------------------------------------\r
+\r
+1. Please push the below attached 2 files in the below location(target) before the test start.\r
+\r
+file name : \r
+\r
+capability.xml\r
+buildinfo.xml\r
+\r
+\r
+location :\r
+\r
+/home/owner/content/Documents/tct/\r
+\r
+\r
+ex) sdb push capability.xml /home/owner/content/Documents/tct/\r
+ex) sdb push buildinfo.xml /home/owner/content/Documents/tct/\r
+\r
+\r
+---------------------------------------------------------------------------------------\r
--- /dev/null
+URLDOWNLOAD_URL=\r
+URLDOWNLOAD_DOWNLOADURL=\r
+URLDOWNLOAD_URLWITHETAG=\r
+WIFI_WPSACCESSPOINTNAME=\r
+WIFI_EAPACCESSPOINTNAME=\r
+WIFI_ACCESSPOINTPIN=\r
+MESSAGES_MOBILE_NUMBER=\r
+EMAIL_RECIPIENT=\r
+PLAYER_DOWNLOAD_URL=\r
+PLAYER_DOWNLOAD_PROGRESS_URL=\r
+PUSH_APPID=\r
+PUSH_APPSECRET=\r
+HERE_MAPS_PROVIDER_KEY=\r
+MAPZEN_MAPS_PROVIDER_KEY=\r
--- /dev/null
+#!/usr/bin/env python
+
+import os
+import shutil
+import glob
+import time
+import sys
+import subprocess
+import string
+import ConfigParser
+from optparse import OptionParser, make_option
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = ConfigParser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+
+SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
+PKG_NAME = os.path.basename(SCRIPT_DIR)
+PARAMETERS = None
+#XW_ENV = "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket"
+SRC_DIR = DEVICE_SUITE_TARGET_30
+PKG_SRC_DIR = SRC_DIR + "/tct/opt/%s" % PKG_NAME
+
+
+def doCMD(cmd):
+ # Do not need handle timeout in this short script, let tool do it
+ print "-->> \"%s\"" % cmd
+ output = []
+ cmd_return_code = 1
+ cmd_proc = subprocess.Popen(
+ cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
+
+ while True:
+ output_line = cmd_proc.stdout.readline().strip("\r\n")
+ cmd_return_code = cmd_proc.poll()
+ if output_line == '' and cmd_return_code != None:
+ break
+ sys.stdout.write("%s\n" % output_line)
+ sys.stdout.flush()
+ output.append(output_line)
+
+ return (cmd_return_code, output)
+
+
+def updateCMD(cmd=None):
+ if "pkgcmd" in cmd:
+ cmd = "su - %s -c '%s;%s'" % (PARAMETERS.user, XW_ENV, cmd)
+ return cmd
+def getUSERID():
+ if PARAMETERS.mode == "SDB":
+ cmd = "sdb -s %s shell id -u %s" % (
+ PARAMETERS.device, PARAMETERS.user)
+ else:
+ cmd = "ssh %s \"id -u %s\"" % (
+ PARAMETERS.device, PARAMETERS.user )
+ return doCMD(cmd)
+
+
+
+
+def getPKGID(pkg_name=None):
+ if PARAMETERS.mode == "SDB":
+ cmd = "sdb -s %s shell %s" % (
+ PARAMETERS.device, updateCMD('pkgcmd -l'))
+ else:
+ cmd = "ssh %s \"%s\"" % (
+ PARAMETERS.device, updateCMD('pkgcmd -l'))
+
+ (return_code, output) = doCMD(cmd)
+ if return_code != 0:
+ return None
+
+ test_pkg_id = None
+ for line in output:
+ if line.find("[" + pkg_name + "]") != -1:
+ pkgidIndex = line.split().index("pkgid")
+ test_pkg_id = line.split()[pkgidIndex+1].strip("[]")
+ break
+ return test_pkg_id
+
+
+def doRemoteCMD(cmd=None):
+ if PARAMETERS.mode == "SDB":
+ cmd = "sdb -s %s shell %s" % (PARAMETERS.device, updateCMD(cmd))
+ else:
+ cmd = "ssh %s \"%s\"" % (PARAMETERS.device, updateCMD(cmd))
+
+ return doCMD(cmd)
+
+
+def doRemoteCopy(src=None, dest=None):
+ if PARAMETERS.mode == "SDB":
+ cmd_prefix = "sdb -s %s push" % PARAMETERS.device
+ cmd = "%s %s %s" % (cmd_prefix, src, dest)
+ else:
+ cmd = "scp -r %s %s:/%s" % (src, PARAMETERS.device, dest)
+
+ (return_code, output) = doCMD(cmd)
+ doRemoteCMD("sync")
+
+ if return_code != 0:
+ return True
+ else:
+ return False
+
+
+def uninstPKGs():
+ action_status = True
+ (return_code, output) = doRemoteCMD("rm " + \
+ SRC_DIR + "/tct/preconfigure.json")
+ (return_code, output) = doRemoteCMD("rm " + \
+ SRC_DIR + "/tct/portconfigure.json")
+
+ for file in ['preconfigure.json', 'tests.xml', 'tct-testconfig.ini', 'portconfigure.json', 'TC_Config.txt']:
+ (return_code, output) = doRemoteCMD("rm %s/%s" % (PKG_SRC_DIR, file))
+ if return_code != 0:
+ action_status = False
+ break
+
+ return action_status
+
+def instPKGs():
+ action_status = True
+ (return_code, output) = doRemoteCMD("mkdir -p %s" % PKG_SRC_DIR)
+
+ for file in ['preconfigure.json', 'tests.xml', 'tct-testconfig.ini', 'portconfigure.json', 'TC_Config.txt']:
+ if not doRemoteCopy(SCRIPT_DIR + '/' + file, "%s/%s" % (PKG_SRC_DIR, file)):
+ action_status = False
+
+ return action_status
+
+def main():
+ try:
+ usage = "usage: inst.py -i"
+ opts_parser = OptionParser(usage=usage)
+ opts_parser.add_option(
+ "-m", dest="mode", action="store", help="Specify mode")
+ opts_parser.add_option(
+ "-s", dest="device", action="store", help="Specify device")
+ opts_parser.add_option(
+ "-i", dest="binstpkg", action="store_true", help="Install package")
+ opts_parser.add_option(
+ "-u", dest="buninstpkg", action="store_true", help="Uninstall package")
+ opts_parser.add_option(
+ "-a", dest="user", action="store", help="User name")
+ global PARAMETERS
+ (PARAMETERS, args) = opts_parser.parse_args()
+ except Exception, e:
+ print "Got wrong option: %s, exit ..." % e
+ sys.exit(1)
+
+ if not PARAMETERS.user:
+ PARAMETERS.user = "owner"
+ if not PARAMETERS.mode:
+ PARAMETERS.mode = "SDB"
+
+ if PARAMETERS.mode == "SDB":
+ if not PARAMETERS.device:
+ (return_code, output) = doCMD("sdb devices")
+ for line in output:
+ if str.find(line, "\tdevice") != -1:
+ PARAMETERS.device = line.split("\t")[0]
+ break
+ else:
+ PARAMETERS.mode = "SSH"
+
+ if not PARAMETERS.device:
+ print "No device provided"
+ sys.exit(1)
+
+ user_info = getUSERID()
+ re_code = user_info[0]
+ if re_code == 0 :
+ global XW_ENV
+ userid = user_info[1][0]
+ XW_ENV = "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket"%str(userid)
+ else:
+ print "[Error] cmd commands error : %s"%str(user_info[1])
+ sys.exit(1)
+ if PARAMETERS.binstpkg and PARAMETERS.buninstpkg:
+ print "-i and -u are conflict"
+ sys.exit(1)
+
+ if PARAMETERS.buninstpkg:
+ if not uninstPKGs():
+ sys.exit(1)
+ else:
+ if not instPKGs():
+ sys.exit(1)
+
+if __name__ == "__main__":
+ main()
+ sys.exit(0)
+
--- /dev/null
+[{"STUB_PORT":"8000"}]
--- /dev/null
+[{
+ "MESSAGES_MOBILE_NUMBER":"01012345678",
+ "BT_REMOTE_DEVICE_ADDRESS":"127.0.0.1",
+ "BT_REMOTE_DEVICE_NAME":"localhost",
+ "BT_REMOTE_HEALTH_DEVICE_ADDRESS":"127.0.0.1",
+ "BT_REMOTE_HEALTH_DEVICE_NAME":"localhost",
+ "BT_REMOTE_BLE_DEVICE_ADDRESS":"AA:AA:AA:AA:AA:AA",
+ "BT_REMOTE_HID_DEVICE_ADDRESS":"AA:AA:AA:AA:AA:AA",
+ "BT_REMOTE_OPP_DEVICE_ADDRESS":"AA:AA:AA:AA:AA:AA",
+ "BT_REMOTE_DEVICE_ADDRESS":"AA:AA:AA:AA:AA:AA",
+ "EMAIL_RECIPIENT_1":"123@intel.com",
+ "EMAIL_RECIPIENT_2":"456@intel.com",
+ "MMS_RECIPIENT_1":"123456789",
+ "MMS_RECIPIENT_2":"987654321",
+ "SMS_RECIPIENT_1":"123456789",
+ "SMS_RECIPIENT_2":"987654321",
+ "CHANNEL_MAJOR":11,
+ "CHANNEL_MINOR":1,
+ "CHANNEL_MAJOR_2":7,
+ "CHANNEL_MINOR_2":1,
+ "DATE_FORMAT":"D, d M y",
+ "TIME_FORMAT":"h:m:s ap",
+ "PUBLIC_AP":"Set available public AP name",
+ "PRIVATE_AP_1_2":"Set available private AP name 1",
+ "PRIVATE_AP_2_2":"Set available private AP name 2",
+ "HIDDEN_AP":"Set available hidden AP name",
+ "PASSWORD_FOR_ALL_PRIVATE_AP":"Set common password of all private APs",
+ "PUBLIC_AP":"Set available public AP name",
+ "PRIVATE_AP":"Set available private AP name",
+ "PRIVATE_AP_1_2":"Set available private AP name 1",
+ "PRIVATE_AP_2_2":"Set available private AP name 2",
+ "HIDDEN_AP":"Set available hidden AP name",
+ "PASSWORD_FOR_ALL_PRIVATE_AP":"Set common password of all private APs",
+ "WPS_PBC_AP":"Set name of available AP with WPS PBC function",
+ "WPS_PIN_AP":"Set name of available AP with WPS PIN function",
+ "PIN_NUMBER_OF_WPS_PIN_AP":"Set pin number of WPS_PIN_AP. The pin number should be generated with the checksum defined in WSC spec (Wi-Fi Simple Configuration Technical Specification). If you are not familiar with it, please use an example number, 47363533.",
+ "STREAMING_URI":"Set the streaming uri such as http://www.samsung.com/xx/xx/aa.mp4",
+ "ADAPTIVE_STREAMING_URL":"Set the adaptive streaming url"
+}]
--- /dev/null
+# Bluetooth test settings
+#[tct-bluetooth-tizen-tests]
+# The address of the device on which tct-bt-helper will be run
+#BT_REMOTE_DEVICE_ADDRESS=your BT remote device address
+# The name of the device on which tct-bt-helper will be run
+#BT_REMOTE_DEVICE_NAME=your BT remote device name
+#BT_REMOTE_HEALTH_DEVICE_ADDRESS=your BT remote health device address
+# The name of the device on which tct-bt-helper will be run
+#BT_REMOTE_HEALTH_DEVICE_NAME=your BT remote health device name
+# The name of the device on which tct-bt-helper will be run
+#BT_REMOTE_BLE_DEVICE_ADDRESS=your BT remote BLE device address
+
+# Bluetooth precondition settings
+[Tizen.Bluetooth.Tests]
+BT_REMOTE_DEVICE_ADDRESS=Set remote BT device address. (AA:AA:AA:AA:AA:AA)
+
+[Tizen.Bluetooth.Manual.Tests]
+BT_REMOTE_BLE_DEVICE_ADDRESS=Set remote BLE device address. (AA:AA:AA:AA:AA:AA)
+BT_REMOTE_HID_DEVICE_ADDRESS=Set remote HID device address. (AA:AA:AA:AA:AA:AA)
+BT_REMOTE_OPP_DEVICE_ADDRESS=Set remote OPP device address. (AA:AA:AA:AA:AA:AA)
+BT_REMOTE_DEVICE_ADDRESS=Set remote device address. (AA:AA:AA:AA:AA:AA)
+
+# WiFi test settings
+[Tizen.WiFi.Tests]
+PRIVATE_AP_1_2=Set available private AP name 1
+PRIVATE_AP_2_2=Set available private AP name 2
+HIDDEN_AP=Set available hidden AP
+PASSWORD_FOR_ALL_PRIVATE_AP=Set common password of all private APs
+
+# WiFi manual settings
+[Tizen.WiFi.Manual.Tests]
+WPS_PBC_AP=Set name of available AP with WPS PBC function
+WPS_PIN_AP=Set name of available AP with WPS PIN function
+PIN_NUMBER_OF_WPS_PIN_AP=Set pin number of WPS_PIN_AP
+
+# Connection test settings
+[Tizen.Connection.Tests]
+PUBLIC_AP=Set available public AP name
+PRIVATE_AP=Set available private AP name
+PASSWORD_FOR_ALL_PRIVATE_AP=Set common password of all private APs
+
+# Map test key settings
+[Tizen.Maps.Tests]
+HERE_MAPS_PROVIDER_KEY=Set the HERE_MAPS_PROVIDER_KEY
+
+# Map.Manual test key settings
+[Tizen.Maps.Manual.Tests]
+HERE_MAPS_PROVIDER_KEY=Set the HERE_MAPS_PROVIDER_KEY
+
+[Tizen.Messages.Tests]
+MESSAGES_MOBILE_NUMBER=You should write only number. Do NOT write - or ()
+
+# MediaPlayer test key settings
+[Tizen.MediaPlayer.Tests]
+STREAMING_URI = set the uri in here. ex>http://www.samsung.com/xx/xx/aa.mp4
+ADAPTIVE_STREAMING_URL = set the url in here
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
+<test_definition>
+ <suite name="tct-testconfig">
+ <set name="tct-bluetooth-tizen-tests">
+ <testcase execution_type="manual" id="BluetoothConfiguration" purpose="tct-bluetooth-tizen-tests configuration" status="approved" type="compliance">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>The 'tct-bt-helper' web application MUST be installed on the remote device whose address is REMOTE_DEVICE_ADDRESS.
+The tct-bt-helper is included in the tct-bluetooth-tizen-tests package. Install the tct-bluetooth-tizen-tests package on both your test device and the remote Bluetooth device.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Turn on the Bluetooth of your test device and the remote device. Make the two devices discoverable to each other.</step_desc>
+ </step>
+ <step order="3">
+ <step_desc>Before manual testing, launch the 'tct-bt-helper' web application installed on the remote device, click 'Register service' on the 'tct-bt-helper', and then execute the TCs tests manually.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="tct-callhistory-tizen-tests">
+ <testcase purpose="tct-callhistory-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="CallHistoryConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Make sure the telephony works well.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="2">
+ <step_desc>Insert a SIM card and enable the cellular device service on your test device. During manual testing, you can see the preconditions for each test.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-datacontrol-tizen-tests">
+ <testcase purpose="tct-datacontrol-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="DataControlConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc> Create the sample native application using Tizen SDK. You can find this native application in the installation directory.
+ In Tizen SDK, select 'File' -> 'Import' -> 'Tizen' -> 'Tizen Native Project' -> 'Select archive file' -> 'select datacontrolprovider.zip in the /opt/tct/tizen_web_2.4/resource/'.
+ </step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="2">
+ <step_desc> Build and sign this native application with the same certification which you sign the 'tct-datacontrol-tizen-tests' package with.
+ </step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="3">
+ <step_desc> Launch this native application(No UI).</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-download-tizen-tests">
+ <testcase purpose="tct-download-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="DownloadConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established. If your device supports Wi-Fi, turn on Wi-Fi. If your device supports telephony, insert a SIM card and enable the cellular data service on your test device. During manual testing, you can see the preconditions for each test.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-camera-nonw3c-tests">
+ <testcase purpose="tct-camera-nonw3c-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="CameraConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Make sure device camera is working well.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-fmradio-tizen-tests">
+ <testcase purpose="tct-fmradio-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="FMRadioConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>The antenna(earphones) is nessasary to test this module. please put antenna(earphones) jack into device.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-messaging-email-tizen-tests">
+ <testcase purpose="tct-messaging-email-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="MessagingConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>There MUST be established Network connection for sending and receiving email tests (preferably through WiFi as it has smaller delays on connection)</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="2">
+ <step_desc>Add an account through Settings application.
+ (Settings -> Personal / Accounts)
+ 2.1 Click "Add"
+ 2.1 Select type of account: Email
+ 2.2 Enter e-mail address and password (preferably Gmail account)
+ 2.3 Click "Next" - configuration will be verified and stored</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="3">
+ <step_desc>There MUST be several email messages in your mailbox to be used for searching and removing messages tests</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="4">
+ <step_desc>There MUST be exactly one email service configured on the device.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="5">
+ <step_desc>EMAIL_RECIPIENT_1 is the e-mail address of the account You have set up on the device</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="6">
+ <step_desc>EMAIL_RECIPIENT_2 is any valid e-mail address different from EMAIL_RECIPIENT_1</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-messaging-mms-tizen-tests">
+ <testcase purpose="tct-messaging-mms-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="MessagingConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>A SIM card MUST be inserted for sending MMS messages.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="2">
+ <step_desc>MMS_RECIPIENT_1 is any valid phone number (without country code prefix). You should not use a number of the SIM card inserted into test device.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="3">
+ <step_desc>MMS_RECIPIENT_2 is any valid phone number, different from MMS_RECIPIENT_1 (without country code prefix)</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-messaging-sms-tizen-tests">
+ <testcase purpose="tct-messaging-sms-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="MessagingConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>A SIM card MUST be inserted for sending SMS messages.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="2">
+ <step_desc>SMS_RECIPIENT_1 is any valid phone number (without country code prefix). You should not use a number of the SIM card you in test device.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="3">
+ <step_desc>SMS_RECIPIENT_2 is any valid phone number, different from SMS_RECIPIENT_1 (without country code prefix)</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-nfc-tizen-tests">
+ <testcase purpose="tct-nfc-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="NFCConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Manual tests requires a NFC tag (which supports NDEF) and a NFC enabled device to connect your test device with.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="2">
+ <step_desc>Enable NFC on your test device and the NFC device you will connect to.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-time-tizen-tests">
+ <testcase purpose="tct-time-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="TimeConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Before executing manual and auto time test, must set current time, language, region, and time must be as follows:</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="2">
+ <step_desc>'Time zone' MUST be set as Seoul.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="3">
+ <step_desc>Set the current time correctly.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="4">
+ <step_desc>'Display language' MUST be set as English.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="5">
+ <step_desc>'Region' MUST be set as English(following time format D, M d y ).</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="6">
+ <step_desc>Time format MUST be set as AM/PM format,</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-power-tizen-tests">
+ <testcase purpose="tct-power-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="PowerConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Turn off Automatic screen brightness (pull down the notification panel and ensure that Auto is disabled)</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <steps>
+ <step order="2">
+ <step_desc>Set Backlight time to 15 seconds (Settings -> Display -> Backlight time -> 15 seconds)</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-push-tizen-tests">
+ <testcase purpose="tct-push-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="PushConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-networkbearerselection-tizen-tests">
+ <testcase purpose="tct-networkbearerselection-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="NetworkbearerselectionConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Make sure the telephony works well.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="2">
+ <step_desc>Insert a SIM card and enable cellular data service on your test device.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-geoallow-w3c-tests">
+ <testcase purpose="tct-geoallow-w3c-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="GeoallowConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Enable GPS or connect to an available network</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ <set name="tct-tv-channel-tizen-tests">
+ <testcase purpose="tct-tv-channel-tizen-tests Configuration" type="compliance" status="approved" component="WebAPI/Tizen/Configuration" execution_type="manual" priority="P0" id="TVChannelConfiguration">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Set Major and Minor channel number</step_desc>
+ <expected>TBD</expected>
+ </step>
+ <step order="2">
+ <step_desc>Set Major_2 and Minor_2 channel number</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry timeout="90" test_script_expected_result="0"/>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="TBD" element_name="TBD" interface="TBD" specification="TBD" section="TBD" category="TBD"/>
+ <spec_url>TBD</spec_url>
+ <spec_statement>TBD</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ </suite>
+</test_definition>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
+<test_definition>
+ <suite name="tct-testconfig">
+<!-- <set name="tct-bluetooth-tizen-tests">
+ <testcase execution_type="manual" id="Bluetoothconfiguration" purpose="tct-bluetooth-tizen-tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>The 'tct-bt-helper' web application MUST be installed on the remote device whose address is REMOTE_DEVICE_ADDRESS.
+The tct-bt-helper is included in the tct-bluetooth-tizen-tests package. Install the tct-bluetooth-tizen-tests package on both your test device and the remote Bluetooth device.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Turn on the Bluetooth of your test device and the remote device. Make the two devices discoverable to each other.</step_desc>
+ </step>
+ <step order="3">
+ <step_desc>Before manual testing, launch the 'tct-bt-helper' web application installed on the remote device, click 'Register service' on the 'tct-bt-helper', and then execute the TCs tests manually.</step_desc>
+ </step>
+ <step order="4">
+ <step_desc>BLE test device should have at least one characteristic and descriptor information which is writable in its bluetooth low energy service.</step_desc>
+ <expected>TBD</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>-->
+
+
+<!--Add -->
+ <set name="Tizen.Bluetooth.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Bluetoothconfiguration" purpose="Tizen.Bluetooth.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>Set the remote address of the Bluetooth device which you are going to use for testing.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Recommends to use Tizen mobile phone for testing.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="Tizen.Bluetooth.Manual.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="BluetoothManualconfiguration" purpose="Tizen.Bluetooth.Manual.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>Set the remote address of the BLE(Bluetooth Low Energy) device which you are going to use for testing.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Set the remote address of the HID(Human Interface Device) device which you are going to use for testing.</step_desc>
+ </step>
+ <step order="3">
+ <step_desc>Set the remote address of the OPP(Object Push Profile) device which you are going to use for testing.</step_desc>
+ </step>
+ <step order="4">
+ <step_desc>Set the remote address of the device which you are going to use for testing.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="Tizen.System.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Systemconfiguration" purpose="Tizen.System.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>SDCard/USB(External storage) should be inserted on target</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="Tizen.Packagemanager.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Packagemanagerconfiguration" purpose="Tizen.Packagemanager.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>SdCard should be inserted on target.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="Tizen.Download.Manual.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Downloadmanualconfiguration" purpose="Tizen.Download.Manual.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="Tizen.Download.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Downloadconfiguration" purpose="Tizen.Download.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="Tizen.Maps.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Mapsconfiguration" purpose="Tizen.Maps.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Set the HERE_MAPS_PROVIDER_KEY configure (appid/app_code).</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.Maps.Manual.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Mapsconfiguration" purpose="Tizen.Maps.Manual.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Set the HERE_MAPS_PROVIDER_KEY configure (appid/app_code).</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.PrivacyPrivilegeManager.Manual.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Mapsconfiguration" purpose="Tizen.PrivacyPrivilegeManager.Manual.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>There should be no '/opt/share/askuser_disable' file on the target</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+<!--
+ <set name="tct-iotconnectivity-client-tizen-tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="IoTClientconfiguration" purpose="tct-iotconnectivity-client-tizen-tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="tct-iotconnectivity-server-tizen-tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="IoTServerconfiguration" purpose="tct-iotconnectivity-server-tizen-tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+-->
+<!--End -->
+
+ <set name="Tizen.Stt.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Sttconfiguration" purpose="Tizen.Stt.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>In case of TV profile, connect a bluetooth remote controller which has mic.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="Tizen.VoiceControl.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="VoiceControlconfiguration" purpose="Tizen.VoiceControl.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>In case of TV profile, connect a bluetooth remote controller which has mic.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="Tizen.Push.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Pushconfiguration" purpose="Tizen.Push.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ <set name="Tizen.WiFi.Manual.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="WiFiconfiguration" purpose="Tizen.WiFi.Manual.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>Set name of available AP with WPS PBC function.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Set name of available AP with WPS PIN function.</step_desc>
+ </step>
+ <step order="3">
+ <step_desc>Set pin number of WPS_PIN_AP to PIN_NUMBER_WPS_PIN_AP. The pin number should be generated with the checksum defined in WSC spec (Wi-Fi Simple Configuration Technical Specification). The length of WPS PIN number should be 4 or 8. If you are not familiar with it, please use an example number, 47363533.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.Messages.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Messagesconfiguration" purpose="Tizen.Messages.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>Insert the available SIM Card into SIM slot 1.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Set the MESSAGES_MOBILE_NUMBER configure.(example>01012345678)</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.Device.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Deviceconfiguration" purpose="Tizen.Device.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>Charger should be connected to test target.(In case of Emulator, you have to set with control panel.) </step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.Email.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Emailconfiguration" purpose="Tizen.Email.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Set the email account on your device. Settings > Accounts > Email > Set created accounts.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.SyncManager.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="SyncManagerconfiguration" purpose="Tizen.SyncManager.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.SyncManager.Manual.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="SyncManagerManualconfiguration" purpose="Tizen.SyncManager.Manual.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>A network connection capable of accessing the Internet MUST be established.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.Wifidirect.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Wifidirectconfiguration" purpose="Tizen.Wifidirect.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>You should have two additional devices which are connected to each other via wifi-direct. (Used to get the status of connected devices.) </step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.WiFi.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="WiFiconfiguration" purpose="Tizen.WiFi.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>Set available private AP name 1.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Set available private AP name 2.</step_desc>
+ </step>
+ <step order="3">
+ <step_desc>Set available hidden AP name.</step_desc>
+ </step>
+ <step order="4">
+ <step_desc>Set common password of all private APs.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.Connection.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="Connectionconfiguration" purpose="Tizen.Connection.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc>Set available public AP name.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc>Set available private AP name.</step_desc>
+ </step>
+ <step order="3">
+ <step_desc>Set common password of all private APs.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.MediaPlayer.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="MediaPlayerconfiguration" purpose="Tizen.MediaPlayer.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc> Set the streaming uri such as http://www.samsung.com/xx/xx/aa.mp4.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc> Set the adaptive streaming url.</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.WebView.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="WebViewconfiguration" purpose="Tizen.WebView.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc> Target has to connect to internet</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+
+ <set name="Tizen.Usb.Tests">
+ <testcase component="WebAPI/Tizen/configuration" execution_type="manual" id="WebViewconfiguration" purpose="Tizen.Usb.Tests configuration">
+ <description>
+ <steps>
+ <step order="1">
+ <step_desc> The usb-host emulation driver MUST be loaded before testing.</step_desc>
+ </step>
+ <step order="2">
+ <step_desc> $ devicectl usb-host-test start</step_desc>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0" timeout="90"/>
+ </description>
+ </testcase>
+ </set>
+ </suite>
+</test_definition>
+
--- /dev/null
+#!/usr/bin/python
+
+from sdbmanager import SdbManager
+
+class DeviceManager(object):
+ INSTANCE = None
+ devices = []
+
+ def __init__(self):
+ if DeviceManager.INSTANCE is not None:
+ raise Exception('DeviceManager instance already exists')
+
+ @classmethod
+ def getInstance(cls):
+ if cls.INSTANCE is None:
+ cls.INSTANCE = DeviceManager()
+ if len(cls.INSTANCE.devices) < 1:
+ cls.INSTANCE.loadDeviceList()
+ return cls.INSTANCE
+
+ def _updateConnDevice(self, connDevices):
+ self._resetDevices()
+
+ for dev in connDevices:
+ self.devices.append(dev)
+
+ def _resetDevices(self):
+ listSize = len(self.devices)
+ del self.devices[0:listSize]
+
+ def isDeviceAvailable(self, deviceId):
+ if len(self.devices) < 1:
+ return False
+ else:
+ devs = self.getSdbDeviceList()
+ for dev in devs:
+ devId = dev.getDeviceId()
+ if devId == deviceId:
+ return True
+ return False
+
+ def getDeviceSize(self):
+ return len(self.devices)
+
+ def getSdbDeviceList(self):
+ return self.devices
+
+ def getDevice(self, deviceId):
+ for dev in self.devices:
+ if dev.getDeviceId() == deviceId:
+ return dev
+
+ print "#ERROR#: The '%s' device Id exists error" % deviceId
+ return None
+
+ def loadDeviceList(self):
+ connDevices = []
+ sdbOutLog = SdbManager.sdbDevices()
+ devicesInfo = sdbOutLog.replace("List of devices attached", "")
+ devList = devicesInfo.split('\n')
+
+ for dev in devList:
+ if len(dev) > 1:
+ devInfoItem = dev.split('\t')
+ devId = devInfoItem[0].rstrip()
+ devType = devInfoItem[1].rstrip()
+ devName = devInfoItem[2].rstrip()
+ if not (devType == "unknown" or devType == "offline" \
+ or devId == "unknown" or devId == "offline"):
+ connDevices.append(SdbDevice(devId, devName, devType))
+
+ if len(connDevices) > 0:
+ self._updateConnDevice(connDevices)
+ print "Connected Devices = %s" \
+ % str([dev.devId for dev in self.devices])
+ return True
+ else:
+ self._resetDevices()
+ return False
+
+class SdbDevice:
+ def __init__(self, devId, devName, devType):
+ self.devId = devId
+ self.devName = devName
+ self.devType = devType
+
+ def _printDevInfo(self):
+ print "===== Device Infomation ====="
+ print " Name : " + self.devName
+ print " Id : " + self.devId
+ print " Type : " + self.devType
+ print "============================="
+
+ def getDeviceId(self):
+ return self.devId
+
+ def getDeviceName(self):
+ return self.devName
+
+ def getDeviceType(self):
+ return self.devType
--- /dev/null
+[HealthCheck]
+step1=checking widget getCap,getCap,10
+step2=checking process testkit-stub,testkit-stub,5
+step3=checking testconfig tool,testconfig,2
+step4=checking widget storage,storage,10
--- /dev/null
+#!/usr/bin/python
+
+import subprocess
+import time
+import os
+import platform
+import re
+import signal
+import ctypes
+
+SDB_PUSH = "sdb -s %s push"
+SDB_SHELL = "sdb -s %s shell"
+SDB_ROOT_ON = "sdb -s %s root on"
+SDB_DEVICES = "sdb devices"
+SDB_START_SERVER = "sdb start-server"
+SDB_KILL_SERVER = "sdb kill-server"
+SDB_CONNECT = "sdb connect %s"
+SDB_PULL = "sdb -s %s pull"
+SDB_CAT_CONFIG = " cat %s"
+SDB_LS = "sdb -s %s shell ls -al"
+FILE_FOUND_SCRIPT = "[ -f %s ] && echo \"Found\" || echo \"Not Found\""
+
+class SdbManager:
+
+ @staticmethod
+ def hostCommand(command):
+ print command
+ proc = subprocess.Popen(command, shell=True, \
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ while True:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+
+ output = proc.stdout.read()
+ if output:
+ print output
+
+ errlog = proc.stderr.read()
+ if errlog:
+ print errlog
+
+ return True
+
+ @staticmethod
+ def hostCommandwithResult(command):
+ print command
+ proc = subprocess.Popen(command, shell=True, \
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ while True:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+
+ return proc.stdout.read()
+
+ @staticmethod
+ def sdbCommand(command, timeout=90):
+ print command
+ proc = subprocess.Popen(command,
+ shell=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ time_out = 0
+ exit_code = None
+ while time_out < timeout:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+ time_out += 0.5
+ time.sleep(0.5)
+ if exit_code is None:
+ SdbManager.killall(proc.pid)
+
+ return exit_code, proc.stdout, proc.stderr
+
+ @staticmethod
+ def _checkDevIdExists(_devid):
+ if len(_devid) < 0:
+ print "#ERROR#: The '%s' device Id exists error" % _devid
+ return False
+ return True
+
+ @staticmethod
+ def _checkFileExists(aPath):
+ if os.path.exists(aPath):
+ return True
+ else:
+ return False
+
+ @staticmethod
+ def sdbPush(_devid, local, remote):
+ if SdbManager._checkFileExists(local) is False:
+ print '#WARNING#: The %s file exists error' % local
+ return False
+
+ FAIL_LOG = "#ERROR#: sdb push failed"
+ SdbManager._checkDevIdExists(_devid)
+ push_cmd = SDB_PUSH % _devid + " " + local + " " + remote
+ exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(push_cmd)
+
+ if exit_code is None:
+ print FAIL_LOG
+ errLog = re_stderr.read()
+ if errLog: print errLog
+ return False
+ else:
+ print re_stdout.read()
+ return True
+
+ @staticmethod
+ def sdbShell(deviceId, cmd, timeout=90):
+ SdbManager._checkDevIdExists(deviceId)
+ shell_cmd = SDB_SHELL % deviceId + " " + cmd
+ FAIL_LOG = "#ERROR#: sdb shell failed"
+ exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(shell_cmd, timeout)
+
+ if exit_code is None:
+ print FAIL_LOG
+ errLog = re_stderr.read()
+ if errLog : print errLog
+ return None
+ else:
+ outLog = re_stdout.read()
+ errLog = re_stderr.read()
+ if errLog:
+ print FAIL_LOG
+ print errLog
+ return None
+ if outLog:
+ print outLog
+ return outLog
+
+ @staticmethod
+ def sdbRootOn(deviceId):
+ SdbManager._checkDevIdExists(deviceId)
+ FAIL_LOG = "#ERROR#: sdb root on failed"
+ is_pass = False
+ root_cmd = SDB_ROOT_ON % deviceId
+ exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(root_cmd, 20)
+
+ if exit_code is None:
+ print FAIL_LOG
+ errLog = re_stderr.read()
+ if errLog: print (str(errLog))
+
+ checkLog = SdbManager.sdbShell(deviceId, 'whoami')
+ if checkLog and checkLog.find('root') != -1:
+ print 'SDB ROOT ON'
+ is_pass = True
+ else:
+ print FAIL_LOG
+ print str(checkLog)
+
+ return is_pass
+
+ @staticmethod
+ def sdbDevices():
+ dev_cmd = SDB_DEVICES
+ start_server_cmd = SDB_START_SERVER
+ SdbManager.sdbCommand(start_server_cmd, 8)
+ exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(dev_cmd, 20)
+ if exit_code is None:
+ print "#ERROR#: %s" % re_stderr.read()
+ return None
+
+ return re_stdout.read()
+
+ @staticmethod
+ def sdbSetDate(devid):
+ print "set device date"
+ HDATE = '`date "+%Y-%m-%d %H:%M"`'
+ date_cmd = '"date -s \''+ HDATE + '\'"'
+ SdbManager.sdbShell(devid, date_cmd)
+
+ @staticmethod
+ def killall(ppid):
+ """Kill all children process by parent process ID"""
+ os_ver = platform.system()
+ try:
+ if os_ver == "Linux" or os_ver == "Darwin":
+ ppid = str(ppid)
+ pidgrp = []
+
+ def getchildpids(ppid):
+ """Return a list of children process"""
+ command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
+ ppid)
+ pids = os.popen(command).read()
+ pids = pids.split()
+ return pids
+
+ pidgrp.extend(getchildpids(ppid))
+ for pid in pidgrp:
+ pidgrp.extend(getchildpids(pid))
+ # Insert self process ID to PID group list
+ pidgrp.insert(0, ppid)
+ while len(pidgrp) > 0:
+ pid = pidgrp.pop()
+ try:
+ os.kill(int(pid), signal.SIGKILL)
+ except OSError, error:
+ pattern = re.compile('No such process')
+ match = pattern.search(str(error))
+ if not match:
+ print "[ Error: fail to kill pid: %s," \
+ " error: %s ]\n" % (int(pid), error)
+ # kill for windows platform
+ else:
+ kernel32 = ctypes.windll.kernel32
+ handle = kernel32.OpenProcess(1, 0, int(ppid))
+ kernel32.TerminateProcess(handle, 0)
+ except OSError, error:
+ pattern = re.compile('No such process')
+ match = pattern.search(str(error))
+ if not match:
+ print "[ Error: fail to kill pid: %s, error: %s ]\n" \
+ % (int(ppid), error)
+ return None
--- /dev/null
+#!/usr/bin/python
+
+"""Usage:
+ tct-config-device.py [--install [--deviceid <serial_no>]]
+ tct-config-device.py --purge [--deviceid <serial_no>]
+ tct-config-device.py --check [--deviceid <serial_no>][--procid <process_name>]
+ tct-config-device.py --bhtest <profile>
+
+Options:
+ -h, --help show this help message and exit
+ --install Install tct resources to TIZEN device,it can be omitted
+ --purge Clean up tct resources from TIZEN device
+ --check Check test resource on device
+ --bhtest Install tct behavior test
+ --deviceid Set the device serial number
+ --procid Set the check process name
+
+"""
+import os
+import sys
+import time
+import ConfigParser
+import threading
+import subprocess
+
+
+from optparse import OptionParser
+from devicemanager import DeviceManager
+from sdbmanager import SdbManager
+
+JOIN = os.path.join
+EXISTS = os.path.exists
+DIRNAME = os.path.dirname
+BASENAME = os.path.basename
+ABSPATH = os.path.abspath
+SPLIT = os.path.split
+
+CURENT_DIR = SPLIT(DIRNAME(ABSPATH(__file__)))[0]
+
+TOOLS_DIR = JOIN(CURENT_DIR, "tools")
+RESRC_DIR = JOIN(CURENT_DIR, "resource")
+PKGS_DIR = JOIN(CURENT_DIR, "package")
+
+DEVID = ""
+
+TIZENV = "tizen_6.0"
+
+DLOG_CLEAR = "dlogutil -c"
+DLOG_UTIL = "sdb -s %s shell dlogutil -v time"
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = ConfigParser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+DEVICE_EXECUTION_MODE_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
+
+if TIZENV.find('tizen_6.0') > -1:
+ DEVICE_SUITE_TARGET = DEVICE_SUITE_TARGET_30
+else:
+ DEVICE_SUITE_TARGET = DEVICE_SUITE_TARGET_24
+
+def LS(root, file_name, extension=None):
+ import glob
+
+ file_path = ""
+ if extension:
+ file_path = JOIN(root, file_name) + "*." + extension
+ else:
+ file_path = JOIN(root, file_name) + "*"
+ files = glob.iglob(r'' + file_path + '')
+ for f in files:
+ return BASENAME(f)
+
+def get_device_arch():
+ global DEV_ARCH
+ #ARCHCMD = SDB_SERNO + " shell \"cat /etc/products.d/tizen.prod |grep \<arch\""
+ arch_cmd = "cat /etc/config/model-config.xml | grep tizen.org/feature/platform.core.cpu.arch"
+ #result example : <key name="tizen.org/feature/platform.core.cpu.arch" type="string">armv7</key>
+ result = SdbManager.sdbShell(DEVID, arch_cmd)
+ if result and len(result) > 0:
+ arch_str = result.split('\n')[0]
+ if arch_str and arch_str.find('armv') > -1:
+ DEV_ARCH = "arm"
+ print "info: [* Arch Type : arm *]"
+ elif arch_str and arch_str.find("aarch64") > -1:
+ DEV_ARCH = "aarch64"
+ print "info: [* Arch Type : aarch64 *]"
+ elif arch_str and arch_str.find('x86_64') > -1:
+ DEV_ARCH = "ia64"
+ print "info: [* Arch Type : ia64 *]"
+ elif arch_str and (arch_str.find("i686") > -1 or arch_str.find("x86") > -1 or arch_str.find("i386") > -1):
+ DEV_ARCH = "ia"
+ print "info: [* Arch Type : ia *]"
+ else:
+ print "info: [* Arch Type : None *]"
+ return False
+ return True
+ else:
+ print "#ERROR#: Failed to get device cpu_arch type"
+ return False
+
+
+def kill_process(process_name):
+ proc_cmd = "ps aux | grep " + process_name + " | grep -v grep | awk '{print $2}'"
+ result = SdbManager.sdbShell(DEVID, proc_cmd)
+ if result and len(result) > 0:
+ kill_cmd = "kill -9 " + str(result).strip() + " > /dev/null 2>&1"
+ SdbManager.sdbShell(DEVID, kill_cmd)
+ print "info: %s process has been killed" % process_name
+ else:
+ print "info: No process of %s activated" % process_name
+
+def remove_tinyweb():
+ SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/server.pem > /dev/null 2>&1")
+ SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/tinyweb > /dev/null 2>&1")
+ SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/cgi-getcookie > /dev/null 2>&1")
+ SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/cgi-getfield > /dev/null 2>&1")
+ SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/libmongoose.so > /dev/null 2>&1")
+ SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/echo.so > /dev/null 2>&1")
+ SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/libssl.so > /dev/null 2>&1")
+ SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/libcrypto.so > /dev/null 2>&1")
+
+def remove_stub():
+ SdbManager.sdbShell(DEVID, "rm -f /opt/home/developer/testkit-stub")
+
+
+def uninstall_testconfig():
+ if TIZENV.find('tizen_6.0') > -1:
+ inst_path = RESRC_DIR + os.sep + 'tct-testconfig' + os.sep + 'inst.py'
+ SdbManager.hostCommand("python %s -s %s -u" % (inst_path, DEVID))
+ else:
+ RPMPKG = LS(RESRC_DIR, "tct-testconfig")
+ if not RPMPKG:
+ sys.exit("#ERROR#: cannot found tct-testconfig.zip file in resource dir")
+ uninst_cmd = JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-testconfig/inst.sh') + ' -u'
+ SdbManager.sdbShell(DEVID, uninst_cmd)
+ rm_cmd = 'rm -f ' + JOIN(DEVICE_SUITE_TARGET, 'tct/', RPMPKG)
+ SdbManager.sdbShell(DEVID, rm_cmd)
+
+
+def uninstall_behavior():
+ print "info: Uninstall behavior tool."
+ if TIZENV.find('tizen_6.0') > -1:
+ pass
+ else:
+ uninst_cmd = JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-behavior-tests/inst.sh') + ' -u'
+ SdbManager.sdbShell(DEVID, uninst_cmd)
+
+
+def check_resource_dir():
+ print "info: check resource directory."
+ if os.path.exists(RESRC_DIR):
+ SdbManager.sdbShell(DEVID, 'mkdir -p ' + JOIN(DEVICE_SUITE_TARGET, 'tct/'))
+ SdbManager.sdbShell(DEVID, 'mkdir -p ' + JOIN(DEVICE_SUITE_TARGET, 'Documents/'))
+ return True
+ else:
+ print "#WARNING#: The directory resource does not exists. Please copy test resources to %s " % RESRC_DIR
+ return False
+
+def check_tinyweb():
+ print "info: Check tinyweb."
+ result = SdbManager.sdbShell(DEVID, "ls /opt/home/developer/ | grep tinyweb")
+ if result and result.find('tinyweb'):
+ remove_tinyweb()
+ install_tinyweb()
+ launch_tinyweb()
+ else:
+ install_tinyweb()
+ launch_tinyweb()
+
+
+def port_manager():
+ print "info: Check the tinyweb port"
+ result = SdbManager.sdbShell('fuser -n tcp 80 8080 8081 8082 8083 8443')
+ if result and len(result) > 0:
+ check_port = SdbManager.sdbShell('su "netstat -nap |grep tinyweb"')
+ if len(check_port) > 0:
+ print "info: tinyweb on"
+ else:
+ print "info: Port is available"
+
+
+def launch_tinyweb():
+ dpath_cmd = "printenv PATH"
+ dpath = SdbManager.sdbShell(DEVID, dpath_cmd)
+
+ launch_cmd = 'sdb -s ' + DEVID + ' shell ' + '"env LD_LIBRARY_PATH=/opt/home/developer PATH=' + dpath.strip() + \
+ ':/opt/home/developer/ tinyweb -ssl_certificate /opt/home/developer/server.pem -document_root ' + \
+ JOIN(DEVICE_SUITE_TARGET, 'tct') + ' -listening_ports 80,8080,8081,8082,8083,8443s; sleep 3s" 0> /dev/null'
+
+ SdbManager.sdbCommand(launch_cmd, 10)
+
+ check_tinyweb_cmd = '\"ps aux | grep tinyweb | grep -v grep\"'
+ result = SdbManager.sdbShell(DEVID, check_tinyweb_cmd)
+ if result and result.find('tinyweb') > -1:
+ print "info: Active process tinyweb successfully."
+ return True
+ else:
+ print "#ERROR#: Active process tinyweb failed."
+ return False
+
+def install_tinyweb():
+ print "info: Install tinyweb"
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'tinyweb'), '/opt/home/developer/')
+ SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/tinyweb")
+
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'cgi-getcookie'), '/opt/home/developer/')
+ SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/cgi-getcookie")
+
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'cgi-getfield'), '/opt/home/developer/')
+ SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/cgi-getfield")
+
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'libmongoose.so'), '/opt/home/developer/')
+ SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/libmongoose.so")
+
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'echo.so'), '/opt/home/developer/')
+ SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/echo.so")
+
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'tinyweb', DEV_ARCH, 'server.pem'), '/opt/home/developer/')
+ SdbManager.sdbShell(DEVID, "chmod 777 /opt/home/developer/server.pem")
+ if DEV_ARCH == "arm":
+ SdbManager.sdbShell(DEVID, "ln -s /usr/lib/libssl.so.1.0.0 /opt/home/developer/libssl.so")
+ SdbManager.sdbShell(DEVID, "ln -s /usr/lib/libcrypto.so.1.0.0 /opt/home/developer/libcrypto.so")
+ elif DEV_ARCH == "ia":
+ SdbManager.sdbShell(DEVID, "ln -s /usr/lib/libssl.so.1.0.0 /opt/home/developer/libssl.so")
+ SdbManager.sdbShell(DEVID, "ln -s /usr/lib/libcrypto.so.1.0.0 /opt/home/developer/libcrypto.so")
+ elif DEV_ARCH == "aarch64":
+ SdbManager.sdbShell(DEVID, "ln -s /usr/lib64/libssl.so.1.0.0 /opt/home/developer/libssl.so")
+ SdbManager.sdbShell(DEVID, "ln -s /usr/lib64/libcrypto.so.1.0.0 /opt/home/developer/libcrypto.so")
+ elif DEV_ARCH == "ia64":
+ SdbManager.sdbShell(DEVID, "ln -s /usr/lib64/libssl.so.1.0.0 /opt/home/developer/libssl.so")
+ SdbManager.sdbShell(DEVID, "ln -s /usr/lib64/libcrypto.so.1.0.0 /opt/home/developer/libcrypto.so")
+
+
+def check_stub():
+ print "info: Check testkit-stub."
+ result = SdbManager.sdbShell(DEVID, "ls /opt/home/developer/ | grep testkit-stub")
+ if result and len(result) > 0:
+ print "info: testkit-stub has been installed on device."
+ kill_process("testkit-stub")
+ install_stub()
+
+
+def install_stub():
+ print "info: Install testkit-stub."
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, 'testkit-stub', DEV_ARCH, 'testkit-stub'), '/opt/home/developer/testkit-stub')
+ SdbManager.sdbShell(DEVID, "chmod a+x /opt/home/developer/testkit-stub")
+ SdbManager.sdbShell(DEVID, "chsmack -e \"User\" /opt/home/developer/testkit-stub")
+
+
+def check_testconfig():
+ result = SdbManager.sdbShell(DEVID, '"cat ' + JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-testconfig/tct-testconfig.ini') + ' | grep tct"')
+ if result and len(result) > 0 and result.find('No such file or directory') == -1:
+ print "info: testconfig has already been installed on device."
+ else:
+ install_testconfig()
+
+
+def install_testconfig():
+ print "info: Install testconfig."
+ if TIZENV.find('tizen_6.0') > -1:
+ instPath = RESRC_DIR + os.sep + 'tct-testconfig' + os.sep + 'inst.py'
+ SdbManager.hostCommand("python %s -s %s" % (instPath, DEVID))
+ else:
+ conf_pkg = LS(RESRC_DIR, "tct-testconfig")
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, conf_pkg), JOIN(DEVICE_SUITE_TARGET, 'tct/'))
+ SdbManager.sdbShell(DEVID, 'unzip -uo ' + JOIN(DEVICE_SUITE_TARGET, 'tct/') + conf_pkg + ' -d ' + JOIN(DEVICE_SUITE_TARGET, 'tct/'))
+ SdbManager.sdbShell(DEVID, JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-testconfig/inst.sh'))
+
+ result = SdbManager.sdbShell(DEVID, 'cat ' + JOIN(DEVICE_SUITE_TARGET, 'tct/opt/tct-testconfig/tct-testconfig.ini') + ' | grep tct')
+
+ if result and len(result) > 0:
+ print "info: Install testconfig successfully."
+ else:
+ print "#ERROR#: Failed to install testconfig, please check %s" % RESRC_DIR
+ return False
+
+ return True
+
+def install_behavior(profile_name):
+ print "info: Install behavior tool."
+
+ if not profile_name in ['wearable', 'mobile', 'tv', 'ivi']:
+ print "#WARNING#: Invalid device profile value %s" % profile_name
+ return False
+
+ if TIZENV.find('tizen_6.0') > -1:
+ RPMPKG = "tct-behavior-tests-6.0.zip"
+ opt_rpm_path = PKGS_DIR + "s" + os.sep + profile_name + os.sep + RPMPKG
+ local_rpm_path = PKGS_DIR + os.sep + profile_name + os.sep + RPMPKG
+
+ install_rpm = None
+ install_dest = None
+ install_cmd = None
+ if os.path.exists(opt_rpm_path):
+ install_rpm = opt_rpm_path
+ install_dest = PKGS_DIR + "s" + os.sep + profile_name + os.sep
+ install_cmd = PKGS_DIR + "s" + os.sep + profile_name + os.sep + \
+ 'opt' + os.sep + "tct-behavior-tests" + os.sep + "inst.py"
+ elif os.path.exists(local_rpm_path):
+ install_rpm = local_rpm_path
+ install_dest = PKGS_DIR + os.sep + profile_name + os.sep
+ install_cmd = PKGS_DIR + os.sep + profile_name + os.sep + \
+ 'opt' + os.sep + "tct-behavior-tests" + os.sep + "inst.py"
+
+ SdbManager.hostCommand("rm -rf %s" % install_dest + "opt/tct-behavior-tests")
+ SdbManager.hostCommand("unzip -uo %s -d %s" % (install_rpm, install_dest))
+ SdbManager.hostCommand("python %s -s %s" % (install_cmd, DEVID))
+
+ print "info: Check tizen-web-ui-fw. Please wait..."
+ check_uifw = SdbManager.sdbShell(DEVID, "ls /usr/share/ | grep tizen-web-ui-fw")
+ if check_uifw and len(check_uifw) > 0:
+ print "info: tizen-web-ui-fw has been installed on device."
+ else:
+ SdbManager.sdbShell(DEVID, '"mkdir -p /usr/share/tizen-web-ui-fw/"')
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, "tizen-web-ui-fw"), '/usr/share/tizen-web-ui-fw/')
+ else:
+ pass
+
+ return True
+
+
+def install_getCap():
+ print "info: Install widget getCap."
+ widgetCap = LS(RESRC_DIR, 'getCap', 'wgt')
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, widgetCap), JOIN(DEVICE_SUITE_TARGET, 'tct/') + widgetCap)
+
+ if TIZENV.find('6.0') > -1:
+ SdbManager.sdbShell(DEVID, "su - " + DEVICE_EXECUTION_MODE_30 + \
+ " -c 'pkgcmd -i -t wgt -q -p " + JOIN(DEVICE_SUITE_TARGET, 'tct/') + widgetCap + '\'')
+ SdbManager.sdbShell(DEVID, 'pkgcmd -i -t wgt -q -p ' + JOIN(DEVICE_SUITE_TARGET, 'tct/') + widgetCap)
+
+
+def install_ngetCap():
+ print "info: Install widget ngetCap."
+ getcap_pkg = LS(RESRC_DIR, 'getCap', 'tpk')
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, getcap_pkg), JOIN(DEVICE_SUITE_TARGET, 'tct/') + getcap_pkg)
+
+ if TIZENV.find('tizen_6.0') > -1:
+ SdbManager.sdbShell(DEVID, "su - " + DEVICE_EXECUTION_MODE_30 + \
+ " -c 'pkgcmd -ipt tpk -p " + JOIN(DEVICE_SUITE_TARGET, 'tct/') + getcap_pkg + '\'')
+ else:
+ SdbManager.sdbShell(DEVID, "pkgcmd -iqt tpk -p" + JOIN(DEVICE_SUITE_TARGET, 'tct/') + getcap_pkg)
+
+def uninstall_getCap():
+ print "info: Uninstall widget getCap."
+ wgt_id = getCap_appid()
+ if wgt_id:
+ uninst_cmd = ""
+ if TIZENV.find('tizen_6.0') > -1:
+ uninst_cmd = "su - " + DEVICE_EXECUTION_MODE_30 + \
+ " -c 'pkgcmd -qun " + wgt_id.split('.')[0] + '\''
+ elif TIZENV.find('tizen_2.4') > -1:
+ uninst_cmd = "pkgcmd -u -q -t wgt -q -p " + wgt_id + '\''
+ SdbManager.sdbShell(DEVID, uninst_cmd)
+
+ else:
+ print "info: getCap is not installed. No need to uninstall"
+
+ SdbManager.sdbShell(DEVID, "rm -rf " + JOIN(DEVICE_SUITE_TARGET, "Documents/tct"))
+ SdbManager.sdbShell(DEVID, "rm -rf " + JOIN(DEVICE_SUITE_TARGET, "tct/getCap.wgt"))
+ SdbManager.sdbShell(DEVID, "rm -rf " + JOIN(DEVICE_SUITE_TARGET, "tct/getCap.tpk"))
+
+
+def uninstall_ngetCap():
+ print "info: Uninstall widget ngetCap."
+
+def getCap_appid():
+ widgetid_cmd = ""
+ if TIZENV.find('tizen_6.0') > -1:
+ widgetid_cmd = "su - " + DEVICE_EXECUTION_MODE_30 + \
+ " -c \"app_launcher -l | grep getCapabilities\""
+ else:
+ widgetid_cmd = "wrt-launcher -l | grep getCapabilities"
+
+ widgetids = SdbManager.sdbShell(DEVID, widgetid_cmd)
+ if widgetids and widgetids.find('getCapabilities') > -1:
+ items = widgetids.split()
+ return items[len(items) - 1].strip("'")
+ else:
+ return None
+
+def check_getCap():
+ print "info: Check getCap widget. Please wait..."
+ if getCap_appid():
+ print "info: widget getCap has already been installed on device."
+ else:
+ install_getCap()
+ launch_getCap()
+
+
+def check_ngetCap():
+ print "info: Check ngetCap widget. Please wait..."
+ if getCap_appid():
+ print "info: widget ngetCap has already been installed on device."
+ else:
+ install_ngetCap()
+ launch_ngetCap()
+
+
+def launch_getCap():
+ wgt_id = getCap_appid()
+ if wgt_id:
+ launchResult = None
+ if TIZENV.find('tizen_6.0') > -1:
+ launchResult = SdbManager.sdbShell(DEVID, 'su - ' + \
+ DEVICE_EXECUTION_MODE_30 + ' -c \"app_launcher -s ' + wgt_id + '\"')
+ else:
+ launchResult = SdbManager.sdbShell(DEVID, '\"wrt-launcher -s ' + wgt_id + '\"')
+
+ if launchResult.find('launched') > -1:
+ fcheck_retry = 20
+
+ while fcheck_retry > 0:
+ build = SdbManager.sdbShell(DEVID, "cat " + JOIN(DEVICE_SUITE_TARGET, "Documents/tct/buildinfo.xml") + " | grep buildinfos")
+ capa = SdbManager.sdbShell(DEVID, "cat " + JOIN(DEVICE_SUITE_TARGET, "Documents/tct/capability.xml") + " | grep capabilities")
+ if not build or not capa:
+ time.sleep(2)
+ fcheck_retry -= 1
+ else:
+ break
+ if fcheck_retry == 0:
+ print "#ERROR#: getCap get buildinfo, capability of device failed!"
+ return False
+ else:
+ print "info: Launch getCap successfully"
+ return True
+ else:
+ print "#ERROR#: Launch getCap got failed"
+ return False
+ else:
+ print "#ERROR#: Widget getCap cannot be found. Please check whether the widget is installed successfully"
+ return False
+
+def launch_ngetCap():
+ launch_result = None
+ if TIZENV.find('tizen_6.0') > -1:
+ launch_result = SdbManager.sdbShell(DEVID, 'su - ' + \
+ DEVICE_EXECUTION_MODE_30 + ' -c \"launch_app org.example.getcap\"')
+ else:
+ launch_result = SdbManager.sdbShell(DEVID, '\"launch_app org.example.getcap\"')
+
+ if "launched" in launch_result:
+ return True
+ else:
+ return False
+
+def getStorage_appid():
+ widgetid_cmd = "su - " + DEVICE_EXECUTION_MODE_30 + \
+ " -c \"app_launcher -l | grep InternalStorageSetting\""
+ widgetids = SdbManager.sdbShell(DEVID, widgetid_cmd)
+ if widgetids and widgetids.find('InternalStorageSetting') > -1:
+ items = widgetids.split()
+ return items[len(items)-1].strip("'")
+ else:
+ return None
+
+def check_storage():
+ print "info: Check InternalStorageSetting widget. Please wait..."
+ if getStorage_appid():
+ print "info: widget InternalStorageSetting has already been installed on device."
+ else:
+ install_storage()
+ launch_storage()
+
+def install_storage():
+ print "info: Install widget InternalStorageSetting"
+ widget = LS(RESRC_DIR, 'InternalStorageSetting', 'wgt')
+ SdbManager.sdbPush(DEVID, JOIN(RESRC_DIR, widget), JOIN(DEVICE_SUITE_TARGET, 'tct/') + widget)
+
+ SdbManager.sdbShell(DEVID, "su - " + DEVICE_EXECUTION_MODE_30 + \
+ " -c 'pkgcmd -i -t wgt -q -p " + JOIN(DEVICE_SUITE_TARGET, 'tct/') + widget + '\'')
+
+def launch_storage():
+ wgt_id = getStorage_appid()
+ if wgt_id:
+ launch_result = SdbManager.sdbShell(DEVID, 'su - ' + \
+ DEVICE_EXECUTION_MODE_30 + ' -c \"app_launcher -s ' + wgt_id + '\"')
+
+ if launch_result.find('launched') > -1:
+ print "info: Launch InternalStorageSetting successfully"
+ return True
+ else:
+ print "#ERROR#: InternalStorageSetting launch failed"
+ return False
+ else:
+ print "#ERROR#: Widget InternalStorageSetting cannot be found"
+ return False
+
+def uninstall_storage():
+ print "info: Uninstall widget InternalStorageSetting"
+ wgt_id = getStorage_appid()
+ if wgt_id:
+ uninst_cmd = "su - " + DEVICE_EXECUTION_MODE_30 + \
+ " -c 'pkgcmd -qun " + wgt_id.split('.')[0] + '\''
+ SdbManager.sdbShell(DEVID, uninst_cmd)
+ else:
+ print "info: InternalStorageSetting is not installed"
+
+def push_tctconf_file():
+ local = TCT_CONFIG_FILE
+ remote = DEVICE_SUITE_TARGET_30
+ if not SdbManager.sdbPush(DEVID, local, remote):
+ print "#ERROR#: TCT_CONFIG file push failed"
+ return False
+ return True
+
+def find_ngetCap():
+ getcap_tpk = LS(RESRC_DIR, 'getCap', 'tpk')
+ if getcap_tpk:
+ return True
+ else:
+ return False
+
+def debug_trace(cmd, logfile):
+ global debug_flag, metux
+
+ wbuffile = file(logfile, "a+")
+ exit_code = None
+ proc = subprocess.Popen(args=cmd,
+ shell=True,
+ stdout=wbuffile,
+ stderr=None)
+ while True:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+ time.sleep(0.6)
+ metux.acquire()
+ proc_flag = debug_flag
+ metux.release()
+ if not proc_flag:
+ break
+ wbuffile.close()
+ SdbManager.killall(proc.pid)
+
+
+def start_debug(dlog_file):
+ global debug_flag, metux, dlog_thread
+ debug_flag = True
+ metux = threading.Lock()
+ clear_cmd = DLOG_CLEAR
+ SdbManager.sdbShell(DEVID, clear_cmd)
+
+ dlog_cmd = DLOG_UTIL % DEVID
+ dlog_thread = threading.Thread(target=debug_trace, args=(dlog_cmd, dlog_file))
+ dlog_thread.setDaemon(True)
+ dlog_thread.start()
+
+
+def stop_debug():
+ global debug_flag, metux
+ metux.acquire()
+ debug_flag = False
+ metux.release()
+ dlog_thread.join()
+
+
+def runProcess():
+ if options.purge:
+ print "[ Uninstall test resource on device. Please wait...]"
+ uninstall_testconfig()
+ uninstall_behavior()
+ uninstall_getCap()
+ remove_tinyweb()
+ kill_process("tinyweb")
+ kill_process("testkit-stub")
+ remove_stub()
+ if TIZENV.find('6.0') > -1:
+ uninstall_storage()
+ print "Clean the tct packages in device successfully."
+
+ elif options.check:
+ check_resource_dir()
+ print "[ Check test resource on device. Please wait...]"
+ if options.process == 'tinyweb':
+ check_tinyweb()
+ elif options.process == 'testkit-stub':
+ check_stub()
+ elif options.process == 'testconfig':
+ check_testconfig()
+ elif options.process == 'getCap':
+ check_getCap()
+ elif options.process == 'ngetCap':
+ if find_ngetCap():
+ check_ngetCap()
+ else:
+ check_getCap()
+ elif options.process == 'storage':
+ check_storage()
+ else:
+ check_tinyweb()
+ check_stub()
+ check_testconfig()
+ if find_ngetCap():
+ check_ngetCap()
+ else:
+ check_getCap()
+ if TIZENV.find('6.0') > -1:
+ check_storage()
+
+ print "Check finished."
+
+ elif options.bhtest:
+ check_resource_dir()
+ if TIZENV.find('6.0') > -1:
+ uninstall_storage()
+ install_storage()
+ launch_storage()
+
+ uninstall_behavior()
+ print "[ Install tct behavior tool on device. Please wait...]"
+ install_behavior(options.bhtest)
+ print "Installation of tct behavior on device completed."
+
+ else:
+ check_resource_dir()
+ print "[ Clean old test resource on device. Please wait...]"
+ if options.process == 'tinyweb':
+ kill_process("tinyweb")
+ remove_tinyweb()
+ elif options.process == 'testkit-stub':
+ kill_process("testkit-stub")
+ remove_stub()
+ elif options.process == 'testconfig':
+ uninstall_testconfig()
+ elif options.process == 'getCap':
+ uninstall_getCap()
+ pass
+ elif options.process == 'ngetCap':
+ uninstall_ngetCap()
+ elif options.process == 'storage':
+ uninstall_storage()
+ else:
+ remove_tinyweb()
+ kill_process("testkit-stub")
+ remove_stub()
+ uninstall_testconfig()
+ uninstall_getCap()
+ uninstall_ngetCap()
+ if TIZENV.find('6.0') > -1:
+ uninstall_storage()
+
+ print "Clean the tct packages in device successfully."
+ print "[ Install test resource on device. Please wait...]"
+ if options.process == 'tinyweb':
+ install_tinyweb()
+ launch_tinyweb()
+ elif options.process == 'testkit-stub':
+ install_stub()
+ elif options.process == 'testconfig':
+ install_testconfig()
+ elif options.process == 'getCap':
+ install_getCap()
+ launch_getCap()
+ elif options.process == 'ngetCap':
+ if find_ngetCap():
+ install_ngetCap()
+ launch_ngetCap()
+ else:
+ install_getCap()
+ launch_getCap()
+ elif options.process == 'storage':
+ install_storage()
+ launch_storage()
+ else:
+ install_testconfig()
+ install_stub()
+ install_tinyweb()
+ launch_tinyweb()
+ if find_ngetCap():
+ install_ngetCap()
+ launch_ngetCap()
+ else:
+ install_getCap()
+ launch_getCap()
+
+ if TIZENV.find('6.0') > -1:
+ install_storage()
+ launch_storage()
+
+ print "All of installation process on device completed."
+
+
+if __name__ == "__main__":
+
+ parser = OptionParser()
+ parser.add_option(
+ "--install", dest="install", action="store_true", default=False,
+ help="Install tct resources to TIZEN device,it can be omitted")
+ parser.add_option(
+ "--purge", dest="purge", action="store_true", default=False,
+ help="Clean up tct resources from TIZEN device")
+ parser.add_option(
+ "--check", dest="check", action="store_true", default=False,
+ help="Check test resource on device")
+ parser.add_option(
+ "--deviceid", dest="deviceid", action="store",
+ help="Set the device serial number")
+ parser.add_option(
+ "--procid", dest="process", action="store",
+ help="Set the process id for checking")
+ parser.add_option(
+ "--bhtest", dest="bhtest", action="store",
+ help="Install behavior test tool to device")
+
+ (options, args) = parser.parse_args()
+
+ devinst = DeviceManager.getInstance()
+ if options.deviceid:
+ if devinst.isDeviceAvailable(options.deviceid):
+ DEVID = options.deviceid
+ else:
+ sys.exit("#ERROR#: The '%s' device Id exists error" % options.deviceid)
+ else:
+ if devinst.getDeviceSize() > 1 or devinst.getDeviceSize() == 0:
+ sys.exit("#ERROR#: %s devices connected or device not connected" % str(devinst.getDeviceSize()))
+ else:
+ DEVID = devinst.getSdbDeviceList()[0].getDeviceId()
+
+ print "[========== start tct-config-device : %s ==========]" % DEVID
+ dev_temp_dir = '/opt/tools/shell/tmp/%s/' % DEVID
+ if not os.path.isdir(dev_temp_dir):
+ os.mkdir(dev_temp_dir)
+ DLOG_SAVE_PATH = '/opt/tools/shell/tmp/%s/conf_dev_%s.dlog'
+ if options.process is None:
+ DLOG_SAVE_PATH = DLOG_SAVE_PATH % (DEVID, 'all')
+ else:
+ DLOG_SAVE_PATH = DLOG_SAVE_PATH % (DEVID, options.process)
+
+ #start_debug(DLOG_SAVE_PATH)
+
+ if not SdbManager.sdbRootOn(DEVID):
+ sys.exit(-1)
+
+ SdbManager.sdbSetDate(DEVID)
+
+ if not get_device_arch() or not push_tctconf_file():
+ sys.exit(0)
+
+ runProcess()
+ #stop_debug()
+ print "[========== end tct-config-device : %s ==========]" % DEVID
--- /dev/null
+# -*- coding:utf-8 -*-
+import os
+import sys
+import platform
+import shutil
+import stat
+from optparse import OptionParser
+
+
+class CpFile:
+
+ def __init__(self, _tizenV, _upgrade=False):
+ self.tizenV = _tizenV
+ self.upgrade = _upgrade
+ self.sep = os.sep
+ self.TARGET_BASE_PATH = os.path.join(os.sep + "opt", "tct")
+
+ self.CURRENT_TARGET_BASE_PATH = ""
+ self.CURRENT_TARGET_LITE_PATH = ""
+ self.CURRENT_SOURCE_LITE_PATH = ""
+
+ #package
+ self.SOURCE_PACKAGE_PATH = ".." + self.sep + "package"
+ self.TARGET_PACKAGE_PATH = \
+ self.sep + self.tizenV + self.sep + "packages"
+ #manager
+ self.SOURCE_MANAGER_PATH = \
+ ".." + self.sep + "tools" + self.sep + "manager"
+ self.TARGET_MANAGER_PATH = \
+ self.sep + self.tizenV + self.sep + "manager"
+ #resource
+ self.SOURCE_RESOURCE_PATH = ".." + self.sep + "resource"
+ self.TARGET_RESOURCE_PATH = \
+ self.sep + self.tizenV + self.sep + "resource"
+ #script
+ self.SOURCE_SCRIPT_PATH = ""
+ self.TARGET_SCRIPT_PATH = self.sep + self.tizenV + self.sep + "scripts"
+ #doc
+ self.SOURCE_DOC_PATH = ".." + self.sep + "doc"
+ self.TARGET_DOC_PATH = self.sep + self.tizenV + self.sep + "doc"
+
+ def getCurrentOSBit(self):
+ return platform.architecture()
+
+ def setCurrentPath(self):
+ self.CURRENT_SOURCE_BASE_PATH = os.getcwd() + self.sep
+ self.CURRENT_TARGET_BASE_PATH = self.TARGET_BASE_PATH
+ print("current source base path =" + self.CURRENT_SOURCE_BASE_PATH)
+ print("current target base path =" + self.CURRENT_TARGET_BASE_PATH)
+
+ def cpDoc(self):
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_DOC_PATH,
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_DOC_PATH, "doc")
+
+ def cpScript(self):
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + "healthcheck.ini",
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_SCRIPT_PATH + \
+ self.sep + "healthcheck.ini")
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + "tct-config-device.py",
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_SCRIPT_PATH + \
+ self.sep + "tct-config-device.py")
+
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + "devicemanager.py",
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_SCRIPT_PATH + \
+ self.sep + "devicemanager.py")
+
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + "sdbmanager.py",
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_SCRIPT_PATH + \
+ self.sep + "sdbmanager.py")
+
+
+ def cpResource(self):
+ if not self.upgrade:
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_RESOURCE_PATH,
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_RESOURCE_PATH, \
+ "resource")
+
+ def cpPackage(self):
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_PACKAGE_PATH,
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_PACKAGE_PATH, \
+ "package")
+ for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
+ self.TARGET_PACKAGE_PATH):
+ if (platform.system() != "Windows"):
+ os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+ def cpManager(self):
+ if not self.upgrade:
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_MANAGER_PATH,
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_MANAGER_PATH, \
+ "manager")
+ for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
+ self.TARGET_MANAGER_PATH):
+ if (platform.system() != "Windows"):
+ os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+ def cpFile(self, src, target):
+ if (not os.path.isfile(src)):
+ print(src + " is not a file")
+ return
+ path = os.path.dirname(target)
+ if (not os.path.isdir(path)):
+ os.makedirs(path)
+ shutil.copy2(src, target)
+
+ def del_rw(self, action, name, exc):
+ if (platform.system() != "Windows"):
+ os.chmod(name, stat.S_IWRITE)
+ os.remove(name)
+
+ def cpDir(self, src, target, name):
+ if (os.path.isdir(src) and not os.path.exists(target)):
+ print("copy " + name + " dir start")
+ shutil.copytree(src, target)
+ print("copy " + name + " dir finish")
+ else:
+ if (not os.path.isdir(src)):
+ print("source " + name + " path is not a dir")
+ if (os.path.exists(target)):
+ print ("target " + name + " path is exists")
+ try:
+ shutil.rmtree(target, onerror=self.del_rw)
+ except Exception, data:
+ print Exception, ":", data
+
+ print ("target " + name + " dir destroyed")
+ try:
+ shutil.copytree(src, target)
+ except Exception, data:
+ print Exception, ":", data
+ print("copy " + name + " dir finish")
+
+ def clear(self):
+ self.setCurrentPath()
+ try:
+ shutil.rmtree(self.CURRENT_TARGET_BASE_PATH, onerror=self.del_rw)
+ except Exception, data:
+ print Exception, ":", data
+
+ def makeResult(self):
+ mgr_result_folder = os.path.join(self.CURRENT_TARGET_BASE_PATH, \
+ self.tizenV + "/manager/result")
+ shell_result_folder = os.path.join(self.CURRENT_TARGET_BASE_PATH, \
+ self.tizenV + "/shell/result")
+
+ if not os.path.isdir(mgr_result_folder):
+ os.makedirs(mgr_result_folder)
+ else:
+ if not self.upgrade:
+ shutil.rmtree(mgr_result_folder, onerror=self.del_rw)
+ os.makedirs(mgr_result_folder)
+
+ if not os.path.isdir(shell_result_folder):
+ os.makedirs(shell_result_folder)
+ else:
+ if not self.upgrade:
+ shutil.rmtree(shell_result_folder, onerror=self.del_rw)
+ os.makedirs(shell_result_folder)
+ if (platform.system() != "Windows"):
+ os.chmod(shell_result_folder, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+ os.chmod(mgr_result_folder, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+ def cp(self):
+ self.setCurrentPath()
+ self.cpDoc()
+ self.cpPackage()
+ self.cpManager()
+ self.cpResource()
+ self.cpScript()
+ self.makeResult()
+
+parser = OptionParser()
+parser.add_option("-i", "--install", dest="install", action="store_true", \
+ default=False, help="copy folders and file into os")
+parser.add_option("-p", "--purge", dest="clear", action="store_true", \
+ default=False, help="clear all files")
+parser.add_option("-t", "--tizen-version", dest="tizenV", \
+ help="set tizen version infomation")
+parser.add_option("-u", "--upgrade", dest="upgrade", action="store_true", \
+ default=False, help="upgrade tct tools")
+
+(options, args) = parser.parse_args()
+
+if options.tizenV is None:
+ print "[ Error : input your tizen version ]"
+ sys.exit(1)
+
+if (options.install):
+ test = CpFile(options.tizenV)
+ test.cp()
+elif (options.clear):
+ test = CpFile(options.tizenV)
+ test.clear()
+elif (options.upgrade):
+ test = CpFile(options.tizenV, options.upgrade)
+ test.cp()
+else:
+ test = CpFile(options.tizenV)
+ test.cp()
--- /dev/null
+# -*- coding:utf-8 -*-
+import os
+import sys
+import shutil
+import stat
+import re
+import tarfile
+import zipfile
+import platform
+
+SCRIPT_VERSION = "1.1"
+WEB_TCT_PATTERN = "^web-tct_\d.\d"
+NATIVE_TCT_PATTERN = "^nativetct_\d.\d"
+CSHARP_TCT_PATTERN = "^csharp-tct_\d.\d"
+
+TOOLS_PATTERN = "^tct-tools"
+
+TCT_INSTALL_SCRIPT = "tct-config-host.py"
+TOOLS_INSTALL_SCRIPT = "tct-config-tools.py"
+
+NATIVE_TCT_TYPE = 0
+WEB_TCT_TYPE = 1
+TOOLS_TYPE = 2
+NORMAL_TYPE = 3
+CSHARP_TCT_TYPE = 4
+
+def make_ver_file(tctV, tizenV):
+ ver_path = "/opt/tct/" + tizenV + "/VERSION"
+ #ver_file = open('/opt/tct/tizen_web_3.0/VERSION', 'wa')
+ ver_file = open(ver_path, 'w')
+ ver_file.write(str(tctV))
+ ver_file.close()
+
+def get_tizenV(afile):
+ tizenV = ""
+ ver = afile.split('_')[1]
+ if afile.find("web") > -1:
+ tizenV = "tizen_web_" + ver
+ elif afile.find("Native") > -1:
+ tizenV = "tizen_native_" + ver
+ elif afile.find("csharp") > -1:
+ tizenV = "tizen_csharp_" + ver
+
+ return tizenV
+
+def install_release_file(afile, file_type, upgrade):
+
+ try:
+ tizenV = None
+ for r,d,f in os.walk(afile):
+ if (platform.system() != "Windows"):
+ os.system("chmod -R 777 "+ r)
+
+ inst_cmd = "python " + TCT_INSTALL_SCRIPT
+ if upgrade:
+ inst_cmd += " --upgrade"
+
+ if file_type is WEB_TCT_TYPE or file_type is CSHARP_TCT_TYPE:
+ tizenV = get_tizenV(afile)
+ os.chdir(afile +"/tools")
+ os.system(inst_cmd + " --tizen-version " + tizenV)
+ os.chdir("../../")
+ make_ver_file(str(afile), tizenV)
+
+ if file_type is NATIVE_TCT_TYPE:
+ tizenV = get_tizenV(afile)
+ os.chdir(afile + "/TCT/native-tct/tools")
+ os.system(inst_cmd + " --tizen-version " + tizenV)
+ os.chdir("../../../../")
+ make_ver_file(str(afile), tizenV)
+
+ if file_type is TOOLS_TYPE:
+ os.chdir(afile)
+ os.system("python "+ TOOLS_INSTALL_SCRIPT)
+ os.chdir("../")
+ except Exception as ex:
+ print (str(ex))
+
+
+def unpack_release_file(afile):
+ if tarfile.is_tarfile(afile):
+ tar = tarfile.open(afile)
+ for tarinfo in tar:
+ msg = tarinfo.name + " is " + str(tarinfo.size) + " bytes in size and is "
+ if tarinfo.isreg():
+ msg += "a regular file."
+ elif tarinfo.isdir():
+ msg += "a directory."
+ else:
+ msg += "something else."
+ print msg
+ tar.extractall()
+ tar.close()
+
+ if zipfile.is_zipfile(afile):
+ zipf = zipfile.ZipFile(afile)
+ zipf.extractall()
+ zipf.close()
+
+def find_release_file(afile):
+ web_tct_pa = re.compile(WEB_TCT_PATTERN, re.I)
+ web_tct_match = web_tct_pa.match(afile)
+
+ native_tct_pa = re.compile(NATIVE_TCT_PATTERN, re.I)
+ native_tct_match = native_tct_pa.match(afile)
+
+ csharp_tct_pa = re.compile(CSHARP_TCT_PATTERN, re.I)
+ csharp_tct_match = csharp_tct_pa.match(afile)
+
+ if web_tct_match:
+ return WEB_TCT_TYPE
+
+ if native_tct_match:
+ return NATIVE_TCT_TYPE
+
+ if csharp_tct_match:
+ return CSHARP_TCT_TYPE
+
+ tools_pa = re.compile(TOOLS_PATTERN, re.I)
+ tools_match = tools_pa.match(afile)
+ if tools_match :
+ return TOOLS_TYPE
+
+ return NORMAL_TYPE
+
+def is_archvie_file(afile):
+ file_extension = get_file_extension(afile)
+ if file_extension == ".gz" or file_extension == ".zip":
+ return True
+ else :
+ return False
+
+def get_file_extension(afile):
+ return os.path.splitext(afile)[1]
+
+def remove_readonly(func, path, excinfo):
+ if (platform.system() != "Windows"):
+ os.chmod(path, stat.S_IWRITE)
+ func(path)
+
+def remove_dir_tree(remove_dir):
+ try:
+ shutil.rmtree(remove_dir, ignore_errors=False, onerror=remove_readonly)
+ except Exception as e: ## if failed, report it back to the user ##
+ print("[Delete Error] %s - %s." % (e.filename,e.strerror))
+
+def install_tct(upgrade=False):
+ current_path = os.getcwd()
+ filelist = os.listdir(current_path)
+ for file in filelist :
+ file_type = find_release_file(file)
+ if file_type is not NORMAL_TYPE :
+ if is_archvie_file(file) is True:
+ unpack_release_file(file)
+
+ filelist = os.listdir(current_path)
+ for file in filelist:
+ file_type = find_release_file(file)
+ if file_type is not NORMAL_TYPE :
+ if is_archvie_file(file) is False:
+ install_release_file(file, file_type, upgrade)
+
+if len(sys.argv) > 1:
+ if(sys.argv[1]) == 'clean':
+ print("clean option is given")
+ remove_dir_tree("/opt/tct")
+ remove_dir_tree("/opt/tools")
+ remove_dir_tree("/opt/testkit")
+ elif(sys.argv[1]) == 'upgrade':
+ print("upgrade option is given")
+ install_tct(True)
+ else:
+ print("error:invalid option is given")
+else:
+ install_tct(False)
--- /dev/null
+[DEVICE]
+DEVICE_SUITE_TARGET_24=/opt/usr/media
+DEVICE_SUITE_TARGET_30=/opt/usr/home/owner/share
+DEVICE_USER_30=/opt/usr/home/owner
+DEVICE_EXECUTION_MODE_30=owner
+DEVICE_PHYSICAL_STORAGE_30=/home/owner/media
+DEVICE_ADMIN_USER_30=owner
+DEVICE_ADMIN_USER_APPS_ROOT_30=/opt/usr/globalapps
+DEVICE_OTHER_USER_APPS_ROOT_30=/opt/usr/home/owner/apps_rw
--- /dev/null
+tct-tools_r4_rc1
--- /dev/null
+#!/usr/bin/python
+
+import sys
+
+from tctmonkey.monkeywrapper import MonkeyWrapper
+from tctmonkey.devicemanager import DeviceManager
+from tctmonkey.monkeyworker import RandomExecutor
+from tctmonkey.monkeyworker import ReplayExecutor
+
+
+def main():
+ wrapper = MonkeyWrapper()
+ wrapper.parse_options(sys.argv)
+
+ dmi = DeviceManager.getInstance()
+
+ mExecutor = []
+ for dev in dmi.getSdbDeviceList():
+ th = None
+ if wrapper.is_py_install():
+ wrapper.python_install(dev.getDeviceId())
+ if wrapper.is_random_mode():
+ th = RandomExecutor(dev.getDeviceId(), wrapper)
+ elif wrapper.is_replay_mode():
+ th = ReplayExecutor(dev.getDeviceId(), wrapper)
+
+ mExecutor.append(th)
+
+ for thread in mExecutor:
+ if thread:
+ thread.start()
+
+ for thread in mExecutor:
+ if thread:
+ thread.join()
+
+if __name__ == "__main__":
+ main()
--- /dev/null
+
+import os
+
+class Constants:
+ LIB_DIR = "/opt/tools/dev_event/lib/"
+ AGENT_PATH = "/opt/tools/dev_event/tctmonkey/fmbttizen-agent.py"
+ UINPUT_AGENT_PATH = "/opt/tools/dev_event/tctmonkey/fmbtuinput.py"
+ DUMP_DIR_PATH = "/opt/share/crash/dump/"
+ RESULT_DIR = "/opt/monkey/result/"
+ RECORD_FILE_NAME = "record_file"
+ SDB_LS = "sdb -s %s shell ls -al"
+ SDB_PUSH = "sdb -s %s push"
+ SDB_SHELL = "sdb -s %s shell"
+ SDB_ROOT_ON = "sdb -s %s root on"
+ SDB_DEVICES = "sdb devices"
+ SDB_START_SERVER = "sdb start-server"
+ SDB_KILL_SERVER = "sdb kill-server"
+ SDB_CONNECT = "sdb connect %s"
+ SDB_PULL = "sdb -s %s pull"
+ SDB_CAT_CONFIG = " cat %s"
+ FILE_FOUND_SCRIPT = "[ -f %s ] && echo \"Found\" || echo \"Not Found\""
+
+ @staticmethod
+ def checkFileExists(aPath):
+ if os.path.exists(aPath):
+ return True
+ else:
+ return False
--- /dev/null
+
+from sdbmanager import SdbManager
+
+class DeviceManager(object):
+ INSTANCE = None
+ devices = []
+
+ def __init__(self):
+ if DeviceManager.INSTANCE is not None:
+ raise Exception ("DeviceManager instance already exists")
+
+ @classmethod
+ def getInstance(cls):
+ if cls.INSTANCE is None:
+ cls.INSTANCE = DeviceManager()
+ if len(cls.INSTANCE.devices) < 1:
+ cls.INSTANCE.loadDeviceList()
+ return cls.INSTANCE
+
+ def _updateConnDevice(self, connDevices):
+ self._resetDevices()
+
+ for dev in connDevices:
+ self.devices.append(dev)
+
+ def _resetDevices(self):
+ listSize = len(self.devices)
+ del self.devices[0:listSize]
+
+ def getDeviceSize(self):
+ return len(self.devices)
+
+ def getSdbDeviceList(self):
+ return self.devices
+
+ def loadDeviceList(self):
+ connDevices = []
+ sdbOutLog = SdbManager.sdbDevices()
+ devicesInfo = sdbOutLog.replace("List of devices attached", "")
+ devList = devicesInfo.split('\n')
+
+ for dev in devList:
+ if len(dev) > 1:
+ devInfoItem = dev.split('\t')
+ devId = devInfoItem[0].rstrip()
+ devType = devInfoItem[1].rstrip()
+ devName = devInfoItem[2].rstrip()
+ if not (devType == "unknown" or devType == "offline" \
+ or devId == "unknown" or devId == "offline"):
+ connDevices.append(SdbDevice(devId, devName, devType))
+
+ if len(connDevices) > 0:
+ self._updateConnDevice(connDevices)
+ return True
+ else:
+ self._resetDevices()
+ return False
+
+
+class SdbDevice:
+ def __init__(self, devId, devName, devType):
+ self.devId = devId
+ self.devName = devName
+ self.devType = devType
+
+ def _printDevInfo(self):
+ pass
+
+ def getDeviceId(self):
+ return self.devId
+
+ def getDeviceName(self):
+ return self.devName
+
+ def getDeviceType(self):
+ return self.devType
--- /dev/null
+# fMBT, free Model Based Testing tool
+# Copyright (c) 2013, Intel Corporation.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms and conditions of the GNU Lesser General Public License,
+# version 2.1, 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 Lesser General Public License for
+# more details.
+#
+# You should have received a copy of the GNU Lesser General Public License along with
+# this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
+
+import base64
+import cPickle
+import ctypes
+import fcntl
+import glob
+import os
+import platform
+import re
+import shlex
+import shutil
+import string
+import struct
+import subprocess
+import sys
+import termios
+import time
+import zlib
+
+import fmbtuinput
+
+fmbtuinput.refreshDeviceInfo()
+
+if "--debug" in sys.argv:
+ g_debug = True
+else:
+ g_debug = False
+
+try:
+ _opt_keyboard = [a.split("=")[1] \
+ for a in sys.argv if a.startswith("--keyboard=")][0]
+except IndexError:
+ _opt_keyboard = None
+
+try:
+ _opt_touch = [a.split("=")[1] \
+ for a in sys.argv if a.startswith("--touch=")][0]
+except IndexError:
+ _opt_touch = None
+
+try:
+ _opt_mouse = [a.split("=")[1] \
+ for a in sys.argv if a.startswith("--mouse=")][0]
+except IndexError:
+ _opt_mouse = None
+
+keyboard_device = None
+touch_device = None
+mouse_device = None
+
+
+def openKeyboardDevice(keyboardSpec=None):
+ keyboard_device = None
+ if keyboardSpec == None:
+ try:
+ keyboard_device = openKeyboardDevice("sysrq")
+ except IndexError:
+ keyboard_device = openKeyboardDevice("virtual")
+ elif keyboardSpec in (None, "virtual"):
+ keyboard_device = fmbtuinput.Keyboard().create()
+ elif keyboardSpec.startswith("file:"):
+ keyboard_device = fmbtuinput.Keyboard().open(keyboardSpec.split(":",1)[1])
+ elif keyboardSpec == "sysrq":
+ keyboard_device = fmbtuinput.Keyboard().open(
+ "/dev/input/" + re.findall(
+ '[ =](event[0-9]+)\s',
+ [i for i in devices.split("\n\n") if "sysrq" in i.lower()][0])[0])
+ elif keyboardSpec == "disabled":
+ keyboard_device = None
+ return keyboard_device
+
+
+def openTouchDevice(touchSpec=None, fallback=None):
+ touch_device = None
+ if touchSpec == None:
+ if fallback != None:
+ return openTouchDevice(fallback)
+ else:
+ pass # will return None
+ elif touchSpec.startswith("virtual"):
+ inputResolution=re.findall("virtual:([0-9]*)x([0-9]*)", touchSpec)
+ if inputResolution:
+ maxX = int(inputResolution[0][0])
+ maxY = int(inputResolution[0][1])
+ else:
+ maxX, maxY = None, None
+ touch_device = fmbtuinput.Touch().create(maxX=maxX, maxY=maxY)
+ elif touchSpec.startswith("file:") or touchSpec.startswith("name:"):
+ touch_device = fmbtuinput.Touch().open(touchSpec.split(":",1)[1])
+ elif touchSpec == "disabled":
+ pass # will return None
+ else:
+ raise ValueError('invalid touch device "%s"' % (touchSpec,))
+ return touch_device
+
+
+def openMouseDevice(mouseSpec=None, fallback=None):
+ mouse_device = None
+ if mouseSpec == None:
+ if fallback != None:
+ return openMouseDevice(fallback)
+ else:
+ pass # will return None
+ elif mouseSpec.startswith("virtual:"):
+ abs_or_rel = mouseSpec.split(":",1)[1]
+ if abs_or_rel == "abs":
+ absoluteMove = True
+ elif abs_or_rel == "rel":
+ absoluteMove = False
+ else:
+ raise ValueError('invalid mouse "%s"' % (mouseSpec,))
+ mouse_device = fmbtuinput.Mouse(absoluteMove=absoluteMove).create()
+ elif mouseSpec.startswith("file:") or mouseSpec.startswith("name:"):
+ mouse_device = fmbtuinput.Mouse().open(mouseSpec.split(":",1)[1])
+ elif mouseSpec == "disabled":
+ pass # will return None
+ else:
+ raise ValueError('invalid mouse device "%s"' % (mouseSpec,))
+ return mouse_device
+
+
+def debug(msg):
+ if g_debug:
+ sys.stdout.write("debug: %s\n" % (msg,))
+ sys.stdout.flush()
+
+
+def error(msg, exitstatus=1):
+ sys.stdout.write("fmbttizen-agent: %s\n" % (msg,))
+ sys.stdout.flush()
+ sys.exit(exitstatus)
+
+
+iAmRoot = (os.getuid() == 0)
+
+try:
+ libc = ctypes.CDLL("libc.so.6")
+ libX11 = ctypes.CDLL("libX11.so.6")
+ libXtst = ctypes.CDLL("libXtst.so.6")
+ g_Xavailable = True
+ g_keyb = None # no need for virtual keyboard
+except OSError:
+ g_Xavailable = False
+
+if g_Xavailable:
+ class XImage(ctypes.Structure):
+ _fields_ = [
+ ('width' , ctypes.c_int),
+ ('height' , ctypes.c_int),
+ ('xoffset' , ctypes.c_int),
+ ('format' , ctypes.c_int),
+ ('data' , ctypes.c_void_p),
+ ('byte_order' , ctypes.c_int),
+ ('bitmap_unit' , ctypes.c_int),
+ ('bitmap_bit_order' , ctypes.c_int),
+ ('bitmap_pad' , ctypes.c_int),
+ ('depth' , ctypes.c_int),
+ ('bytes_per_line' , ctypes.c_int),
+ ('bits_per_pixel' , ctypes.c_int)]
+
+ libc.write.argtypes = [ctypes.c_int, ctypes.c_void_p, ctypes.c_size_t]
+ libX11.XAllPlanes.restype = ctypes.c_ulong
+ libX11.XGetImage.restype = ctypes.POINTER(XImage)
+ libX11.XRootWindow.restype = ctypes.c_uint32
+ libX11.XOpenDisplay.restype = ctypes.c_void_p
+ libX11.XDefaultScreen.restype = ctypes.c_int
+ libX11.XGetKeyboardMapping.restype = ctypes.POINTER(ctypes.c_uint32)
+
+ # X11 constants, see Xlib.h
+
+ X_CurrentTime = ctypes.c_ulong(0)
+ X_False = ctypes.c_int(0)
+ X_NULL = ctypes.c_void_p(0)
+ X_True = ctypes.c_int(1)
+ X_ZPixmap = ctypes.c_int(2)
+ NoSymbol = 0
+
+# InputKeys contains key names known to input devices, see
+# linux/input.h or http://www.usb.org/developers/hidpage. The order is
+# significant, because keyCode = InputKeys.index(keyName).
+InputKeys = [
+ "RESERVED", "ESC","1", "2", "3", "4", "5", "6", "7", "8", "9", "0",
+ "MINUS", "EQUAL", "BACKSPACE", "TAB",
+ "Q", "W", "E", "R", "T", "Y", "U", "I", "O", "P",
+ "LEFTBRACE", "RIGHTBRACE", "ENTER", "LEFTCTRL",
+ "A", "S", "D", "F", "G", "H", "J", "K", "L",
+ "SEMICOLON", "APOSTROPHE", "GRAVE", "LEFTSHIFT", "BACKSLASH",
+ "Z", "X", "C", "V", "B", "N", "M",
+ "COMMA", "DOT", "SLASH", "RIGHTSHIFT", "KPASTERISK", "LEFTALT",
+ "SPACE", "CAPSLOCK",
+ "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "F10",
+ "NUMLOCK", "SCROLLLOCK",
+ "KP7", "KP8", "KP9", "KPMINUS",
+ "KP4", "KP5", "KP6", "KPPLUS",
+ "KP1", "KP2", "KP3", "KP0", "KPDOT",
+ "undefined0",
+ "ZENKAKUHANKAKU", "102ND", "F11", "F12", "RO",
+ "KATAKANA", "HIRAGANA", "HENKAN", "KATAKANAHIRAGANA", "MUHENKAN",
+ "KPJPCOMMA", "KPENTER", "RIGHTCTRL", "KPSLASH", "SYSRQ", "RIGHTALT",
+ "LINEFEED", "HOME", "UP", "PAGEUP", "LEFT", "RIGHT", "END", "DOWN",
+ "PAGEDOWN", "INSERT", "DELETE", "MACRO",
+ "MUTE", "VOLUMEDOWN", "VOLUMEUP",
+ "POWER",
+ "KPEQUAL", "KPPLUSMINUS", "PAUSE", "SCALE", "KPCOMMA", "HANGEUL",
+ "HANGUEL", "HANJA", "YEN", "LEFTMETA", "RIGHTMETA", "COMPOSE"]
+
+_inputKeyNameToCode={}
+for c, n in enumerate(InputKeys):
+ _inputKeyNameToCode[n] = c
+
+# See struct input_event in /usr/include/linux/input.h
+if platform.architecture()[0] == "32bit":
+ _input_event = 'IIHHi'
+else:
+ _input_event = 'QQHHi'
+
+# Event and keycodes are in input.h, too.
+_EV_KEY = 0x01
+_EV_ABS = 0x03
+_ABS_X = 0x00
+_ABS_Y = 0x01
+_ABS_MT_SLOT = 0x2f
+_ABS_MT_POSITION_X = 0x35
+_ABS_MT_POSITION_Y = 0x36
+_ABS_MT_TRACKING_ID = 0x39
+
+_BTN_MOUSE = 0x110
+
+# Set input device names (in /proc/bus/input/devices)
+# for pressing hardware keys.
+try:
+ cpuinfo = file("/proc/cpuinfo").read()
+except:
+ cpuinfo = ""
+
+def readDeviceInfo():
+ global devices
+ try:
+ devices = file("/proc/bus/input/devices").read()
+ except:
+ devices = ""
+
+readDeviceInfo()
+kbInputDevFd = None
+
+if iAmRoot:
+ debug("hardware detection uses generic defaults")
+ # Unknown platform, guessing best possible defaults for devices
+ _d = devices.split("\n\n")
+ try:
+ power_devname = re.findall('Name=\"([^"]*)\"', [i for i in _d if "power" in i.lower()][0])[0]
+ except IndexError:
+ power_devname = "gpio-keys"
+
+ touch_device = None
+ try:
+ touch_device_f = "file:/dev/input/" + re.findall('[ =](event[0-9]+)\s', [i for i in _d if "touch" in i.lower()][0])[0]
+ except IndexError:
+ touch_device_f = None
+ touch_device = openTouchDevice(_opt_touch, touch_device_f)
+
+ mouse_device = None
+ try:
+ mouse_device_f = "file:/dev/input/" + re.findall('[ =](event[0-9]+)\s', [i for i in _d if "Mouse" in i][0])[0]
+ except IndexError:
+ mouse_device_f = None
+ mouse_device = openMouseDevice(_opt_mouse, mouse_device_f)
+
+ keyboard_device = openKeyboardDevice(_opt_keyboard)
+
+ hwKeyDevice = {
+ "POWER": power_devname,
+ "VOLUMEUP": "gpio-keys",
+ "VOLUMEDOWN": "gpio-keys",
+ "HOME": "gpio-keys"
+ }
+
+ if isinstance(mouse_device, fmbtuinput.Mouse):
+ time.sleep(1)
+ mouse_device.move(-4096, -4096)
+ mouse_device.setXY(0, 0)
+
+ del _d
+
+if iAmRoot and g_debug:
+ debug("touch device: %s" % (touch_device,))
+ debug("mouse device: %s" % (mouse_device,))
+ debug("keyb device: %s" % (keyboard_device,))
+
+if iAmRoot and _opt_keyboard and "keyboard_device" not in globals():
+ # Use forced keyboard with any hardware type
+ keyboard_device = openKeyboardDevice(_opt_keyboard)
+
+if "touch_device" in globals() and touch_device:
+ mtInputDevFd = touch_device._fd
+
+if "keyboard_device" in globals() and keyboard_device:
+ kbInputDevFd = keyboard_device._fd
+
+
+# Read input devices
+deviceToEventFile = {}
+for _l in devices.splitlines():
+ if _l.startswith('N: Name="'): _device = _l.split('"')[1]
+ elif _l.startswith("H: Handlers=") and "event" in _l:
+ try: deviceToEventFile[_device] = "/dev/input/" + re.findall("(event[0-9]+)", _l)[0]
+ except Exception, e: pass
+
+screenWidth = None
+screenHeight = None
+
+# Connect to X server, get root window size for screenshots
+display = None
+if g_Xavailable:
+ def resetXConnection():
+ global display, current_screen, root_window, X_AllPlanes
+ if display != None:
+ libX11.XCloseDisplay(display)
+ display = libX11.XOpenDisplay(X_NULL)
+ if display == 0 or display == None:
+ error("cannot connect to X server")
+ current_screen = libX11.XDefaultScreen(display)
+ root_window = libX11.XRootWindow(display, current_screen)
+ X_AllPlanes = libX11.XAllPlanes()
+ resetXConnection()
+
+ ref = ctypes.byref
+ __rw = ctypes.c_uint(0)
+ __x = ctypes.c_int(0)
+ __y = ctypes.c_int(0)
+ root_width = ctypes.c_uint(0)
+ root_height = ctypes.c_uint(0)
+ __bwidth = ctypes.c_uint(0)
+ root_depth = ctypes.c_uint(0)
+
+ libX11.XGetGeometry(display, root_window, ref(__rw), ref(__x), ref(__y),
+ ref(root_width), ref(root_height), ref(__bwidth),
+ ref(root_depth))
+
+ cMinKeycode = ctypes.c_int(0)
+ cMaxKeycode = ctypes.c_int(0)
+ cKeysymsPerKeycode = ctypes.c_int(0)
+ libX11.XDisplayKeycodes(display, ref(cMinKeycode), ref(cMaxKeycode))
+ keysyms = libX11.XGetKeyboardMapping(display,
+ cMinKeycode,
+ (cMaxKeycode.value - cMinKeycode.value) + 1,
+ ref(cKeysymsPerKeycode))
+ shiftModifier = libX11.XKeysymToKeycode(display, libX11.XStringToKeysym("Shift_R"))
+
+ screenWidth = root_width.value
+ screenHeight = root_height.value
+
+def read_cmd():
+ return sys.stdin.readline().strip()
+
+def _encode(obj):
+ return base64.b64encode(cPickle.dumps(obj))
+
+def _decode(string):
+ return cPickle.loads(base64.b64decode(string))
+
+def write_response(ok, value):
+ if ok: p = "FMBTAGENT OK "
+ else: p = "FMBTAGENT ERROR "
+ if not g_debug:
+ response = "%s%s\n" % (p, _encode(value))
+ else:
+ response = "%s%s\n" % (p, value)
+ sys.stdout.write(response)
+ sys.stdout.flush()
+
+def sendHwTap(x, y, button):
+ try:
+ if touch_device:
+ touch_device.tap(x, y)
+ else:
+ mouse_device.tap(x, y, button)
+ return True, None
+ except Exception, e:
+ return False, str(e)
+
+def sendHwMove(x, y):
+ try:
+ if touch_device:
+ touch_device.move(x, y)
+ else:
+ mouse_device.move(x, y)
+ return True, None
+ except Exception, e:
+ return False, str(e)
+
+def sendRelMove(x, y):
+ try:
+ mouse_device.setXY(0,0)
+ mouse_device.move(x, y)
+ mouse_device.setXY(0,0)
+ return True, None
+ except Exception, e:
+ return False, str(e)
+
+def sendHwFingerDown(x, y, button):
+ try:
+ if touch_device:
+ touch_device.pressFinger(button, x, y)
+ else:
+ mouse_device.move(x, y)
+ mouse_device.press(button)
+ return True, None
+ except Exception, e:
+ return False, str(e)
+
+def sendHwFingerUp(x, y, button):
+ try:
+ if touch_device:
+ touch_device.releaseFinger(button)
+ else:
+ mouse_device.move(x, y)
+ mouse_device.release(button)
+ return True, None
+ except Exception, e:
+ return False, str(e)
+
+def sendHwKey(keyName, delayBeforePress, delayBeforeRelease):
+ keyName = keyName.upper()
+ if keyName.startswith("KEY_"):
+ keyName = keyName.lstrip("KEY_")
+ fd = None
+ closeFd = False
+ try:
+ # Explicit IO device defined for the key?
+ inputDevice = deviceToEventFile[hwKeyDevice[keyName]]
+ except:
+ # Fall back to giving input with keyboard - given that there is one
+ if not kbInputDevFd:
+ return False, 'No input device for key "%s"' % (keyName,)
+ fd = kbInputDevFd
+ try: keyCode = _inputKeyNameToCode[keyName]
+ except KeyError:
+ try: keyCode = fmbtuinput.toKeyCode(keyName)
+ except ValueError: return False, 'No keycode for key "%s"' % (keyName,)
+ try:
+ if not fd:
+ fd = os.open(inputDevice, os.O_WRONLY | os.O_NONBLOCK)
+ closeFd = True
+ except: return False, 'Unable to open input device "%s" for writing' % (inputDevice,)
+ if delayBeforePress > 0: time.sleep(delayBeforePress)
+ if delayBeforePress >= 0:
+ if os.write(fd, struct.pack(_input_event, int(time.time()), 0, _EV_KEY, keyCode, 1)) > 0:
+ os.write(fd, struct.pack(_input_event, 0, 0, 0, 0, 0))
+ if delayBeforeRelease > 0: time.sleep(delayBeforeRelease)
+ if delayBeforeRelease >= 0:
+ if os.write(fd, struct.pack(_input_event, int(time.time()), 0, _EV_KEY, keyCode, 0)) > 0:
+ os.write(fd, struct.pack(_input_event, 0, 0, 0, 0, 0))
+ if closeFd:
+ os.close(fd)
+ return True, None
+
+def specialCharToXString(c):
+ c2s = {'\n': "Return",
+ ' ': "space", '!': "exclam", '"': "quotedbl",
+ '#': "numbersign", '$': "dollar", '%': "percent",
+ '&': "ampersand", "'": "apostrophe",
+ '(': "parenleft", ')': "parenright", '*': "asterisk",
+ '+': "plus", '-': "minus", '.': "period", '/': "slash",
+ ':': "colon", ';': "semicolon", '<': "less", '=': "equal",
+ '>': "greater", '?': "question", '@': "at",
+ '_': "underscore"}
+ return c2s.get(c, c)
+
+def specialCharToUsKeys(c):
+ # character -> ([modifier, [modifier...]] keycode)
+ c2s = {'\n': ("KEY_ENTER",),
+ ' ': ("KEY_SPACE",),
+ '`': ("KEY_GRAVE",), '~': ("KEY_LEFTSHIFT", "KEY_GRAVE"),
+ '!': ("KEY_LEFTSHIFT", "KEY_1"),
+ '@': ("KEY_LEFTSHIFT", "KEY_2"),
+ '#': ("KEY_LEFTSHIFT", "KEY_3"),
+ '$': ("KEY_LEFTSHIFT", "KEY_4"),
+ '%': ("KEY_LEFTSHIFT", "KEY_5"),
+ '^': ("KEY_LEFTSHIFT", "KEY_6"),
+ '&': ("KEY_LEFTSHIFT", "KEY_7"),
+ '*': ("KEY_LEFTSHIFT", "KEY_8"),
+ '(': ("KEY_LEFTSHIFT", "KEY_9"),
+ ')': ("KEY_LEFTSHIFT", "KEY_0"),
+ '-': ("KEY_MINUS",), '_': ("KEY_LEFTSHIFT", "KEY_MINUS"),
+ '=': ("KEY_EQUAL",), '+': ("KEY_LEFTSHIFT", "KEY_EQUAL"),
+ '\t': ("KEY_TAB",),
+ '[': ("KEY_LEFTBRACE",), '{': ("KEY_LEFTSHIFT", "KEY_LEFTBRACE"),
+ ']': ("KEY_RIGHTBRACE",), '}': ("KEY_LEFTSHIFT", "KEY_RIGHTBRACE"),
+ ';': ("KEY_SEMICOLON",), ':': ("KEY_LEFTSHIFT", "KEY_SEMICOLON"),
+ "'": ("KEY_APOSTROPHE",), '"': ("KEY_LEFTSHIFT", "KEY_APOSTROPHE"),
+ '\\': ("KEY_BACKSLASH",), '|': ("KEY_LEFTSHIFT", "KEY_BACKSLASH"),
+ ',': ("KEY_COMMA",), '<': ("KEY_LEFTSHIFT", "KEY_COMMA"),
+ '.': ("KEY_DOT",), '>': ("KEY_LEFTSHIFT", "KEY_DOT"),
+ '/': ("KEY_SLASH",), '?': ("KEY_LEFTSHIFT", "KEY_SLASH"),
+ }
+ return c2s.get(c, c)
+
+mtEvents = {} # slot -> (tracking_id, x, y)
+
+def inputEventSend(inputDevFd, eventType, event, param):
+ t = time.time()
+ tsec = int(t)
+ tusec = int(1000000*(t-tsec))
+ os.write(inputDevFd, struct.pack(_input_event,
+ tsec, tusec, eventType, event, param))
+
+def mtEventSend(eventType, event, param):
+ """multitouch device event"""
+ return inputEventSend(mtInputDevFd, eventType, event, param)
+
+def mtGestureStart(x, y):
+ mtGestureStart.trackingId += 1
+ trackingId = mtGestureStart.trackingId
+
+ for freeSlot in xrange(16):
+ if not freeSlot in mtEvents: break
+ else: raise ValueError("No free multitouch event slots available")
+
+ mtEvents[freeSlot] = [trackingId, x, y]
+
+ mtEventSend(_EV_ABS, _ABS_MT_SLOT, freeSlot)
+ mtEventSend(_EV_ABS, _ABS_MT_TRACKING_ID, trackingId)
+ mtEventSend(_EV_ABS, _ABS_MT_POSITION_X, x)
+ mtEventSend(_EV_ABS, _ABS_MT_POSITION_Y, y)
+ mtEventSend(_EV_ABS, _ABS_X, x)
+ mtEventSend(_EV_ABS, _ABS_Y, y)
+ mtEventSend(0, 0, 0) # SYNC
+ return freeSlot
+mtGestureStart.trackingId = 0
+
+def mtGestureMove(slot, x, y):
+ if x == mtEvents[slot][1] and y == mtEvents[slot][2]: return
+ mtEventSend(_EV_ABS, _ABS_MT_SLOT, slot)
+ mtEventSend(_EV_ABS, _ABS_MT_TRACKING_ID, mtEvents[slot][0])
+ if x != mtEvents[slot][1] and 0 <= x <= root_width:
+ mtEventSend(_EV_ABS, _ABS_MT_POSITION_X, x)
+ mtEvents[slot][1] = x
+ if y != mtEvents[slot][2] and 0 <= y <= root_height:
+ mtEventSend(_EV_ABS, _ABS_MT_POSITION_Y, y)
+ mtEvents[slot][2] = y
+ if 0 <= x <= root_width:
+ mtEventSend(_EV_ABS, _ABS_X, x)
+ if 0 <= y <= root_height:
+ mtEventSend(_EV_ABS, _ABS_Y, y)
+ mtEventSend(0, 0, 0)
+
+def mtGestureEnd(slot):
+ mtEventSend(_EV_ABS, _ABS_MT_SLOT, slot)
+ mtEventSend(_EV_ABS, _ABS_MT_TRACKING_ID, -1)
+ mtEventSend(0, 0, 0) # SYNC
+ del mtEvents[slot]
+
+def mtLinearGesture(listOfStartEndPoints, duration, movePoints, sleepBeforeMove=0, sleepAfterMove=0):
+ # listOfStartEndPoints: [ [(finger1startX, finger1startY), (finger1endX, finger1endY)],
+ # [(finger2startX, finger2startY), (finger2endX, finger2endY)], ...]
+ startPoints = [startEnd[0] for startEnd in listOfStartEndPoints]
+ xDist = [startEnd[1][0] - startEnd[0][0] for startEnd in listOfStartEndPoints]
+ yDist = [startEnd[1][1] - startEnd[0][1] for startEnd in listOfStartEndPoints]
+ movePointsF = float(movePoints)
+ fingers = []
+ for (x, y) in startPoints:
+ fingers.append(mtGestureStart(x, y))
+
+ if sleepBeforeMove > 0: time.sleep(sleepBeforeMove)
+
+ if movePoints > 0:
+ intermediateSleep = float(duration) / movePoints
+ for i in xrange(1, movePoints + 1):
+ if intermediateSleep > 0:
+ time.sleep(intermediateSleep)
+ for fingerIndex, finger in enumerate(fingers):
+ mtGestureMove(finger,
+ startPoints[fingerIndex][0] + int(xDist[fingerIndex]*i/movePointsF),
+ startPoints[fingerIndex][1] + int(yDist[fingerIndex]*i/movePointsF))
+
+ if sleepAfterMove > 0: time.sleep(sleepAfterMove)
+
+ for finger in fingers:
+ mtGestureEnd(finger)
+ return True, None
+
+def typeCharX(origChar):
+ modifiers = []
+ c = specialCharToXString(origChar)
+ keysym = libX11.XStringToKeysym(c)
+ if keysym == NoSymbol:
+ return False
+ keycode = libX11.XKeysymToKeycode(display, keysym)
+
+ first = (keycode - cMinKeycode.value) * cKeysymsPerKeycode.value
+
+ try:
+ if chr(keysyms[first + 1]) == origChar:
+ modifiers.append(shiftModifier)
+ except ValueError: pass
+
+ for m in modifiers:
+ libXtst.XTestFakeKeyEvent(display, m, X_True, X_CurrentTime)
+
+ libXtst.XTestFakeKeyEvent(display, keycode, X_True, X_CurrentTime)
+ libXtst.XTestFakeKeyEvent(display, keycode, X_False, X_CurrentTime)
+
+ for m in modifiers[::-1]:
+ libXtst.XTestFakeKeyEvent(display, m, X_False, X_CurrentTime)
+ return True
+
+def typeCharHw(origChar):
+ for c in origChar:
+ modifiers = []
+ keyCode = None
+ c = specialCharToUsKeys(c)
+ if isinstance(c, tuple):
+ modifiers = c[:-1]
+ keyCode = c[-1]
+ elif c in string.uppercase:
+ modifiers = ["KEY_LEFTSHIFT"]
+ keyCode = "KEY_" + c
+ elif c in string.lowercase or c in string.digits:
+ keyCode = "KEY_" + c.upper()
+ else:
+ # do not know how to type the character
+ pass
+ if keyCode:
+ for m in modifiers:
+ keyboard_device.press(m)
+ keyboard_device.tap(keyCode)
+ for m in modifiers[::-1]:
+ keyboard_device.release(m)
+ return True
+
+if g_Xavailable:
+ typeChar = typeCharX
+else:
+ typeChar = typeCharHw
+
+def typeSequence(s, delayBetweenChars=0):
+ skipped = []
+ for c in s:
+ if not typeChar(c):
+ skipped.append(c)
+ if delayBetweenChars != 0:
+ time.sleep(delayBetweenChars)
+ if skipped: return False, skipped
+ else: return True, skipped
+
+def takeScreenshotOnX():
+ image_p = libX11.XGetImage(display, root_window,
+ 0, 0, root_width, root_height,
+ X_AllPlanes, X_ZPixmap)
+ image = image_p[0]
+ # FMBTRAWX11 image format header:
+ # FMBTRAWX11 [width] [height] [color depth] [bits per pixel]<linefeed>
+ # Binary data
+ rawfmbt_header = "FMBTRAWX11 %d %d %d %d\n" % (
+ image.width, image.height, root_depth.value, image.bits_per_pixel)
+ rawfmbt_data = ctypes.string_at(image.data, image.height * image.bytes_per_line)
+ compressed_image = rawfmbt_header + zlib.compress(rawfmbt_data, 3)
+ libX11.XDestroyImage(image_p)
+ return True, compressed_image
+
+def westonTakeScreenshotRoot(retry=2):
+ if westonTakeScreenshotRoot.ssFilenames == None:
+ westonTakeScreenshotRoot.ssFilenames = findWestonScreenshotFilenames()
+ if not westonTakeScreenshotRoot.ssFilenames:
+ return False, "cannot find weston screenshot directory"
+ try:
+ for ssFilename in westonTakeScreenshotRoot.ssFilenames:
+ if os.access(ssFilename, os.R_OK):
+ os.remove(ssFilename)
+ keyboard_device.press("KEY_LEFTMETA")
+ keyboard_device.tap("s")
+ keyboard_device.release("KEY_LEFTMETA")
+ time.sleep(0.5)
+ # find which screenshot file got created?
+ for ssFilename in westonTakeScreenshotRoot.ssFilenames:
+ if os.access(ssFilename, os.R_OK):
+ break
+ else:
+ if retry > 0:
+ return westonTakeScreenshotRoot(retry-1)
+ else:
+ return False, "weston did not create any of files %s" % (
+ westonTakeScreenshotRoot.ssFilenames,)
+ # wait for the screenshot writer to finish
+ writerPid = fuser(ssFilename)
+ if writerPid != None:
+ time.sleep(0.1)
+ while fuser(ssFilename, [writerPid]) != None:
+ time.sleep(0.1)
+ shutil.move(ssFilename, "/tmp/screenshot.png")
+ os.chmod("/tmp/screenshot.png", 0666)
+ except Exception, e:
+ return False, str(e)
+ return True, None
+westonTakeScreenshotRoot.ssFilenames = None
+
+def takeScreenshotOnWeston():
+ if iAmRoot:
+ rv, status = westonTakeScreenshotRoot()
+ else:
+ rv, status = subAgentCommand("root", "tizen", "ss weston-root")
+ if rv == False:
+ return rv, status
+ return True, file("/tmp/screenshot.png").read()
+
+def fuser(filename, usualSuspects=None):
+ """Returns the pid of a user of given file, or None"""
+ filepath = os.path.realpath(filename)
+ if not os.access(filepath, os.R_OK):
+ raise ValueError('No such file: "%s"' % (filename,))
+ if usualSuspects == None:
+ procFds = glob.glob("/proc/[1-9][0-9][0-9]*/fd/*")
+ else:
+ procFds = []
+ for pid in usualSuspects:
+ procFds.extend(glob.glob("/proc/%s/fd/*" % (pid,)))
+ for symlink in procFds:
+ try:
+ if os.path.realpath(symlink) == filepath:
+ return int(symlink.split('/')[2])
+ except OSError:
+ pass
+
+def findWestonScreenshotFilenames():
+ # find weston cwd
+ dirs = []
+ for exe in glob.glob("/proc/[1-9][0-9][0-9]*/exe"):
+ try:
+ if os.path.realpath(exe) == "/usr/bin/weston":
+ dirs.append(os.path.realpath(os.path.dirname(exe) + "/cwd"))
+ except OSError:
+ pass
+ return [d + "/wayland-screenshot.png" for d in sorted(set(dirs))]
+
+if g_Xavailable:
+ takeScreenshot = takeScreenshotOnX
+else:
+ takeScreenshot = takeScreenshotOnWeston
+
+def shellSOE(command, asyncStatus, asyncOut, asyncError, usePty):
+ if usePty:
+ command = '''python -c "import pty; pty.spawn(%s)" ''' % (repr(shlex.split(command)),),
+ if (asyncStatus, asyncOut, asyncError) != (None, None, None):
+ # prepare for decoupled asynchronous execution
+ if asyncStatus == None: asyncStatus = "/dev/null"
+ if asyncOut == None: asyncOut = "/dev/null"
+ if asyncError == None: asyncError = "/dev/null"
+ try:
+ stdinFile = file("/dev/null", "r")
+ stdoutFile = file(asyncOut, "a+")
+ stderrFile = file(asyncError, "a+", 0)
+ statusFile = file(asyncStatus, "a+")
+ except IOError, e:
+ return False, (None, None, e)
+ try:
+ if os.fork() > 0:
+ # parent returns after successful fork, there no
+ # direct visibility to async child process beyond this
+ # point.
+ stdinFile.close()
+ stdoutFile.close()
+ stderrFile.close()
+ statusFile.close()
+ return True, (0, None, None) # async parent finishes here
+ except OSError, e:
+ return False, (None, None, e)
+ os.setsid()
+ else:
+ stdinFile = subprocess.PIPE
+ stdoutFile = subprocess.PIPE
+ stderrFile = subprocess.PIPE
+ try:
+ p = subprocess.Popen(command, shell=True,
+ stdin=stdinFile,
+ stdout=stdoutFile,
+ stderr=stderrFile,
+ close_fds=True)
+ except Exception, e:
+ return False, (None, None, e)
+ if asyncStatus == None and asyncOut == None and asyncError == None:
+ # synchronous execution, read stdout and stderr
+ out, err = p.communicate()
+ else:
+ # asynchronous execution, store status to file
+ statusFile.write(str(p.wait()) + "\n")
+ statusFile.close()
+ out, err = None, None
+ sys.exit(0) # async child finishes here
+ return True, (p.returncode, out, err)
+
+def waitOutput(nonblockingFd, acceptedOutputs, timeout, pollInterval=0.1):
+ start = time.time()
+ endTime = start + timeout
+ s = ""
+ try: s += nonblockingFd.read()
+ except IOError: pass
+ foundOutputs = [ao for ao in acceptedOutputs if ao in s]
+ while len(foundOutputs) == 0 and time.time() < endTime:
+ time.sleep(pollInterval)
+ try: s += nonblockingFd.read()
+ except IOError: pass
+ foundOutputs = [ao for ao in acceptedOutputs if ao in s]
+ return foundOutputs, s
+
+_subAgents = {}
+def openSubAgent(username, password):
+ p = subprocess.Popen('''python -c 'import pty; pty.spawn(["su", "-c", "python /tmp/fmbttizen-agent.py --sub-agent", "-", "%s"])' ''' % (username,),
+ shell=True,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+
+ # Read in non-blocking mode to ensure agent starts correctly
+ fl = fcntl.fcntl(p.stdout.fileno(), fcntl.F_GETFL)
+ fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
+
+ output2 = ""
+ seenPrompts, output1 = waitOutput(p.stdout, ["Password:", "FMBTAGENT"], 5.0)
+ if "Password:" in seenPrompts:
+ p.stdin.write(password + "\r")
+ output1 = ""
+ seenPrompts, output2 = waitOutput(p.stdout, ["FMBTAGENT"], 5.0)
+
+ if not "FMBTAGENT" in seenPrompts:
+ p.terminate()
+ return (None, 'fMBT agent with username "%s" does not answer.' % (username,),
+ output1 + output2)
+
+ # Agent is alive, continue in blocking mode
+ fcntl.fcntl(p.stdout.fileno(), fcntl.F_SETFL, fl)
+
+ return p, "", ""
+
+def subAgentCommand(username, password, cmd):
+ if not username in _subAgents:
+ process, output, error = openSubAgent(username, password)
+ if process == None:
+ return None, (-1, output, error)
+ else:
+ _subAgents[username] = process
+ p = _subAgents[username]
+ p.stdin.write(cmd + "\r")
+ p.stdin.flush()
+ answer = p.stdout.readline().rstrip()
+ if answer.startswith("FMBTAGENT OK "):
+ return True, _decode(answer[len("FMBTAGENT OK "):])
+ else:
+ return False, _decode(answer[len("FMBTAGENT ERROR "):])
+
+def closeSubAgents():
+ for username in _subAgents:
+ subAgentCommand(username, None, "quit")
+
+if __name__ == "__main__":
+ try:
+ origTermAttrs = termios.tcgetattr(sys.stdin.fileno())
+ hasTerminal = True
+ except termios.error:
+ origTermAttrs = None
+ hasTerminal = False
+ if hasTerminal and not "--keep-echo" in sys.argv and not "--debug" in sys.argv:
+ # Disable terminal echo
+ newTermAttrs = origTermAttrs
+ newTermAttrs[3] = origTermAttrs[3] & ~termios.ECHO
+ termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, newTermAttrs)
+
+ if "--no-x" in sys.argv:
+ debug("X disabled")
+ g_Xavailable = False
+
+ platformInfo = {}
+ platformInfo["input devices"] = fmbtuinput._g_deviceNames.keys()
+
+ # Send version number, enter main loop
+ write_response(True, platformInfo)
+ cmd = read_cmd()
+ while cmd:
+ if cmd.startswith("bl "): # set display backlight time
+ if iAmRoot:
+ timeout = int(cmd[3:].strip())
+ try:
+ file("/opt/var/kdb/db/setting/lcd_backlight_normal","wb").write(struct.pack("ii",0x29,timeout))
+ write_response(True, None)
+ except Exception, e: write_response(False, e)
+ else:
+ write_response(*subAgentCommand("root", "tizen", cmd))
+ elif cmd.startswith("er "): # event recorder
+ if iAmRoot:
+ cmd, arg = cmd.split(" ", 1)
+ if arg.startswith("start "):
+ filterOpts = _decode(arg.split()[1])
+ if touch_device:
+ filterOpts["touchScreen"] = touch_device
+ fmbtuinput.startQueueingEvents(filterOpts)
+ write_response(True, None)
+ elif arg == "stop":
+ events = fmbtuinput.stopQueueingEvents()
+ write_response(True, None)
+ elif arg == "fetch":
+ events = fmbtuinput.fetchQueuedEvents()
+ write_response(True, events)
+ else:
+ write_response(*subAgentCommand("root", "tizen", cmd))
+ elif cmd.startswith("gd"): # get display status
+ try:
+ p = subprocess.Popen(['/usr/bin/xset', 'q'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ out, err = p.communicate()
+ if "Monitor is Off" in out: write_response(True, "Off")
+ elif "Monitor is On" in out: write_response(True, "On")
+ else: write_response(False, err)
+ except Exception, e: write_response(False, e)
+ elif cmd.startswith("tm "): # touch move(x, y)
+ xs, ys = cmd[3:].strip().split()
+ if g_Xavailable:
+ libXtst.XTestFakeMotionEvent(display, current_screen, int(xs), int(ys), X_CurrentTime)
+ libX11.XFlush(display)
+ else:
+ if iAmRoot: rv, msg = sendHwMove(int(xs), int(ys))
+ else: rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(True, None)
+ elif cmd.startswith("tr "): # relative move(x, y)
+ xd, yd = cmd[3:].strip().split()
+ if iAmRoot: rv, msg = sendRelMove(int(xd), int(yd))
+ else: rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(True, None)
+ elif cmd.startswith("tt "): # touch tap(x, y, button)
+ x, y, button = [int(i) for i in cmd[3:].strip().split()]
+ if g_Xavailable:
+ libXtst.XTestFakeMotionEvent(display, current_screen, x, y, X_CurrentTime)
+ libXtst.XTestFakeButtonEvent(display, button, X_True, X_CurrentTime)
+ libXtst.XTestFakeButtonEvent(display, button, X_False, X_CurrentTime)
+ libX11.XFlush(display)
+ rv, msg = True, None
+ else:
+ if iAmRoot: rv, msg = sendHwTap(x, y, button-1)
+ else: rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(rv, msg)
+ elif cmd.startswith("td "): # touch down(x, y, button)
+ xs, ys, button = cmd[3:].strip().split()
+ button = int(button)
+ if g_Xavailable:
+ libXtst.XTestFakeMotionEvent(display, current_screen, int(xs), int(ys), X_CurrentTime)
+ libXtst.XTestFakeButtonEvent(display, button, X_True, X_CurrentTime)
+ libX11.XFlush(display)
+ else:
+ if iAmRoot: rv, msg = sendHwFingerDown(int(xs), int(ys), button-1)
+ else: rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(True, None)
+ elif cmd.startswith("tu "): # touch up(x, y, button)
+ xs, ys, button = cmd[3:].strip().split()
+ button = int(button)
+ if g_Xavailable:
+ libXtst.XTestFakeMotionEvent(display, current_screen, int(xs), int(ys), X_CurrentTime)
+ libXtst.XTestFakeButtonEvent(display, button, X_False, X_CurrentTime)
+ libX11.XFlush(display)
+ else:
+ if iAmRoot: rv, msg = sendHwFingerUp(int(xs), int(ys), button-1)
+ else: rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(True, None)
+ elif cmd.startswith("kd "): # hw key down
+ if iAmRoot: rv, msg = sendHwKey(cmd[3:], 0, -1)
+ else: rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(rv, msg)
+ elif cmd.startswith("kn"): # list input key names
+ if "hwKeyDevice" in globals():
+ hk = hwKeyDevice.keys()
+ else:
+ hk = []
+ if "keyboard_device" in globals():
+ ik = InputKeys
+ else:
+ ik = []
+ write_response(True, sorted(ik + hk))
+ elif cmd.startswith("kp "): # hw key press
+ if iAmRoot: rv, msg = sendHwKey(cmd[3:], 0, 0)
+ else: rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(rv, msg)
+ elif cmd.startswith("ku "): # hw key up
+ if iAmRoot: rv, msg = sendHwKey(cmd[3:], -1, 0)
+ else: rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(rv, msg)
+ elif cmd.startswith("kt "): # send x events
+ if g_Xavailable:
+ rv, skippedSymbols = typeSequence(_decode(cmd[3:]))
+ libX11.XFlush(display)
+ elif iAmRoot:
+ rv, skippedSymbols = typeSequence(_decode(cmd[3:]),
+ delayBetweenChars=0.05)
+ else:
+ rv, skippedSymbols = subAgentCommand("root", "tizen", cmd)
+ write_response(rv, skippedSymbols)
+ elif cmd.startswith("ml "): # send multitouch linear gesture
+ if iAmRoot:
+ rv, _ = mtLinearGesture(*_decode(cmd[3:]))
+ else:
+ rv, _ = subAgentCommand("root", "tizen", cmd)
+ write_response(rv, _)
+ elif cmd.startswith("ss"): # save screenshot
+ if "R" in cmd.split() and g_Xavailable:
+ resetXConnection()
+ if "weston-root" in cmd.split(): # do Weston root part only
+ write_response(*westonTakeScreenshotRoot())
+ else:
+ rv, compressedImage = takeScreenshot()
+ write_response(rv, compressedImage)
+ elif cmd.startswith("sd "): # set screen dimensions (width and height)
+ _sw, _sh = cmd[3:].split()
+ screenWidth, screenHeight = int(_sw), int(_sh)
+ if iAmRoot:
+ if touch_device:
+ touch_device.setScreenSize((screenWidth, screenHeight))
+ rv, msg = True, None
+ else:
+ rv, msg = True, "no touch device"
+ else:
+ rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(rv, msg)
+ elif cmd.startswith("sa "): # set screenshot rotation angle (degrees)
+ if iAmRoot:
+ if touch_device:
+ _sa = int(cmd[3:])
+ # compensate it with opposite rotation
+ touch_device.setScreenAngle(-_sa)
+ rv, msg = True, None
+ else:
+ rv, msg = True, "no touch device"
+ else:
+ rv, msg = subAgentCommand("root", "tizen", cmd)
+ write_response(rv, msg)
+ elif cmd.startswith("es "): # execute shell
+ shellCmd, username, password, asyncStatus, asyncOut, asyncError, usePty = _decode(cmd[3:])
+ if username == "":
+ rv, soe = shellSOE(shellCmd, asyncStatus, asyncOut, asyncError, usePty)
+ else:
+ rv, soe = subAgentCommand(username, password,
+ "es " + _encode((shellCmd, "", "", asyncStatus, asyncOut, asyncError, usePty)))
+ write_response(rv, soe)
+ elif cmd.startswith("quit"): # quit
+ write_response(rv, True)
+ break
+ else:
+ write_response(False, 'Unknown command: "%s"' % (cmd,))
+ cmd = read_cmd()
+
+ closeSubAgents()
+
+ if g_Xavailable:
+ libX11.XCloseDisplay(display)
+
+ if hasTerminal:
+ termios.tcsetattr(sys.stdin.fileno(), termios.TCSANOW, origTermAttrs)
--- /dev/null
+# fMBT, free Model Based Testing tool
+# Copyright (c) 2013, Intel Corporation.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms and conditions of the GNU Lesser General Public License,
+# version 2.1, 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 Lesser General Public
+# License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA
+# 02110-1301 USA.
+
+# pylint: disable = C0103, C0111, R0913
+
+"""
+This library offers Python interface for Linux uinput system.
+
+Mouse, Touch and Keyboard classes can be used for
+creating new mouse, touch and keyboard devices and synthesizing user
+inputs through those devices.
+"""
+
+cmdline_usage = """
+Usage: python fmbtuinput.py -p <list-of-input-device-files>
+
+Example: python fmbtuinput.py -p /dev/input/event*
+"""
+
+import array
+import glob
+import os
+import platform
+import re
+import struct
+import thread
+import time
+import Queue
+
+if os.name != "nt":
+ import fcntl
+else:
+ class fcntl:
+ def __getattr__(self, attr):
+ raise NotImplementedError("%s not available on Windows" % (attr,))
+
+# See /usr/include/linux/input.h
+eventTypes = {
+ "EV_SYN": 0x00,
+ "EV_KEY": 0x01,
+ "EV_REL": 0x02,
+ "EV_ABS": 0x03,
+ "EV_MSC": 0x04,
+ "EV_SW": 0x05,
+ "EV_LED": 0x11,
+ "EV_SND": 0x12,
+ "EV_REP": 0x14,
+ "EV_FF": 0x15,
+ "EV_PWR": 0x16,
+ "EV_FF_STATUS": 0x17,
+ "EV_MAX": 0x1f,
+ }
+
+keyCodes = {
+ "KEY_RESERVED": 0,
+ "KEY_ESC": 1,
+ "KEY_1": 2,
+ "KEY_2": 3,
+ "KEY_3": 4,
+ "KEY_4": 5,
+ "KEY_5": 6,
+ "KEY_6": 7,
+ "KEY_7": 8,
+ "KEY_8": 9,
+ "KEY_9": 10,
+ "KEY_0": 11,
+ "KEY_MINUS": 12,
+ "KEY_EQUAL": 13,
+ "KEY_BACKSPACE": 14,
+ "KEY_TAB": 15,
+ "KEY_Q": 16,
+ "KEY_W": 17,
+ "KEY_E": 18,
+ "KEY_R": 19,
+ "KEY_T": 20,
+ "KEY_Y": 21,
+ "KEY_U": 22,
+ "KEY_I": 23,
+ "KEY_O": 24,
+ "KEY_P": 25,
+ "KEY_LEFTBRACE": 26,
+ "KEY_RIGHTBRACE": 27,
+ "KEY_ENTER": 28,
+ "KEY_LEFTCTRL": 29,
+ "KEY_A": 30,
+ "KEY_S": 31,
+ "KEY_D": 32,
+ "KEY_F": 33,
+ "KEY_G": 34,
+ "KEY_H": 35,
+ "KEY_J": 36,
+ "KEY_K": 37,
+ "KEY_L": 38,
+ "KEY_SEMICOLON": 39,
+ "KEY_APOSTROPHE": 40,
+ "KEY_GRAVE": 41,
+ "KEY_LEFTSHIFT": 42,
+ "KEY_BACKSLASH": 43,
+ "KEY_Z": 44,
+ "KEY_X": 45,
+ "KEY_C": 46,
+ "KEY_V": 47,
+ "KEY_B": 48,
+ "KEY_N": 49,
+ "KEY_M": 50,
+ "KEY_COMMA": 51,
+ "KEY_DOT": 52,
+ "KEY_SLASH": 53,
+ "KEY_RIGHTSHIFT": 54,
+ "KEY_KPASTERISK": 55,
+ "KEY_LEFTALT": 56,
+ "KEY_SPACE": 57,
+ "KEY_CAPSLOCK": 58,
+ "KEY_F1": 59,
+ "KEY_F2": 60,
+ "KEY_F3": 61,
+ "KEY_F4": 62,
+ "KEY_F5": 63,
+ "KEY_F6": 64,
+ "KEY_F7": 65,
+ "KEY_F8": 66,
+ "KEY_F9": 67,
+ "KEY_F10": 68,
+ "KEY_NUMLOCK": 69,
+ "KEY_SCROLLLOCK": 70,
+ "KEY_KP7": 71,
+ "KEY_KP8": 72,
+ "KEY_KP9": 73,
+ "KEY_KPMINUS": 74,
+ "KEY_KP4": 75,
+ "KEY_KP5": 76,
+ "KEY_KP6": 77,
+ "KEY_KPPLUS": 78,
+ "KEY_KP1": 79,
+ "KEY_KP2": 80,
+ "KEY_KP3": 81,
+ "KEY_KP0": 82,
+ "KEY_KPDOT": 83,
+
+ "KEY_ZENKAKUHANKAKU": 85,
+ "KEY_102ND": 86,
+ "KEY_F11": 87,
+ "KEY_F12": 88,
+ "KEY_RO": 89,
+ "KEY_KATAKANA": 90,
+ "KEY_HIRAGANA": 91,
+ "KEY_HENKAN": 92,
+ "KEY_KATAKANAHIRAGANA": 93,
+ "KEY_MUHENKAN": 94,
+ "KEY_KPJPCOMMA": 95,
+ "KEY_KPENTER": 96,
+ "KEY_RIGHTCTRL": 97,
+ "KEY_KPSLASH": 98,
+ "KEY_SYSRQ": 99,
+ "KEY_RIGHTALT": 100,
+ "KEY_LINEFEED": 101,
+ "KEY_HOME": 102,
+ "KEY_UP": 103,
+ "KEY_PAGEUP": 104,
+ "KEY_LEFT": 105,
+ "KEY_RIGHT": 106,
+ "KEY_END": 107,
+ "KEY_DOWN": 108,
+ "KEY_PAGEDOWN": 109,
+ "KEY_INSERT": 110,
+ "KEY_DELETE": 111,
+ "KEY_MACRO": 112,
+ "KEY_MUTE": 113,
+ "KEY_VOLUMEDOWN": 114,
+ "KEY_VOLUMEUP": 115,
+ "KEY_POWER": 116,
+ "KEY_KPEQUAL": 117,
+ "KEY_KPPLUSMINUS": 118,
+ "KEY_PAUSE": 119,
+ "KEY_SCALE": 120,
+
+ "KEY_KPCOMMA": 121,
+ "KEY_HANGEUL": 122,
+ "KEY_HANJA": 123,
+ "KEY_YEN": 124,
+ "KEY_LEFTMETA": 125,
+ "KEY_RIGHTMETA": 126,
+ "KEY_COMPOSE": 127,
+
+ "KEY_STOP": 128,
+ "KEY_AGAIN": 129,
+ "KEY_PROPS": 130,
+ "KEY_UNDO": 131,
+ "KEY_FRONT": 132,
+ "KEY_COPY": 133,
+ "KEY_OPEN": 134,
+ "KEY_PASTE": 135,
+ "KEY_FIND": 136,
+ "KEY_CUT": 137,
+ "KEY_HELP": 138,
+ "KEY_MENU": 139,
+ "KEY_CALC": 140,
+ "KEY_SETUP": 141,
+ "KEY_SLEEP": 142,
+ "KEY_WAKEUP": 143,
+ "KEY_FILE": 144,
+ "KEY_SENDFILE": 145,
+ "KEY_DELETEFILE": 146,
+ "KEY_XFER": 147,
+ "KEY_PROG1": 148,
+ "KEY_PROG2": 149,
+ "KEY_WWW": 150,
+ "KEY_MSDOS": 151,
+ "KEY_COFFEE": 152,
+ "KEY_DIRECTION": 153,
+ "KEY_CYCLEWINDOWS": 154,
+ "KEY_MAIL": 155,
+ "KEY_BOOKMARKS": 156,
+ "KEY_COMPUTER": 157,
+ "KEY_BACK": 158,
+ "KEY_FORWARD": 159,
+ "KEY_CLOSECD": 160,
+ "KEY_EJECTCD": 161,
+ "KEY_EJECTCLOSECD": 162,
+ "KEY_NEXTSONG": 163,
+ "KEY_PLAYPAUSE": 164,
+ "KEY_PREVIOUSSONG": 165,
+ "KEY_STOPCD": 166,
+ "KEY_RECORD": 167,
+ "KEY_REWIND": 168,
+ "KEY_PHONE": 169,
+ "KEY_ISO": 170,
+ "KEY_CONFIG": 171,
+ "KEY_HOMEPAGE": 172,
+ "KEY_REFRESH": 173,
+ "KEY_EXIT": 174,
+ "KEY_MOVE": 175,
+ "KEY_EDIT": 176,
+ "KEY_SCROLLUP": 177,
+ "KEY_SCROLLDOWN": 178,
+ "KEY_KPLEFTPAREN": 179,
+ "KEY_KPRIGHTPAREN": 180,
+ "KEY_NEW": 181,
+ "KEY_REDO": 182,
+
+ "KEY_F13": 183,
+ "KEY_F14": 184,
+ "KEY_F15": 185,
+ "KEY_F16": 186,
+ "KEY_F17": 187,
+ "KEY_F18": 188,
+ "KEY_F19": 189,
+ "KEY_F20": 190,
+ "KEY_F21": 191,
+ "KEY_F22": 192,
+ "KEY_F23": 193,
+ "KEY_F24": 194,
+
+ "KEY_PLAYCD": 200,
+ "KEY_PAUSECD": 201,
+ "KEY_PROG3": 202,
+ "KEY_PROG4": 203,
+ "KEY_DASHBOARD": 204,
+ "KEY_SUSPEND": 205,
+ "KEY_CLOSE": 206,
+ "KEY_PLAY": 207,
+ "KEY_FASTFORWARD": 208,
+ "KEY_BASSBOOST": 209,
+ "KEY_PRINT": 210,
+ "KEY_HP": 211,
+ "KEY_CAMERA": 212,
+ "KEY_SOUND": 213,
+ "KEY_QUESTION": 214,
+ "KEY_EMAIL": 215,
+ "KEY_CHAT": 216,
+ "KEY_SEARCH": 217,
+ "KEY_CONNECT": 218,
+ "KEY_FINANCE": 219,
+ "KEY_SPORT": 220,
+ "KEY_SHOP": 221,
+ "KEY_ALTERASE": 222,
+ "KEY_CANCEL": 223,
+ "KEY_BRIGHTNESSDOWN": 224,
+ "KEY_BRIGHTNESSUP": 225,
+ "KEY_MEDIA": 226,
+
+ "KEY_SWITCHVIDEOMODE": 227,
+
+ "KEY_KBDILLUMTOGGLE": 228,
+ "KEY_KBDILLUMDOWN": 229,
+ "KEY_KBDILLUMUP": 230,
+
+ "KEY_SEND": 231,
+ "KEY_REPLY": 232,
+ "KEY_FORWARDMAIL": 233,
+ "KEY_SAVE": 234,
+ "KEY_DOCUMENTS": 235,
+
+ "KEY_BATTERY": 236,
+
+ "KEY_BLUETOOTH": 237,
+ "KEY_WLAN": 238,
+ "KEY_UWB": 239,
+
+ "KEY_UNKNOWN": 240,
+
+ "KEY_VIDEO_NEXT": 241,
+ "KEY_VIDEO_PREV": 242,
+ "KEY_BRIGHTNESS_CYCLE": 243,
+ "KEY_BRIGHTNESS_ZERO": 244,
+ "KEY_DISPLAY_OFF": 245,
+
+ "KEY_WIMAX": 246,
+ "KEY_RFKILL": 247,
+
+ "KEY_MICMUTE": 248,
+
+ "BTN_MISC": 0x100,
+ "BTN_0": 0x100,
+ "BTN_1": 0x101,
+ "BTN_2": 0x102,
+ "BTN_3": 0x103,
+ "BTN_4": 0x104,
+ "BTN_5": 0x105,
+ "BTN_6": 0x106,
+ "BTN_7": 0x107,
+ "BTN_8": 0x108,
+ "BTN_9": 0x109,
+
+ "BTN_MOUSE": 0x110,
+ "BTN_LEFT": 0x110,
+ "BTN_RIGHT": 0x111,
+ "BTN_MIDDLE": 0x112,
+ "BTN_SIDE": 0x113,
+ "BTN_EXTRA": 0x114,
+ "BTN_FORWARD": 0x115,
+ "BTN_BACK": 0x116,
+ "BTN_TASK": 0x117,
+
+ "BTN_JOYSTICK": 0x120,
+ "BTN_TRIGGER": 0x120,
+ "BTN_THUMB": 0x121,
+ "BTN_THUMB2": 0x122,
+ "BTN_TOP": 0x123,
+ "BTN_TOP2": 0x124,
+ "BTN_PINKIE": 0x125,
+ "BTN_BASE": 0x126,
+ "BTN_BASE2": 0x127,
+ "BTN_BASE3": 0x128,
+ "BTN_BASE4": 0x129,
+ "BTN_BASE5": 0x12a,
+ "BTN_BASE6": 0x12b,
+ "BTN_DEAD": 0x12f,
+
+ "BTN_GAMEPAD": 0x130,
+ "BTN_A": 0x130,
+ "BTN_B": 0x131,
+ "BTN_C": 0x132,
+ "BTN_X": 0x133,
+ "BTN_Y": 0x134,
+ "BTN_Z": 0x135,
+ "BTN_TL": 0x136,
+ "BTN_TR": 0x137,
+ "BTN_TL2": 0x138,
+ "BTN_TR2": 0x139,
+ "BTN_SELECT": 0x13a,
+ "BTN_START": 0x13b,
+ "BTN_MODE": 0x13c,
+ "BTN_THUMBL": 0x13d,
+ "BTN_THUMBR": 0x13e,
+
+ "BTN_DIGI": 0x140,
+ "BTN_TOOL_PEN": 0x140,
+ "BTN_TOOL_RUBBER": 0x141,
+ "BTN_TOOL_BRUSH": 0x142,
+ "BTN_TOOL_PENCIL": 0x143,
+ "BTN_TOOL_AIRBRUSH": 0x144,
+ "BTN_TOOL_FINGER": 0x145,
+ "BTN_TOOL_MOUSE": 0x146,
+ "BTN_TOOL_LENS": 0x147,
+ "BTN_TOOL_QUINTTAP": 0x148,
+ "BTN_TOUCH": 0x14a,
+ "BTN_STYLUS": 0x14b,
+ "BTN_STYLUS2": 0x14c,
+ "BTN_TOOL_DOUBLETAP": 0x14d,
+ "BTN_TOOL_TRIPLETAP": 0x14e,
+ "BTN_TOOL_QUADTAP": 0x14f,
+
+ "BTN_WHEEL": 0x150,
+ "BTN_GEAR_DOWN": 0x150,
+ "BTN_GEAR_UP": 0x151,
+ }
+
+relCodes = {
+ "REL_X": 0x00,
+ "REL_Y": 0x01,
+ "REL_Z": 0x02,
+ "REL_RX": 0x03,
+ "REL_RY": 0x04,
+ "REL_RZ": 0x05,
+ "REL_HWHEEL": 0x06,
+ "REL_DIAL": 0x07,
+ "REL_WHEEL": 0x08,
+ "REL_MISC": 0x09,
+ "REL_MAX": 0x0f,
+ }
+
+absCodes = {
+ "ABS_X": 0x00,
+ "ABS_Y": 0x01,
+ "ABS_Z": 0x02,
+ "ABS_RX": 0x03,
+ "ABS_RY": 0x04,
+ "ABS_RZ": 0x05,
+ "ABS_THROTTLE": 0x06,
+ "ABS_RUDDER": 0x07,
+ "ABS_WHEEL": 0x08,
+ "ABS_GAS": 0x09,
+ "ABS_BRAKE": 0x0a,
+ "ABS_HAT0X": 0x10,
+ "ABS_HAT0Y": 0x11,
+ "ABS_HAT1X": 0x12,
+ "ABS_HAT1Y": 0x13,
+ "ABS_HAT2X": 0x14,
+ "ABS_HAT2Y": 0x15,
+ "ABS_HAT3X": 0x16,
+ "ABS_HAT3Y": 0x17,
+ "ABS_PRESSURE": 0x18,
+ "ABS_DISTANCE": 0x19,
+ "ABS_TILT_X": 0x1a,
+ "ABS_TILT_Y": 0x1b,
+ "ABS_TOOL_WIDTH": 0x1c,
+
+ "ABS_VOLUME": 0x20,
+
+ "ABS_MISC": 0x28,
+
+ "ABS_MT_SLOT": 0x2f,
+ "ABS_MT_TOUCH_MAJOR": 0x30,
+ "ABS_MT_TOUCH_MINOR": 0x31,
+ "ABS_MT_WIDTH_MAJOR": 0x32,
+ "ABS_MT_WIDTH_MINOR": 0x33,
+ "ABS_MT_ORIENTATION": 0x34,
+ "ABS_MT_POSITION_X": 0x35,
+ "ABS_MT_POSITION_Y": 0x36,
+ "ABS_MT_TOOL_TYPE": 0x37,
+ "ABS_MT_BLOB_ID": 0x38,
+ "ABS_MT_TRACKING_ID": 0x39,
+ "ABS_MT_PRESSURE": 0x3a,
+ "ABS_MT_DISTANCE": 0x3b,
+
+ "ABS_MAX": 0x3f,
+ }
+
+mscCodes = {
+ "MSC_SERIAL": 0x00,
+ "MSC_PULSELED": 0x01,
+ "MSC_GESTURE": 0x02,
+ "MSC_RAW": 0x03,
+ "MSC_SCAN": 0x04,
+ "MSC_TIMESTAMP": 0x05,
+ "MSC_MAX": 0x07,
+ "MSC_CNT": 0x08,
+}
+
+abs_count = absCodes['ABS_MAX'] + 1
+
+event_codetables = {
+ eventTypes["EV_SYN"]: {},
+ eventTypes["EV_KEY"]: keyCodes,
+ eventTypes["EV_REL"]: relCodes,
+ eventTypes["EV_ABS"]: absCodes,
+}
+
+BUS_PCI = 0x01
+BUS_ISAPNP = 0x02
+BUS_USB = 0x03
+BUS_HIL = 0x04
+BUS_BLUETOOTH = 0x05
+BUS_VIRTUAL = 0x06
+
+# See struct input_event in /usr/include/linux/input.h
+if platform.architecture()[0] == "32bit":
+ struct_timeval = "II"
+else:
+ struct_timeval = "QQ"
+
+struct_input_event = struct_timeval + 'HHi'
+sizeof_input_event = struct.calcsize(struct_input_event)
+
+struct_input_id = 'HHHH'
+struct_uinput_user_dev = ('80s' +
+ struct_input_id +
+ 'i' +
+ str(abs_count) + 'i' +
+ str(abs_count) + 'i' +
+ str(abs_count) + 'i' +
+ str(abs_count) + 'i')
+sizeof_uinput_user_dev = struct.calcsize(struct_uinput_user_dev)
+
+struct_input_absinfo = 'iiii'
+
+# asm-generic/ioctl.h:
+IOC_NRBITS = 8
+IOC_TYPEBITS = 8
+IOC_SIZEBITS = 14
+IOC_DIRBITS = 2
+
+IOC_NRSHIFT = 0
+IOC_TYPESHIFT = IOC_NRSHIFT + IOC_NRBITS
+IOC_SIZESHIFT = IOC_TYPESHIFT + IOC_TYPEBITS
+IOC_DIRSHIFT = IOC_SIZESHIFT + IOC_SIZEBITS
+
+IOC_NONE = 0
+IOC_WRITE = 1
+IOC_READ = 2
+
+def IOC(dir_, type_, nr, size):
+ return ((dir_ << IOC_DIRSHIFT) |
+ (type_ << IOC_TYPESHIFT) |
+ (nr << IOC_NRSHIFT) |
+ (size << IOC_SIZESHIFT))
+def IO(type_, nr):
+ return IOC(IOC_NONE, type_, nr, 0)
+def IOR(type_, nr, size):
+ return IOC(IOC_READ, type_, nr, struct.calcsize(size))
+def IOW(type_, nr, size):
+ return IOC(IOC_WRITE, type_, nr, struct.calcsize(size))
+def EVIOCGABS(abs):
+ return IOR(ord('E'), 0x40 + (abs), struct_input_absinfo)
+
+UINPUT_IOCTL_BASE = ord('U')
+UI_DEV_CREATE = IO(UINPUT_IOCTL_BASE, 1)
+UI_DEV_DESTROY = IO(UINPUT_IOCTL_BASE, 2)
+
+UI_SET_EVBIT = IOW(UINPUT_IOCTL_BASE, 100, 'i')
+UI_SET_KEYBIT = IOW(UINPUT_IOCTL_BASE, 101, 'i')
+UI_SET_RELBIT = IOW(UINPUT_IOCTL_BASE, 102, 'i')
+UI_SET_ABSBIT = IOW(UINPUT_IOCTL_BASE, 103, 'i')
+
+# inverse lookup tables for event/key/rel/abs codes
+eventTypesInv = {}
+keyCodesInv = {}
+relCodesInv = {}
+absCodesInv = {}
+for d in ["eventTypes", "keyCodes",
+ "relCodes", "absCodes"]:
+ globals()[d + "Inv"] = dict([(v, k) for k, v in globals()[d].iteritems()])
+
+def toKeyCode(keyCodeOrName):
+ if isinstance(keyCodeOrName, int):
+ return keyCodeOrName
+ elif keyCodeOrName in keyCodes:
+ return keyCodes[keyCodeOrName]
+ elif keyCodeOrName.upper() in keyCodes:
+ return keyCodes[keyCodeOrName.upper(keyCodeOrName)]
+ elif ("KEY_" + keyCodeOrName.upper()) in keyCodes:
+ return keyCodes["KEY_" + keyCodeOrName.upper()]
+ else:
+ raise ValueError('Invalid keycode "%s"' % (keyCodeOrName,))
+
+def toKeyName(keyCode):
+ if keyCode in keyCodesInv:
+ return keyCodesInv[keyCode]
+ else:
+ raise ValueError('Invalid keycode "%s"' % (keyCode,))
+
+def toButtonCode(buttonCodeOrName):
+ if isinstance(buttonCodeOrName, str):
+ buttonCode = toKeyCode(buttonCodeOrName)
+ elif buttonCodeOrName < 0xf:
+ buttonCode = keyCodes["BTN_MOUSE"] + buttonCodeOrName
+ else:
+ buttonCode = buttonCodeOrName
+ return buttonCode
+
+def refreshDeviceInfo():
+ global _g_devices
+ global _g_deviceNames
+ global _g_filenames
+ _g_devices = file("/proc/bus/input/devices").read().split("\n\n")
+ _g_deviceNames = {}
+ _g_filenames = {}
+ for d in _g_devices:
+ if d.strip() == "":
+ continue
+ _name = [line.split('"')[1] for line in d.split('\n')
+ if line.startswith('N: ')][0]
+ _g_deviceNames[_name] = ("/dev/input/" +
+ re.findall('[ =](event[0-9]+)\s', d)[0])
+ _g_filenames[_g_deviceNames[_name]] = _name
+
+def toEventFilename(deviceName):
+ return _g_deviceNames[deviceName]
+
+def toEventDeviceName(filename):
+ return _g_filenames[filename]
+
+class InputDevice(object):
+ def __init__(self):
+ if not "_g_devices" in globals():
+ refreshDeviceInfo()
+ self._fd = -1
+ self._filename = None
+ self._uidev = None
+ self._created = False
+ self._opened = False
+ self._name = None
+
+ def __del__(self):
+ if self._created:
+ self.destroy()
+
+ def __str__(self):
+ return "%s(name=%s, filename=%s, created=%s, opened=%s, fd=%s)" % (
+ self.__class__.__name__,
+ repr(self._name),
+ repr(self._filename),
+ repr(self._created),
+ repr(self._opened),
+ repr(self._fd))
+
+ def startCreating(self, name, vendor, product, version,
+ absmin=None, absmax=None):
+ if self._fd > 0:
+ raise InputDeviceError("InputDevice is already open")
+ self._fd = os.open("/dev/uinput", os.O_WRONLY | os.O_NONBLOCK)
+ if absmin == None:
+ absmin = [0 for _ in xrange(abs_count)]
+ if absmax == None:
+ absmax = [0 for _ in xrange(abs_count)]
+ absfuzz = [0 for _ in xrange(abs_count)]
+ absflat = [0 for _ in xrange(abs_count)]
+ self._name = name
+ self._uidev = struct.pack(struct_uinput_user_dev,
+ name, # name
+ BUS_USB, # id.bus_type
+ vendor, # id.vendor
+ product, # id.product
+ version, # id.version
+ 0, # ff_effects_max
+ # TODO: why absmin + absmax gives
+ # error for touch?
+ *(absmax + absmin + absfuzz + absflat)
+ )
+
+ def finishCreating(self):
+ if self._fd < 1:
+ raise InputDeviceError("startCreating() not called")
+ bytes_written = os.write(self._fd, self._uidev)
+ if bytes_written != sizeof_uinput_user_dev:
+ raise InputDeviceError(
+ "Writing to /dev/uinput failed, wrote %s/%s bytes"
+ % (bytes_written, sizeof_uinput_user_dev))
+ rv = fcntl.ioctl(self._fd, UI_DEV_CREATE)
+ if rv != 0:
+ raise InputDeviceError(
+ "Creating device failed, ioctl UI_DEV_CREATE returned %s"
+ % (rv,))
+ self._created = True
+ return True
+
+ def destroy(self):
+ if self._created:
+ fcntl.ioctl(self._fd, UI_DEV_DESTROY)
+ self._created = False
+ self.close()
+
+ def open(self, filename):
+ if self._fd > 0:
+ raise InputDeviceError("InputDevice is already open")
+ if not filename.startswith("/dev/input"):
+ filename = toEventFilename(filename)
+ self._fd = os.open(filename, os.O_WRONLY | os.O_NONBLOCK)
+ self._filename = filename
+ self._created = False
+ self._name = toEventDeviceName(self._filename)
+ return self
+
+ def close(self):
+ if self._fd > 0:
+ os.close(self._fd)
+ self._fd = -1
+
+ def filename(self):
+ return self._filename
+
+ def addCap(self, capBit, capCodeOrName, capCode2Name):
+ if self._fd < 1:
+ raise InputDeviceError("startCreating() not called")
+ if self._created or self._opened:
+ raise InputDeviceError("Cannot add capabilities after creation")
+ if isinstance(capCodeOrName, int):
+ capCode = capCodeOrName
+ elif capCodeOrName in capCode2Name:
+ capCode = capCode2Name[capCodeOrName]
+ else:
+ raise InputDeviceError('Unknown name "%s"' % (capCodeOrName,))
+ return fcntl.ioctl(self._fd, capBit, capCode)
+
+ def addEvent(self, eventCodeOrName):
+ return self.addCap(UI_SET_EVBIT, eventCodeOrName, eventTypes)
+
+ def addKey(self, keyCodeOrName):
+ return self.addCap(UI_SET_KEYBIT, keyCodeOrName, keyCodes)
+
+ def addRel(self, relCodeOrName):
+ return self.addCap(UI_SET_RELBIT, relCodeOrName, relCodes)
+
+ def addAbs(self, absCodeOrName):
+ return self.addCap(UI_SET_ABSBIT, absCodeOrName, absCodes)
+
+ def send(self, type_, code, value):
+ if self._fd < 1:
+ raise InputDeviceError("InputDevice is not open")
+ if isinstance(type_, str):
+ typeCode = eventTypes[type_]
+ else:
+ typeCode = type_
+ if isinstance(code, str):
+ codeCode = event_codetables[typeCode][code]
+ else:
+ codeCode = code
+ return sendInputEvent(self._fd, typeCode, codeCode, value)
+
+ def sync(self):
+ if self._fd < 1:
+ raise InputDeviceError("InputDevice is not open")
+ return sendInputSync(self._fd)
+
+class InputDeviceError(Exception):
+ pass
+
+class Mouse(InputDevice):
+ def __init__(self, absoluteMove=False):
+ """
+ Parameters:
+
+ absoluteMove (boolean, optional)
+ force move(x,y) to send absolute coordinates instead
+ of standard relative movement. This helps avoiding
+ mouse pointer drift in some occasions. The default
+ is False.
+ """
+ InputDevice.__init__(self)
+ self._x = 0
+ self._y = 0
+ self._sendAbs = absoluteMove
+
+ def create(self, name="Virtual fMBT Mouse",
+ vendor=0xf4b7, product=0x4053, version=1):
+
+ self.startCreating(name, vendor, product, version)
+ self.addEvent("EV_KEY")
+ self.addEvent("EV_REL")
+ if self._sendAbs:
+ self.addEvent("EV_ABS")
+ self.addEvent("EV_SYN")
+ self.addRel("REL_X")
+ self.addRel("REL_Y")
+ self.addRel("REL_HWHEEL")
+ self.addRel("REL_WHEEL")
+ self.addKey("BTN_LEFT")
+ self.addKey("BTN_RIGHT")
+ self.addKey("BTN_MIDDLE")
+ self.addKey("BTN_SIDE")
+ self.addKey("BTN_EXTRA")
+ self.addKey("BTN_FORWARD")
+ self.addKey("BTN_BACK")
+ self.addKey("BTN_TASK")
+ if self._sendAbs:
+ self.addAbs("ABS_X")
+ self.addAbs("ABS_Y")
+ self.finishCreating()
+ return self
+
+ def move(self, x, y):
+ """
+ Move mouse cursor to coordinates x, y.
+ """
+ if self._sendAbs:
+ self.send("EV_ABS", "ABS_X", x)
+ self.send("EV_ABS", "ABS_Y", y)
+ else:
+ deltaX = x - self._x
+ deltaY = y - self._y
+ self.send("EV_REL", "REL_X", deltaX)
+ self.send("EV_REL", "REL_Y", deltaY)
+ self.sync()
+ self.setXY(x, y)
+
+ def moveRel(self, deltaX, deltaY):
+ self.send("EV_REL", "REL_X", deltaX)
+ self.send("EV_REL", "REL_Y", deltaY)
+ self.sync()
+ self.setXY(self._x + deltaX, self._y + deltaY)
+
+ def press(self, button):
+ buttonCode = toButtonCode(button)
+ self.send("EV_KEY", buttonCode, 1)
+ self.sync()
+
+ def release(self, button):
+ buttonCode = toButtonCode(button)
+ self.send("EV_KEY", buttonCode, 0)
+ self.sync()
+
+ def setXY(self, x, y):
+ """
+ Resets relative mouse position to (x, y), does not synthesize
+ event. Example: disable possible mouse pointer drift:
+
+ mouse.moveRel(-4096, -4096) # move to the top-left corner
+ mouse.setXY(0, 0) # set current pointer coordinates to 0, 0
+
+ After this, mouse.move(x, y) will synthesize relative mouse
+ move event which will drive cursor to coordinates x, y.
+ """
+ self._x = x
+ self._y = y
+
+ def xy(self):
+ return (self._x, self._y)
+
+ def tap(self, x, y, button):
+ self.move(x, y)
+ self.press(button)
+ self.release(button)
+
+class Touch(InputDevice):
+ """
+ Simulates touchpanel and touchpad
+ """
+ def __init__(self, maxX = None, maxY = None,
+ screenWidth = None, screenHeight = None, screenAngle = None):
+ InputDevice.__init__(self)
+ self._maxX = maxX
+ self._maxY = maxY
+ self._screenW = screenWidth
+ self._screenH = screenHeight
+ self._screenA = screenAngle
+ self._maxPressure = None
+ self._multiTouch = True
+ self._mtTrackingId = 0
+ self._mtTracking = {}
+ self._hoover = (0, 0)
+
+ def create(self, name="Virtual fMBT Touch",
+ vendor=0xf4b7, product=0x70c5, version=1,
+ maxX=0xffff, maxY=0xffff, maxPressure=None,
+ multiTouch = True):
+ if maxX != None:
+ self._maxX = maxX
+ else:
+ self._maxX = 0xffff
+ if maxY != None:
+ self._maxY = maxY
+ else:
+ self._maxY = 0xffff
+ absmin = [0 for _ in xrange(abs_count)]
+ absmax = [0 for _ in xrange(abs_count)]
+ absmax[absCodes["ABS_X"]] = self._maxX
+ absmax[absCodes["ABS_Y"]] = self._maxY
+ if maxPressure != None:
+ self._maxPressure = maxPressure
+ absmax[absCodes["ABS_PRESSURE"]] = self._maxPressure
+ absmax[absCodes["ABS_MT_SLOT"]] = 16
+ absmax[absCodes["ABS_MT_TRACKING_ID"]] = 0x0fffffff
+ absmax[absCodes["ABS_MT_POSITION_X"]] = self._maxX
+ absmax[absCodes["ABS_MT_POSITION_Y"]] = self._maxY
+ self._multiTouch = multiTouch
+
+ self.startCreating(name, vendor, product, version,
+ absmin=absmin, absmax=absmax)
+ self.addEvent("EV_KEY")
+ self.addEvent("EV_ABS")
+ self.addEvent("EV_SYN")
+ self.addKey("BTN_TOUCH")
+ self.addAbs("ABS_X")
+ self.addAbs("ABS_Y")
+ if self._maxPressure != None:
+ self.addAbs("ABS_PRESSURE")
+ if self._multiTouch:
+ self.addAbs("ABS_MT_SLOT")
+ self.addAbs("ABS_MT_TRACKING_ID")
+ self.addAbs("ABS_MT_POSITION_X")
+ self.addAbs("ABS_MT_POSITION_Y")
+ self.finishCreating()
+ return self
+
+ def open(self, filename):
+ InputDevice.open(self, filename)
+ # detect touch device capabilities and max values
+ # nfo is struct input_absinfo
+ nfo = array.array('i', range(6))
+ fcntl.ioctl(self._fd, EVIOCGABS(absCodes["ABS_X"]), nfo, 1)
+ self._maxX = nfo[2]
+ fcntl.ioctl(self._fd, EVIOCGABS(absCodes["ABS_Y"]), nfo, 1)
+ self._maxY = nfo[2]
+ return self
+
+ def setScreenSize(self, (width, height)):
+ self._screenW, self._screenH = (width, height)
+
+ def setScreenAngle(self, angle):
+ self._screenA = angle
+
+ def _angleXY(self, x, y, angle=None):
+ """return x, y in screen without rotation"""
+ if angle == None:
+ angle = self._screenA
+ sw, sh = self._screenW, self._screenH
+ if angle:
+ while angle < 0:
+ angle += 360
+ while angle > 360:
+ angle -= 360
+ if angle == 90:
+ ax = self._screenH - y
+ ay = x
+ sw, sh = self._screenH, self._screenW
+ elif angle == 180:
+ ax = self._screenH - x
+ ay = self._screenW - y
+ elif angle == 270:
+ ax = y
+ ay = self._screenW - x
+ sw, sh = self._screenH, self._screenW
+ else:
+ raise ValueError('Illegal screen rotation angle %s' %
+ (self._screenA,))
+ else:
+ ax, ay = x, y
+ return (sw, sh, ax, ay)
+
+ def _tXY(self, x, y):
+ """convert x, y to touch screen coordinates"""
+ if self._screenW and self._maxX and self._screenH and self._maxY:
+ w, h, x, y = self._angleXY(x, y)
+ x = int((self._maxX * x) / w)
+ y = int((self._maxY * y) / h)
+ return (x, y)
+ else:
+ return (x, y)
+
+ def absToScreenXY(self, absX, absY):
+ if self._screenW and self._maxX and self._screenH and self._maxY:
+ x = int(self._screenW * absX / self._maxX)
+ y = int(self._screenH * absY / self._maxY)
+ if self._screenA:
+ _, _, x, y = self._angleXY(x, y, -self._screenA)
+ return (x, y)
+ else:
+ return (absX, absY)
+
+ def _startTracking(self, finger, x, y):
+ self._mtTrackingId += 1
+ usedSlots = set([self._mtTracking[fngr][0]
+ for fngr in self._mtTracking])
+ for freeSlot in xrange(16):
+ if not freeSlot in usedSlots:
+ break
+ else:
+ raise ValueError("No free slots for multitouch")
+ self._mtTracking[finger] = [freeSlot, self._mtTrackingId, x, y]
+ self._sendSlot(finger)
+ self.send("EV_ABS", "ABS_MT_TRACKING_ID", self._mtTrackingId)
+ tx, ty = self._tXY(x, y)
+ self.send("EV_ABS", "ABS_MT_POSITION_X", tx)
+ self.send("EV_ABS", "ABS_MT_POSITION_Y", ty)
+ return self._mtTrackingId
+
+ def _stopTracking(self, finger):
+ self._sendSlot(finger)
+ self.send("EV_ABS", "ABS_MT_TRACKING_ID", -1)
+ del self._mtTracking[finger]
+
+ def _sendSlot(self, finger):
+ slot = self._mtTracking[finger][0]
+ self.send("EV_ABS", "ABS_MT_SLOT", slot)
+
+ def tap(self, x, y, pressure=None):
+ self.pressFinger(-1, x, y, pressure)
+ self.releaseFinger(-1)
+
+ # Compatibility API to allow using a Touch almost like a Mouse
+ def move(self, x, y):
+ if len(self._mtTracking.keys()) == 0:
+ self._hoover = (x, y)
+ else:
+ finger = sorted(self._mtTracking.keys())[0]
+ return self.moveFinger(finger, x, y)
+
+ def press(self, finger):
+ return self.pressFinger(finger, *self._hoover)
+
+ def release(self, finger):
+ return self.releaseFinger(finger)
+ # end of compatibility API
+
+ # Multi-touch API
+ def pressFinger(self, finger, x, y, pressure=None):
+ """Add a finger to current multitouch gesture. If multitouch gesture
+ is not started, it starts automatically.
+ """
+ if self._multiTouch and not finger in self._mtTracking:
+ self._startTracking(finger, x, y)
+ if pressure != None and self._maxPressure != None:
+ self.send("EV_ABS", "ABS_PRESSURE", pressure)
+ self.send("EV_KEY", "BTN_TOUCH", 1)
+ tx, ty = self._tXY(x, y)
+ self.send("EV_ABS", "ABS_X", tx)
+ self.send("EV_ABS", "ABS_Y", ty)
+ self.sync()
+
+ def releaseFinger(self, finger):
+ """Remove a finger from current multitouch gesture. When last finger
+ is raised from the screen, multitouch gesture ends."""
+ if self._multiTouch:
+ self._stopTracking(finger)
+ self.send("EV_KEY", "BTN_TOUCH", 0)
+ for fngr in self._mtTracking:
+ # still some finger pressed, non-multitouch reader gets
+ # coordinates from one of those
+ tx, ty = self._tXY(self._mtTracking[fngr][2],
+ self._mtTracking[fngr][3])
+ self.send("EV_ABS", "ABS_X", tx)
+ self.send("EV_ABS", "ABS_Y", ty)
+ break # only one coordinates will be sent.
+ self.sync()
+
+ def moveFinger(self, finger, x, y):
+ """Move a finger in current multitouch gesture"""
+ self._sendSlot(finger)
+ tx, ty = self._tXY(x, y)
+ if self._multiTouch:
+ self.send("EV_ABS", "ABS_MT_POSITION_X", tx)
+ self.send("EV_ABS", "ABS_MT_POSITION_Y", ty)
+ self.send("EV_ABS", "ABS_X", tx)
+ self.send("EV_ABS", "ABS_Y", ty)
+ self._mtTracking[finger][2] = x # last X
+ self._mtTracking[finger][3] = y # last Y
+ self.sync()
+
+class Keyboard(InputDevice):
+ def __init__(self):
+ InputDevice.__init__(self)
+
+ def create(self, name="Virtual fMBT Keyboard",
+ vendor=0xf4b7, product=0x4ebd, version=1):
+ self.startCreating(name, vendor, product, version)
+ self.addEvent("EV_KEY")
+ self.addEvent("EV_SYN")
+ for keyName in keyCodes:
+ if keyName.startswith("KEY_"):
+ self.addKey(keyCodes[keyName])
+ self.finishCreating()
+ return self
+
+ def press(self, keyCodeOrName):
+ # TODO: there should be different MSC_SCAN matrix location for each key
+ self.send("EV_MSC", mscCodes["MSC_SCAN"], 458793)
+ self.send("EV_KEY", toKeyCode(keyCodeOrName), 1)
+ self.sync()
+
+ def release(self, keyCodeOrName):
+ # TODO: there should be different MSC_SCAN matrix location for each key
+ self.send("EV_MSC", mscCodes["MSC_SCAN"], 458793)
+ self.send("EV_KEY", toKeyCode(keyCodeOrName), 0)
+ self.sync()
+
+ def tap(self, keyCodeOrName):
+ keyCode = toKeyCode(keyCodeOrName)
+ self.press(keyCode)
+ self.release(keyCode)
+
+def sendInputSync(devFd):
+ return sendInputEvent(devFd, 0, 0, 0)
+
+def sendInputEvent(devFd, type_, code, value):
+ t = time.time()
+ t_sec = int(t)
+ t_usec = int(1000000*(t-t_sec))
+ rv = os.write(devFd,
+ struct.pack(struct_input_event,
+ t_sec, t_usec,
+ type_,
+ code,
+ value))
+ return rv == sizeof_input_event
+
+def eventToString(inputEvent):
+ tim, tus, typ, cod, val = struct.unpack(struct_input_event, inputEvent)
+ styp = eventTypesInv.get(typ, "?")
+ if styp == "EV_KEY":
+ scod = keyCodesInv.get(cod, "?")
+ elif styp == "EV_REL":
+ scod = relCodesInv.get(cod, "?")
+ elif styp == "EV_ABS":
+ scod = absCodesInv.get(cod, "?")
+ else:
+ scod = "N/A"
+ if typ == 0:
+ return styp
+ else:
+ return "%8s.%s type: %4s (%5s), code: %5s (%15s) value: %8s" % \
+ (tim, str(tus).zfill(6), typ, styp, cod, scod, val)
+
+def queueEventsFromFile(filename, queue, lock, filterOpts):
+ if isinstance(filterOpts, dict) and "type" in filterOpts:
+ allowedTypes = set()
+ for t in filterOpts["type"]:
+ if isinstance(t, str):
+ allowedTypes.add(eventTypes[t])
+ else:
+ allowedTypes.add(t)
+ else:
+ allowedTypes = set(eventTypes.values())
+ if ("touchScreen" in filterOpts and
+ filename == filterOpts["touchScreen"].filename()):
+ touchScreen = filterOpts["touchScreen"]
+ absXCodes = set([absCodes["ABS_X"], absCodes["ABS_MT_POSITION_X"]])
+ absYCodes = set([absCodes["ABS_Y"], absCodes["ABS_MT_POSITION_Y"]])
+ absType = eventTypes["EV_ABS"]
+ else:
+ touchScreen = None
+ fd = os.open(filename, os.O_RDONLY)
+ try:
+ while 1:
+ eventData = os.read(fd, sizeof_input_event)
+ if not lock.locked():
+ return
+ if not eventData:
+ break
+ (ts, tus, typ, cod, val) = struct.unpack(struct_input_event, eventData)
+ if touchScreen and typ == absType:
+ if cod in absXCodes:
+ val, _ = touchScreen.absToScreenXY(val, 0)
+ elif cod in absYCodes:
+ _, val = touchScreen.absToScreenXY(0, val)
+ if typ in allowedTypes:
+ queue.put((ts, tus, typ, cod, val))
+ finally:
+ os.close(fd)
+
+# _g_recQL dictionary contains events being actively recorded
+# - key: filename, like "/dev/input/event0"
+# - value: (eventQueue, lock)
+# A thread is filling eventQueue with events from filename.
+# Once the lock is released, the thread will quit without writing
+# anything to the eventQueue anymore.
+_g_recQL = {}
+_g_unfetchedEvents = []
+def queueEventsFromFiles(listOfFilenames, filterOpts):
+ global _g_recQL
+ for filename in listOfFilenames:
+ q = Queue.Queue()
+ l = thread.allocate_lock()
+ l.acquire()
+ if filename in _g_recQL:
+ # previous reader thread should quit
+ _g_recQL[filename][1].release()
+ thread.start_new_thread(
+ queueEventsFromFile, (filename, q, l, filterOpts))
+ _g_recQL[filename] = (q, l)
+
+def startQueueingEvents(filterOpts):
+ refreshDeviceInfo()
+ if len(_g_recQL) > 0:
+ # already queueing, restart
+ stopQueueingEvents()
+ if "device" in filterOpts:
+ deviceFiles = []
+ for n in filterOpts["device"]:
+ if n in _g_deviceNames:
+ deviceFiles.append(_g_deviceNames[n])
+ elif os.access(n, os.R_OK):
+ deviceFiles.append(n)
+ del filterOpts["device"]
+ else:
+ deviceFiles = glob.glob("/dev/input/event[0-9]*")
+ queueEventsFromFiles(deviceFiles, filterOpts)
+
+def stopQueueingEvents():
+ global _g_recQL
+ global _g_unfetchedEvents
+ for filename in _g_recQL:
+ _g_recQL[filename][1].release()
+ _g_unfetchedEvents = fetchQueuedEvents()
+ _g_recQL = {}
+
+def fetchQueuedEvents():
+ global _g_unfetchedEvents
+ if len(_g_recQL) == 0: # no active recording
+ rv = _g_unfetchedEvents
+ _g_unfetchedEvents = []
+ return rv
+ else: # events are being recorded
+ events = []
+ for filename in _g_recQL:
+ events.extend(fetchQueuedEventsFromFile(filename))
+ return events
+
+def fetchQueuedEventsFromFile(filename):
+ events = []
+ q = _g_recQL[filename][0]
+ deviceName = toEventDeviceName(filename)
+ while 1:
+ try:
+ ts, tus, typ, cod, val = q.get_nowait()
+ events.append((deviceName, ts + tus/1000000.0, typ, cod, val))
+ except Queue.Empty:
+ break
+ return events
+
+def printEventsFromFile(filename):
+ fd = os.open(filename, os.O_RDONLY)
+
+ sdev = filename.split("/")[-1]
+
+ try:
+ while 1:
+ inputEvent = os.read(fd, sizeof_input_event)
+ if not inputEvent:
+ break
+ print sdev, eventToString(inputEvent)
+ finally:
+ os.close(fd)
+
+if __name__ == "__main__":
+ import getopt
+ import sys
+
+ opt_print_devices = []
+
+ opts, remainder = getopt.getopt(
+ sys.argv[1:], 'hp',
+ ['help', 'print'])
+ for opt, arg in opts:
+ if opt in ['-h', '--help']:
+ print cmdline_usage
+ sys.exit(0)
+ elif opt in ['-p', '--print']:
+ if not remainder:
+ print cmdline_usage
+ opt_print_devices = remainder
+
+ if opt_print_devices:
+ for deviceFilename in opt_print_devices:
+ thread.start_new_thread(printEventsFromFile, (deviceFilename,))
+ raw_input("Press ENTER to stop printing...\n")
--- /dev/null
+import time
+
+class _USE_DEFAULTS:
+ pass
+
+
+def int_coords((x,y), (width, height)):
+ if 0 <= x <= 1 and type(x) == float:
+ x = x * width
+ if 0 <= y <= 1 and type(y) == float:
+ y = y * height
+ return (int(round(x)), int(round(y)))
+
+
+class GUITestConnection(object):
+
+ def send_tap(self, x, y):
+ return self.send_touchdown(x, y) and self.send_touchup(x, y)
+
+ def send_press(self, keyname):
+ return self.send_keydown(keyname) and self.send_keyup(keyname)
+
+ def send_keydown(self, keyname):
+ print ("send keydown(%s) needed but not implemented." % (keyname,))
+
+ def send_keyup(self, keyname):
+ print ("send keyup(%s) needed but not implemented." % (keyname,))
+
+ def send_touchdown(self, x, y):
+ print ("send touchdown(%d, %d) needed but not implemented" % (x, y))
+
+ def send_touchup(self, x, y):
+ print ("send touchup(%d, %d) needed but not implemented" % (x, y))
+
+ def send_touchmove(self, x, y):
+ print ("send touchmove(%d, %d) needed but not implemented" % (x, y))
+
+
+class GUITestInterface(object):
+ def __init__(self):
+ self._conn = None
+ self.tap_defaults = {}
+ self.longtap_holdtime = 2.0
+
+ def setConnection(self, conn):
+ self._conn = conn
+
+ def screen_size(Self):
+ return 720, 1280
+
+ def pressKey(self, keyname, long=False, hold=0.0, modifiers=None):
+ extra_params = {}
+ if modifiers != None:
+ extra_params['modifiers'] = modifiers
+ if hold > 0.0:
+ try:
+ assert self.existing_connection().\
+ send_keydown(keyname, **extra_params)
+ time.sleep(hold)
+ assert self.existing_connection().\
+ send_keyup(keyname, **extra_params)
+ except AssertionError:
+ return False
+ return True
+ return self.existing_connection().send_press(keyname, **extra_params)
+
+ def tap(self, (x, y), long=_USE_DEFAULTS, hold=_USE_DEFAULTS,\
+ count=_USE_DEFAULTS, delay_between_taps=_USE_DEFAULTS,
+ button=_USE_DEFAULTS):
+ if long == _USE_DEFAULTS:
+ long = self.tap_defaults.get("long", False)
+ if hold == _USE_DEFAULTS:
+ hold = self.tap_defaults.get("hold", 0.0)
+ if count == _USE_DEFAULTS:
+ count = self.tap_defaults.get("count", 1)
+ if delay_between_taps == _USE_DEFAULTS:
+ delay_between_taps = \
+ self.tap_defaults.get("delay_between_taps", 0.5)
+ if button == _USE_DEFAULTS:
+ button = self.tap_defaults.get("button", None)
+
+ x, y = self.int_coords((x,y))
+ count = int(count)
+ if long and hold == 0.0:
+ hold = self.longtap_holdtime
+ extra_params = {}
+ if button != None:
+ extra_params['button'] = button
+ while count > 0:
+ if hold > 0.0:
+ try:
+ assert self.existing_connection().\
+ send_touchdown(x,y, **extra_params)
+ time.sleep(hold)
+ assert self.existing_connection().\
+ send_touchup(x,y, **extra_params)
+ except AssertionError:
+ return False
+ else:
+ if delay_between_taps:
+ time.sleep(delay_between_taps)
+ if not self.existing_connection().send_tap(x, y, **extra_params):
+ return False
+ count = int(count) - 1
+ return True
+
+ def down_scroll(self, (x1, y1), (x2, y2)):
+ x1, y1 = self.int_coords((x1, y1))
+ x2, y2 = self.int_coords((x2, y2))
+
+ self.existing_connection().send_touchdown(x1, y1)
+ ytemp = y1 - y2
+ yidx = 0
+
+ while ytemp - yidx > 0:
+ self.existing_connection().send_touchmove(x1, y1 - yidx)
+ yidx += 5
+
+ self.existing_connection().send_touchup(x2, y2)
+
+ def up_scroll(self, (x1, y1), (x2, y2)):
+ x1, y1 = self.int_coords((x1, y1))
+ x2, y2 = self.int_coords((x2, y2))
+
+ self.existing_connection().send_touchdown(x1, y1)
+ ytemp = y2 - y1
+ yidx = 0
+
+ while ytemp - yidx > 0:
+ self.existing_connection().send_touchmove(x1, y2 + yidx)
+ yidx += 5
+
+ self.existing_connection().send_touchup(x2, y2)
+
+
+ def drag(self, (x1, y1), (x2, y2), delay_between_moves=0.01,\
+ delay_before_moves=0, delay_after_moves=0, move_points=10,\
+ button=_USE_DEFAULTS):
+ x1, y1 = self.int_coords((x1, y1))
+ x2, y2 = self.int_coords((x2, y2))
+
+ extra_args = {}
+ if button != _USE_DEFAULTS:
+ extra_args["button"] = button
+
+ if delay_before_moves >= 0:
+ time.sleep(delay_before_moves)
+ else:
+ time.sleep(delay_between_moves)
+ for i in xrange(0, move_points):
+ nx = x1 + int(round(((x2 - x1) / float(move_points+1)) * (i+1)))
+ ny = y1 + int(round(((y2 - y2) / float(move_points+1)) * (i+1)))
+ if not self.existing_connection().\
+ send_touchmove(nx, ny, **extra_args):
+ return False
+ time.sleep(delay_between_moves)
+ if delay_after_moves > 0:
+ self.existing_connection().send_touchmove(x2, y2, **extra_args)
+ time.sleep(delay_after_moves)
+ if delay_after_moves >= 0:
+ if self.existing_connection().send_touchup(x2, y2, **extra_args):
+ return True
+ else:
+ return False
+ else:
+ return True
+
+
+
+ def existing_connection(self):
+ if self._conn:
+ return self._conn
+ else:
+ print ("not connected")
+
+ def int_coords(self, (x, y)):
+ width, height = self.screen_size()
+ return int_coords((x,y), (width, height))
+
--- /dev/null
+
+import os
+import time
+import subprocess
+import cPickle
+import base64
+import Queue
+import thread
+
+import monkey_gti
+
+from constants import Constants
+
+
+def _file_to_queue(f, out_queue):
+ line = f.readline()
+ while line != "":
+ out_queue.put(line)
+ line = f.readline()
+ f.close()
+
+
+def _encode(obj):
+ return base64.b64encode(cPickle.dumps(obj))
+
+
+def _decode(string):
+ return cPickle.loads(base64.b64decode(string))
+
+
+def _run(cmd, expected_exitstatus=None):
+ if type(cmd) == str:
+ shell = True
+ else:
+ shell = False
+
+ try:
+ proc = subprocess.Popen(cmd, shell=shell, stdout=subprocess.PIPE,\
+ stderr=subprocess.PIPE, close_fds=True)
+ if expected_exitstatus != None:
+ out, err = proc.communicate()
+ else:
+ out, err = ('', None)
+ except Exception, ex:
+ class fakeProcess(object):
+ pass
+ p = fakeProcess
+ p.returncode = 127
+ out, err = ('', ex)
+
+ exit_status = proc.returncode
+
+ if (expected_exitstatus != None and
+ exit_status != expected_exitstatus and
+ exit_status not in expected_exitstatus):
+ msg = "Executing %s failed. Exit status: %s, expected %s" % \
+ (cmd, exit_status, expected_exitstatus)
+ raise FMBTTizenError(msg)
+
+ return exit_status, out, err
+
+
+class Device(monkey_gti.GUITestInterface):
+
+ def __init__(self, serial_number=None, debug_agentfile=None, \
+ keyboard_device=None, touch_device=None, \
+ mouse_device=None, **kwargs):
+
+ monkey_gti.GUITestInterface.__init__(self, **kwargs)
+ c = TizenDeviceConnection(serial_number=serial_number,\
+ debug_agentfile=debug_agentfile,\
+ keyboard_device=keyboard_device,\
+ touch_device=touch_device,\
+ mouse_device=mouse_device)
+ self.setConnection(c)
+ c.gti = self
+
+ def connect(self):
+ if hasattr(self, "_conn"):
+ self._conn.open()
+ return True
+ else:
+ return False
+
+ def disconnect(self):
+ if hasattr(self, "_conn"):
+ self._conn.close()
+ return True
+ else:
+ return False
+
+ def pressPower(self, **pressKeyKwArgs):
+ return self.pressKey("POWER", **pressKeyKwArgs)
+
+ def pressBack(self, **pressKeyKwArgs):
+ return self.pressKey("BACK", **pressKeyKwArgs)
+
+ def pressMenu(self, **pressKeyKwArgs):
+ return self.pressKey("MENU", **pressKeyKwArgs)
+
+ def pressVolumeDown(self, **pressKeyKwArgs):
+ return self.pressKey("VOLUMEDOWN", **pressKeyKwArgs)
+
+ def pressVolumeUp(self, **pressKeyKwArgs):
+ return self.pressKey("VOLUMEUP", **pressKeyKwArgs)
+
+ def key_names(self):
+ return self._conn.key_names()
+
+
+class TizenDeviceConnection(monkey_gti.GUITestConnection):
+
+ def __init__(self, serial_number=None, debug_agentfile=None, \
+ keyboard_device=None, touch_device=None, mouse_device=None):
+ if serial_number == None:
+ self.serial_number = "unknown"
+ else:
+ self.serial_number = serial_number
+
+ self.sdb_shell = None
+ self.agent_needs_resolution = True
+ self.touch_device = touch_device
+ self.keyboard_device = keyboard_device
+ self.debug_agentfile = debug_agentfile
+ self.mouse_device = mouse_device
+ self.open()
+
+ def open(self):
+ if self.serial_number == "unknown":
+ raise TizenDeviceNotFoundError("Tizen device not found.")
+
+ self.close()
+
+ agent_fname = "fmbttizen-agent.py"
+ agent_uinput_fname = "fmbtuinput.py"
+
+ agent_fname_path = Constants.AGENT_PATH
+ uinput_fname_path = Constants.UINPUT_AGENT_PATH
+ remote_upload_path = "/tmp/"
+
+ remote_agent_fname = remote_upload_path + agent_fname
+
+ upload_files = [(agent_fname_path, remote_upload_path), \
+ (uinput_fname_path, remote_upload_path)]
+
+ for src, dst in upload_files:
+ upload_cmd = ["sdb", "-s", self.serial_number, "push", src, dst]
+ status, out, err = _run(upload_cmd, range(256))
+ if status == 127:
+ raise TizenConnectionError("Executing sdb -s %s push failed." + \
+ "Check your Tizen SDK installation." % \
+ self.serial_number)
+ elif status != 0:
+ if "device not found" in err:
+ raise TizenDeviceNotFoundError(\
+ 'Tizen device "%s" not found.'% \
+ self.serial_number)
+ else:
+ raise TizenConnectionError('Executing "%s" failed: %s' % \
+ (' '.join(upload_cmd), err + " " + out))
+
+ self.agent_args = []
+ if self.keyboard_device:
+ self.agent_args.append("--keyboard=%s" % (self.keyboard_device,))
+ if self.touch_device:
+ self.agent_args.append("--touch=%s" % (self.touch_device,))
+ if self.mouse_device:
+ self.agent_args.append("--mouse=%s" % (self.mouse_device,))
+
+ remote_shellcmd = ["sdb", "-s", self.serial_number, "shell"]
+ try:
+ self.sdb_shell = subprocess.Popen(remote_shellcmd,\
+ shell=False,
+ stdin=subprocess.PIPE,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ close_fds=True)
+ except OSError:
+ raise TizenConnectionError("Executing %s failed" % \
+ " ".join(remote_shellcmd),)
+
+ self.sdbshell_errqueue = Queue.Queue()
+ thread.start_new_thread(_file_to_queue, (self.sdb_shell.stderr, \
+ self.sdbshell_errqueue))
+ self.sdb_shell.stdin.write("\r")
+ try:
+ ok, self.platform_info = self._agent_cmd(\
+ "python %s %s; exit" % \
+ (remote_agent_fname, " ".join(self.agent_args)))
+ except IOError, msg:
+ raise TizenConnectionError(\
+ ('Connecting to a Tizen device/emulator failed. Error: %s'
+ '\nTry "sdb -s %s shell python %s --debug".') % \
+ (msg, self.serial_number, remote_agent_fname))
+
+ return ok
+
+ def key_names(self):
+ return self._agent_cmd("kn")[1]
+
+ def send_keydown(self, keyname):
+ print 'keydown %s' % keyname
+ return self._agent_cmd("kd %s" % (keyname,))[0]
+
+ def send_keyup(self, keyname):
+ print 'keyup %s' % keyname
+ return self._agent_cmd("ku %s" % (keyname,))[0]
+
+ def send_press(self, keyname, modifiers=()):
+ print 'send_press %s' % keyname
+ rv = True
+ for m in modifiers:
+ rv = rv and self.send_keydown(m)
+ rv = rv and self._agent_cmd("kp %s" % (keyname,))[0]
+ for m in modifiers[::-1]:
+ rv = rv and self.send_keyup(m)
+ return rv
+
+ def send_touchdown(self, x, y):
+ print 'touchdown %s %s' % (x, y)
+ return self._agent_cmd("td %s %s 1" % (x, y))[0]
+
+ def send_touchup(self, x, y):
+ print 'touchup %s %s' % (x, y)
+ return self._agent_cmd("tu %s %s 1" % (x, y))[0]
+
+ def send_tap(self, x, y):
+ print 'tap %s %s' % (x, y)
+ return self._agent_cmd("tt %s %s 1" % (x, y))[0]
+
+ def send_touchmove(self, x, y):
+ print 'touchmove %s %s' % (x, y)
+ return self._agent_cmd("tm %s %s" % (x, y))[0]
+
+ def _report_errors_inqueue(self):
+ while True:
+ try:
+ l = self._sdbshell_errqueue.get_nowait()
+ except Queue.Empty:
+ return
+ if self.debug_agentfile:
+ self.debug_agentfile.write("<2 %s" % (l,))
+
+ def _agent_cmd(self, cmd, retry=3):
+ if cmd[:2] in ["tt", "td", "tm", "tu", "er"]:
+ if self.agent_needs_resolution:
+ self._agent_cmd("sd %s %s" % self.gti.screen_size())
+ self.agent_needs_resolution = False
+
+ if self.sdb_shell == None:
+ return False, "disconnected"
+
+ if self.debug_agentfile:
+ self.debug_agentfile.write(">0 %s\n" % (cmd,))
+ try:
+ if len(cmd) > 0:
+ self.sdb_shell.stdin.write("%s%s" % (cmd, '\n'))
+ self.sdb_shell.stdin.flush()
+ except IOError, msg:
+ if retry > 0:
+ time.sleep(2)
+ self._report_errors_inqueue()
+ print ("Error when sending command %s : %s" % (cmd, msg))
+ self.open()
+ self._agent_cmd(cmd, retry=retry - 1)
+ return self._agent_answer()
+
+ def _agent_answer(self):
+ error_line_prefix = "FMBTAGENT ERROR "
+ ok_line_prefix = "FMBTAGENT OK "
+ l = self.sdb_shell.stdout.readline()
+ output = []
+ while True:
+ if self.debug_agentfile:
+ if len(l) > 72:
+ self.debug_agentfile.write("<1 %s...\n" % (l[:72],))
+ else:
+ self.debug_agentfile.write("<1 %s\n" % (l,))
+ if l.startswith(ok_line_prefix):
+ return True, _decode(l[len(ok_line_prefix):])
+ elif l.startswith(error_line_prefix):
+ return False, _decode(l[len(error_line_prefix):])
+ else:
+ output.append(l)
+ pass
+ l = self.sdb_shell.stdout.readline()
+ if l == "":
+ raise IOError("Agent connection lost : %s" % \
+ ("\n".join(output)))
+ break
+ l = l.strip()
+
+ def close(self):
+ if hasattr(self, "sdb_Shell") and self.sdb_shell != None:
+ try:
+ self._agent_cmd("quit", retry=0)
+ except:
+ pass
+ try:
+ self.sdb_shell.stdin.close()
+ except:
+ pass
+ try:
+ self.sdb_shell.stdout.close()
+ except:
+ pass
+ try:
+ self.sdb_shell.stderr.close()
+ except:
+ pass
+ self._report_errors_inqueue()
+ self.sdb_shell = None
+
+
+class FMBTTizenError(Exception):
+ pass
+
+
+class TizenConnectionError(FMBTTizenError):
+ pass
+
+
+class TizenDeviceNotFoundError(TizenConnectionError):
+ pass
--- /dev/null
+
+import os
+import threading
+import random
+
+from monkey_tizen import Device
+from sdbmanager import SdbManager
+from constants import Constants
+
+
+class RandomExecutor(threading.Thread):
+ def __init__(self, _devid, _wrap):
+ self.monkey_dev = Device(_devid, _wrap.get_debug_file(), \
+ _wrap.get_key_dev(), _wrap.get_touch_dev(), \
+ _wrap.get_mouse_dev())
+ self.devid = _devid
+ self.monkey_dev.connect()
+ self.random_count = int(_wrap.get_random_count())
+ self.result_path = _wrap.get_result_dirpath(_devid)
+ self.back_count = _wrap.get_back_count()
+
+ if _wrap.get_record_file():
+ self.rec_file = open(_wrap.get_record_file(), 'w')
+ else:
+ self.rec_file = open(\
+ os.path.join(self.result_path, \
+ Constants.RECORD_FILE_NAME), 'w')
+ threading.Thread.__init__(self)
+
+ def run(self):
+ for idx in range(self.random_count):
+ x = random.uniform(0.0, 1.0)
+ y = random.uniform(0.0, 1.0)
+
+ self.rec_file.write("tap %s %s\n" % (x, y))
+ self.monkey_dev.tap((x, y))
+
+ if self.back_count and idx >= int(self.back_count):
+ if idx % int(self.back_count) == 0:
+ self.rec_file.write("pressBack\n")
+ self.monkey_dev.pressBack()
+
+ SdbManager.exportDumpFiles(self.devid, \
+ os.path.join(self.result_path, 'random'))
+ self.monkey_dev.disconnect()
+ self.rec_file.close()
+
+
+class ReplayExecutor(threading.Thread):
+ def __init__(self, _devid, _wrap):
+ self.monkey_dev = Device(_devid, _wrap.get_debug_file(), \
+ _wrap.get_key_dev(), _wrap.get_touch_dev(), \
+ _wrap.get_mouse_dev())
+ self.devid = _devid
+ self.monkey_dev.connect()
+ self.replay_filepath = _wrap.get_replay_file()
+ self.replay_file = None
+
+ self.result_path = _wrap.get_result_dirpath(_devid)
+
+ if self.replay_filepath:
+ self.replay_file = open(self.replay_filepath, 'r')
+
+ threading.Thread.__init__(self)
+
+ def run(self):
+ while True:
+ line = self.replay_file.readline()
+ if not line:
+ break
+ msg = line.split()
+ if msg[0].find('tap') > -1:
+ self.monkey_dev.tap((float(msg[1]), float(msg[2])))
+ elif msg[0].find('pressBack') > -1:
+ self.monkey_dev.pressBack()
+
+ self.replay_file.close()
+ self.monkey_dev.disconnect()
+ SdbManager.exportDumpFiles(self.devid, \
+ os.path.join(self.result_path, 'replay'))
--- /dev/null
+
+import os
+import datetime
+
+from optparse import *
+from constants import Constants
+
+
+def varnarg(option, opt_str, value, parser):
+ """ parser srg"""
+ value = []
+ import re
+ for arg in parser.rargs:
+ if re.search('^--.+', arg) or re.search('^-[\D]', arg):
+ break
+ value.append(arg)
+
+ del parser.rargs[:len(value)]
+ setattr(parser.values, option.dest, value)
+
+
+class MonkeyWrapper:
+ def __init__(self):
+ self.options = None
+ self.USAGE = "\n\""
+
+ def print_usage(self):
+ print self.USAGE
+
+ def parse_options(self, argv):
+ option_list = [
+ make_option("--py-install", dest="python_install", \
+ action="store_true", default=False, help=""),
+ make_option("--random", dest="random_count", action="callback", \
+ callback=varnarg, help=""),
+ make_option("--record", dest="record_file", action="callback", \
+ callback=varnarg, help=""),
+ make_option("--debug", dest="debug_file", action="callback", \
+ callback=varnarg, help=""),
+ make_option("--replay", dest="replay_file", action="callback", \
+ callback=varnarg, help=""),
+ make_option("--key-dev", dest="key_device", action="callback", \
+ callback=varnarg, help=""),
+ make_option("--touch-dev", dest="touch_device", \
+ action="callback", callback=varnarg, help=""),
+ make_option("--mouse_dev", dest="mouse_device", \
+ action="callback", callback=varnarg, help=""),
+ make_option("--output", dest="result_dir", action="callback", \
+ callback=varnarg, help=""),
+ make_option("--back-key", dest="back_count", action="callback", \
+ callback=varnarg, help="")
+ ]
+
+ # detect non-params
+ if len(argv) == 1:
+ pass
+ argv.append("--help")
+
+ PARSERS = OptionParser(option_list=option_list, usage=self.USAGE)
+ (self.options, args) = PARSERS.parse_args()
+
+ def is_py_install(self):
+ return self.options.python_install
+
+ def python_install(self, _devid):
+ os.system('sdb -s %s root on' % _devid)
+ curr_path = Constants.LIB_DIR
+ os.system('sdb -s %s push %s %s' % (_devid, os.path.join(curr_path, 'libpython-2.7.1-1.7.armv7l.rpm'), '/tmp/'))
+ os.system('sdb -s %s push %s %s' % (_devid, os.path.join(curr_path, 'python-2.7.1-1.4.armv7l.rpm'), '/tmp/'))
+ os.system('sdb -s %s push %s %s' % (_devid, os.path.join(curr_path, 'python-base-2.7.1-1.7.armv7l.rpm'), '/tmp/'))
+ os.system('sdb -s %s shell rpm -ivh /tmp/libpython-2.7.1-1.7.armv7l.rpm' % _devid)
+ os.system('sdb -s %s shell rpm -ivh /tmp/python-base-2.7.1-1.7.armv7l.rpm' % _devid)
+ os.system('sdb -s %s shell rpm -ivh /tmp/python-2.7.1-1.4.armv7l.rpm' % _devid)
+
+ def get_replay_file(self):
+ if self.options.replay_file:
+ return self.options.replay_file[0]
+ else:
+ return None
+
+ def get_record_file(self):
+ if self.options.record_file:
+ return self.options.record_file[0]
+ else:
+ return None
+
+ def get_random_count(self):
+ return self.options.random_count[0]
+
+ def get_back_count(self):
+ if self.options.back_count:
+ return self.options.back_count[0]
+ else:
+ return None
+
+ def get_debug_file(self):
+ if self.options.debug_file:
+ return self.options.debug_file[0]
+ else:
+ return None
+
+ def get_key_dev(self):
+ if self.options.key_device:
+ return self.options.key_device[0]
+ else:
+ return None
+
+ def get_touch_dev(self):
+ if self.options.touch_device:
+ return str(self.options.touch_device[0])
+ else:
+ return None
+
+ def get_mouse_dev(self):
+ if self.options.mouse_device:
+ self.options.mouse_device[0]
+ else:
+ return None
+
+ def is_random_mode(self):
+ if self.options.random_count and self.options.random_count[0] > 0:
+ return True
+ else:
+ return False
+
+ def is_replay_mode(self):
+ if self.options.replay_file:
+ return True
+ else:
+ return False
+
+ def get_result_dirpath(self, _devid):
+ curr_time = datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S')
+ result_path = os.path.join(Constants.RESULT_DIR, _devid, curr_time)
+ if not os.path.exists(result_path):
+ os.makedirs(result_path)
+
+ return result_path
--- /dev/null
+
+import os
+import time
+import subprocess
+
+from constants import Constants
+
+class SdbManager:
+
+ @staticmethod
+ def sdbCommand(command, timeout=90):
+ #LOGGER.debug("sdbCommand : %s" % command)
+ proc = subprocess.Popen(command,
+ shell=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ time_out = 0
+ while time_out < timeout:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+ time_out += 0.5
+ time.sleep(0.5)
+ if exit_code is None:
+ pass
+ #LOGGER.error("sdb time out,kill subprocess...")
+ #killall(proc.pid)
+
+ return exit_code, proc.stdout, proc.stderr
+
+
+ @staticmethod
+ def sdbDevices():
+ dev_cmd = "sdb devices"
+ start_server_cmd = "sdb start-server"
+ SdbManager.sdbCommand(start_server_cmd, 8)
+ exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(dev_cmd, 5)
+
+ return re_stdout.read()
+
+
+ @staticmethod
+ def checkDirExist(_devid, _dirname):
+ existed = True
+ lscmd = Constants.SDB_LS % _devid + " " + _dirname
+ exit_code, std_out, std_err = SdbManager.sdbCommand(lscmd)
+ out_log = std_out.read()
+ if out_log and out_log.find("No such file or directory") > -1:
+ existed = False
+ return existed
+
+ @staticmethod
+ def sdbShell(deviceId, cmd):
+ shell_cmd = Constants.SDB_SHELL % deviceId + " " + cmd
+ exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(shell_cmd)
+
+ if exit_code is None:
+ return False
+ else:
+ outLog = re_stdout.read()
+ if outLog and outLog.find('command not found') > -1:
+ return False
+
+ return outLog
+
+ @staticmethod
+ def exportDumpFiles(_devid, _resultDir):
+ dumpPath = os.path.join(_resultDir, "dump")
+ if not os.path.exists(dumpPath):
+ os.makedirs(dumpPath)
+ remote = Constants.DUMP_DIR_PATH
+ SdbManager.sdbPull(_devid, remote, dumpPath)
+ SdbManager.sdbShell(_devid, 'rm -rf ' + remote)
+
+
+ @staticmethod
+ def sdbPull(_devid, remote, local):
+ rmtFileCheck_cmd = Constants.SDB_SHELL % _devid + " " \
+ + Constants.FILE_FOUND_SCRIPT % remote
+ exit_code, re_stdout, re_stderr = \
+ SdbManager.sdbCommand(rmtFileCheck_cmd)
+
+ if exit_code is None:
+ return False
+
+ pull_cmd = Constants.SDB_PULL % _devid + " " + remote + " " + local
+ exit_code, re_stdout, re_stderr = SdbManager.sdbCommand(pull_cmd)
+
+ if exit_code is None:
+ return False
+
+ if Constants.checkFileExists(local) is False:
+ return False
+ else:
+ pass
+
+ return True
+
+
+
--- /dev/null
+#!/bin/bash
+
+THE_CLASSPATH=
+for i in `ls /opt/tools/manager/lib/*.jar`
+do
+ THE_CLASSPATH=${THE_CLASSPATH}:${i}
+done
+
+
+java -cp /opt/tools/manager/config/:${THE_CLASSPATH} org.tizen.tct.tool.mgr.PackageList "${@}"
+chmod 777 /opt/tools/manager/tmp/
--- /dev/null
+TCT 2.3 Release Notes\r
+\r
+1. Content overview\r
+ +----doc\r
+ |---- Web_TCT_2.3_Behavior_Test_Tool_User_Guide_v1.0.pdf\r
+ |---- Web_TCT_2.3_Manager_User_Guide_v1.0.pdf\r
+ |---- Web_TCT_2.3_Shell_User_Guide_v1.0.pdf\r
+ |---- Web_TCT_2.3_TestSuite_Packaging_Guide_v1.0.pdf\r
+ |---- Web_TCT_2.3_Tool_Packaging_Guide_v1.0.pdf\r
+ |---- Web_TCT_2.3_Tool_Packaging_Ubuntu_Guide_v1.0.pdf\r
+ |---- Web_TCT_2.3_User_Guide_v1.0.pdf\r
+ |---- RELEASE_NOTES\r
+ +----package\r
+ +---- common\r
+ +---- mobile\r
+ +---- wearable\r
+ +---- pkg_infos\r
+ +----resource\r
+ |---- getCap.wgt\r
+ |---- tct-testconfig-2.3-1.zip\r
+ |---- org.tizen.datacontrolprovider-1.0.0-arm.tpk\r
+ |---- org.tizen.datacontrolprovider-1.0.0-i386.tpk\r
+ +---- testkit-stub\r
+ +---- tinyweb subdirectory\r
+ +----tools\r
+ |---- healthcheck.ini\r
+ |---- full_pkg_generator\r
+ |---- tct-config-device.py\r
+ |---- tct-config-host.py\r
+ |---- tct-shell\r
+ |---- testkit-lite\r
+ |---- tct-mgr\r
+ +---- sdb\r
+ +---- shell\r
+ +---- testkitlite\r
+ +---- manager\r
+ +---- tct-manager related files\r
+\r
+2 Getting started\r
+\r
+2.1 TCT tools overview\r
+Tizen Compliance Tests (TCT) tools consist of these components:\r
+* Web TCT Manager: A java GUI tool that runs on the host machine, allowing users to create a test execution plan, trigger test execution, and view the test report.\r
+* Web TCT Shell: A lightweight console tool that runs on the host machine, allowing users to trigger TCT testing with an existing test plan, or a package list, or a test case ID.\r
+* Web TCT Behavior Test Tool: A device behavior checker developed using jQuery.\r
+\r
+2.2 Setting up the environment and installing the tools\r
+Follow instructions in doc/Web_TCT_2.3_User_Guide_v1.0.pdf to set up the environment of both the host and the device, and to install the tools.\r
+\r
+2.3 Using the tools\r
+Consult these documents below for detailed usage information:\r
+* doc/Web_TCT_Manager_2.3_User_Guide_v1.0.pdf\r
+* doc/Web_TCT_Shell_2.3_User_Guide_v1.0.pdf\r
+* doc/Web_TCT_Behavior_Test_Tool_2.3_User_Guide_v1.0.pdf\r
+\r
+3. Contacting us\r
+We're counting on your feedback to further improve our tools. In the meantime, we'll help you out if you encounter any problems. Please contact cathy.shen@intel.com if you'd like to get help, offer feedback, or contribute new ideas.\r
+\r
+4. Upcoming features and enhancements\r
+Upcoming features and enhancements include:\r
+* Manual test cases will be automated, as much as possible, to save execution effort.\r
+* TCT tools and cases will be modified according to TCS changes and feedback.\r
+* Manual case support for Web TCT Shell and the "--manual" command option are placeholders, currently.\r
+\r
--- /dev/null
+log4j.rootLogger=INFO,CONSOLE,FILE, ROLLING_FILE
+#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE
+log4j.addivity.org.apache=true
+###################
+# Console Appender
+###################
+log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+log4j.appender.Threshold=DEBUG
+log4j.appender.CONSOLE.Target=System.out
+log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+log4j.appender.CONSOLE.layout.ConversionPattern=[%p]-%d-[%t] %c (%F:%L) - %m%n
+#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n
+#####################
+# File Appender
+#####################
+log4j.appender.FILE=org.apache.log4j.FileAppender
+log4j.appender.FILE.File=/opt/tools/manager/log/file.log
+log4j.appender.FILE.Append=false
+log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
+#log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
+log4j.appender.FILE.layout.ConversionPattern=[%p]-%d-[%t] %c (%F:%L) - %m%n
+########################
+# Rolling File
+########################
+log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
+log4j.appender.ROLLING_FILE.Threshold=ERROR
+log4j.appender.ROLLING_FILE.File=/opt/tools/manager/log/rolling.log
+log4j.appender.ROLLING_FILE.Append=true
+log4j.appender.ROLLING_FILE.MaxFileSize=10KB
+log4j.appender.ROLLING_FILE.MaxBackupIndex=1
+log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
+#log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n
+log4j.appender.ROLLING_FILE.layout.ConversionPattern=[%p]-%d-[%t] %c (%F:%L) - %m%n
--- /dev/null
+TIZENV=tizen_web_2.3,tizen_native_2.3,tizen_web_2.3.1,tizen_native_2.3.1,tizen_web_2.3.2,tizen_native_2.3.2,tizen_web_2.4,tizen_native_2.4,tizen_web_3.0,tizen_native_3.0,tizen_csharp_3.0,tizen_web_4.0,tizen_native_4.0,tizen_csharp_4.0,tizen_web_5.0,tizen_native_5.0,tizen_csharp_5.0,tizen_web_5.5,tizen_native_5.5,tizen_csharp_5.5,tizen_web_6.0,tizen_native_6.0,tizen_csharp_6.0
+PROFILE=mobile,wearable,tv,common_iot
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_mobile" profile="mobile">\r
+ <execute_type>All</execute_type>\r
+ <suite name="tct-webdatabase-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>247</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>247</total_tcn>\r
+ <pkg_name>mobile/tct-webdatabase-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>141</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>159</total_tcn>\r
+ <pkg_name>mobile/tct-multicolumn-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-mms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>123</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>123</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-mms-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>86</total_tcn>\r
+ <pkg_name>mobile/tct-workers-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-email-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>308</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>309</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-email-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>470</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>470</total_tcn>\r
+ <pkg_name>mobile/tct-time-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>151</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>151</total_tcn>\r
+ <pkg_name>mobile/tct-forms-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>98</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>101</total_tcn>\r
+ <pkg_name>mobile/tct-fileapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-ext01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>64</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>64</total_tcn>\r
+ <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>133</auto_tcn>\r
+ <manual_tcn>78</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>mobile/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>mobile/tct-privilege-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>mobile/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>mobile/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>176</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>176</total_tcn>\r
+ <pkg_name>mobile/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>12</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>93</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>94</total_tcn>\r
+ <pkg_name>mobile/tct-notification-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fmradio-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>67</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>74</total_tcn>\r
+ <pkg_name>mobile/tct-fmradio-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>mobile/tct-appcache-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystemapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>208</total_tcn>\r
+ <pkg_name>mobile/tct-filesystemapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>9</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>270</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>270</total_tcn>\r
+ <pkg_name>mobile/tct-websocket-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>28</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>548</auto_tcn>\r
+ <manual_tcn>25</manual_tcn>\r
+ <total_tcn>573</total_tcn>\r
+ <pkg_name>mobile/tct-extra-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>mobile/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>29</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>400</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>400</total_tcn>\r
+ <pkg_name>mobile/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>73</total_tcn>\r
+ <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-networkbearerselection-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>mobile/tct-networkbearerselection-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>41</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-push-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>mobile/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-browserstate-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>262</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>262</total_tcn>\r
+ <pkg_name>mobile/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>80</total_tcn>\r
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>mobile/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>195</auto_tcn>\r
+ <manual_tcn>35</manual_tcn>\r
+ <total_tcn>230</total_tcn>\r
+ <pkg_name>mobile/tct-nfc-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contact-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>441</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>441</total_tcn>\r
+ <pkg_name>mobile/tct-contact-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>245</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>245</total_tcn>\r
+ <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-notification-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>82</manual_tcn>\r
+ <total_tcn>150</total_tcn>\r
+ <pkg_name>mobile/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>mobile/tct-websetting-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>333</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>334</total_tcn>\r
+ <pkg_name>mobile/tct-audio-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>mobile/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>184</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>192</total_tcn>\r
+ <pkg_name>mobile/tct-application-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>257</auto_tcn>\r
+ <manual_tcn>142</manual_tcn>\r
+ <total_tcn>399</total_tcn>\r
+ <pkg_name>mobile/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>mobile/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>131</manual_tcn>\r
+ <total_tcn>142</total_tcn>\r
+ <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-ui01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>19</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>422</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>422</total_tcn>\r
+ <pkg_name>mobile/tct-webaudio-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filewriterapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>mobile/tct-filewriterapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>119</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>119</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>mobile/tct-secureelement-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>56</total_tcn>\r
+ <pkg_name>mobile/tct-power-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>65</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>65</total_tcn>\r
+ <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-account-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>mobile/tct-account-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>mobile/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bookmark-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>mobile/tct-bookmark-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>mobile/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>354</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>354</total_tcn>\r
+ <pkg_name>mobile/tct-calendar-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>148</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>149</total_tcn>\r
+ <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>113</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>113</total_tcn>\r
+ <pkg_name>mobile/tct-datacontrol-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-appcontrol-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-callhistory-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>27</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>mobile/tct-callhistory-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>846</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>864</total_tcn>\r
+ <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>44</total_tcn>\r
+ <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-testconfig" launcher="WRTLauncher">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>20</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>common/tct-testconfig-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>68</total_tcn>\r
+ <pkg_name>mobile/tct-sse-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>33</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacontroller-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>162</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>165</total_tcn>\r
+ <pkg_name>mobile/tct-mediacontroller-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests03" category="Web UI Framework">\r
+ <auto_tcn>179</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>179</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests03-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests04" category="Web UI Framework">\r
+ <auto_tcn>375</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>375</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests04-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>304</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>304</total_tcn>\r
+ <pkg_name>mobile/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests05" category="Web UI Framework">\r
+ <auto_tcn>322</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>322</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests05-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>289</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>292</total_tcn>\r
+ <pkg_name>mobile/tct-filesystem-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests06" category="Web UI Framework">\r
+ <auto_tcn>98</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>98</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests06-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests01" category="Web UI Framework">\r
+ <auto_tcn>355</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>355</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests01-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests02" category="Web UI Framework">\r
+ <auto_tcn>455</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>455</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests02-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-sms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>184</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>184</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-sms-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>177</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>181</total_tcn>\r
+ <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-behavior-tests">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>30</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-behavior-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>mobile/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>541</auto_tcn>\r
+ <manual_tcn>74</manual_tcn>\r
+ <total_tcn>615</total_tcn>\r
+ <pkg_name>mobile/tct-backgrounds-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>361</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>365</total_tcn>\r
+ <pkg_name>mobile/tct-video-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>889</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>889</total_tcn>\r
+ <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_mobile" profile="mobile">\r
+ <execute_type>All</execute_type>\r
+ <suite name="tct-webdatabase-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>247</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>247</total_tcn>\r
+ <pkg_name>mobile/tct-webdatabase-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>141</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>159</total_tcn>\r
+ <pkg_name>mobile/tct-multicolumn-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-mms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>123</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>123</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-mms-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>86</total_tcn>\r
+ <pkg_name>mobile/tct-workers-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-email-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>308</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>309</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-email-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>470</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>470</total_tcn>\r
+ <pkg_name>mobile/tct-time-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>151</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>151</total_tcn>\r
+ <pkg_name>mobile/tct-forms-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>98</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>101</total_tcn>\r
+ <pkg_name>mobile/tct-fileapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-ext01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>64</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>64</total_tcn>\r
+ <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>133</auto_tcn>\r
+ <manual_tcn>78</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>mobile/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>mobile/tct-privilege-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>mobile/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>mobile/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>176</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>176</total_tcn>\r
+ <pkg_name>mobile/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>12</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>93</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>94</total_tcn>\r
+ <pkg_name>mobile/tct-notification-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fmradio-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>67</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>74</total_tcn>\r
+ <pkg_name>mobile/tct-fmradio-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>mobile/tct-appcache-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystemapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>208</total_tcn>\r
+ <pkg_name>mobile/tct-filesystemapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>9</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>270</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>270</total_tcn>\r
+ <pkg_name>mobile/tct-websocket-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>28</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>548</auto_tcn>\r
+ <manual_tcn>25</manual_tcn>\r
+ <total_tcn>573</total_tcn>\r
+ <pkg_name>mobile/tct-extra-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>mobile/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>29</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>400</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>400</total_tcn>\r
+ <pkg_name>mobile/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>73</total_tcn>\r
+ <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-networkbearerselection-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>mobile/tct-networkbearerselection-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>41</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-push-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>mobile/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-browserstate-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>262</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>262</total_tcn>\r
+ <pkg_name>mobile/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>80</total_tcn>\r
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>mobile/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>195</auto_tcn>\r
+ <manual_tcn>35</manual_tcn>\r
+ <total_tcn>230</total_tcn>\r
+ <pkg_name>mobile/tct-nfc-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contact-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>441</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>441</total_tcn>\r
+ <pkg_name>mobile/tct-contact-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>245</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>245</total_tcn>\r
+ <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-notification-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>82</manual_tcn>\r
+ <total_tcn>150</total_tcn>\r
+ <pkg_name>mobile/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>mobile/tct-websetting-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>333</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>334</total_tcn>\r
+ <pkg_name>mobile/tct-audio-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>mobile/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>184</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>192</total_tcn>\r
+ <pkg_name>mobile/tct-application-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>257</auto_tcn>\r
+ <manual_tcn>142</manual_tcn>\r
+ <total_tcn>399</total_tcn>\r
+ <pkg_name>mobile/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>mobile/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>131</manual_tcn>\r
+ <total_tcn>142</total_tcn>\r
+ <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-ui01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>19</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>422</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>422</total_tcn>\r
+ <pkg_name>mobile/tct-webaudio-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filewriterapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>mobile/tct-filewriterapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>119</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>119</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>mobile/tct-secureelement-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>56</total_tcn>\r
+ <pkg_name>mobile/tct-power-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>65</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>65</total_tcn>\r
+ <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-account-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>mobile/tct-account-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>mobile/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bookmark-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>mobile/tct-bookmark-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>mobile/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>354</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>354</total_tcn>\r
+ <pkg_name>mobile/tct-calendar-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>148</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>149</total_tcn>\r
+ <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>113</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>113</total_tcn>\r
+ <pkg_name>mobile/tct-datacontrol-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-appcontrol-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-callhistory-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>27</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>mobile/tct-callhistory-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>846</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>864</total_tcn>\r
+ <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>44</total_tcn>\r
+ <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-testconfig" launcher="WRTLauncher">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>20</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>common/tct-testconfig-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>68</total_tcn>\r
+ <pkg_name>mobile/tct-sse-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>33</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacontroller-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>162</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>165</total_tcn>\r
+ <pkg_name>mobile/tct-mediacontroller-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests03" category="Web UI Framework">\r
+ <auto_tcn>179</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>179</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests03-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests04" category="Web UI Framework">\r
+ <auto_tcn>375</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>375</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests04-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>304</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>304</total_tcn>\r
+ <pkg_name>mobile/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests05" category="Web UI Framework">\r
+ <auto_tcn>322</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>322</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests05-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>289</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>292</total_tcn>\r
+ <pkg_name>mobile/tct-filesystem-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests06" category="Web UI Framework">\r
+ <auto_tcn>98</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>98</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests06-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests01" category="Web UI Framework">\r
+ <auto_tcn>355</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>355</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests01-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests02" category="Web UI Framework">\r
+ <auto_tcn>455</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>455</total_tcn>\r
+ <pkg_name>mobile/tct-webuifw-tests02-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-sms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>184</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>184</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-sms-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>177</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>181</total_tcn>\r
+ <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-behavior-tests">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>30</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-behavior-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>mobile/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>541</auto_tcn>\r
+ <manual_tcn>74</manual_tcn>\r
+ <total_tcn>615</total_tcn>\r
+ <pkg_name>mobile/tct-backgrounds-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>361</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>365</total_tcn>\r
+ <pkg_name>mobile/tct-video-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>889</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>889</total_tcn>\r
+ <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_tv" profile="tv">\r
+ <execute_type>All</execute_type>\r
+ <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>141</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>159</total_tcn>\r
+ <pkg_name>tv/tct-multicolumn-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>86</total_tcn>\r
+ <pkg_name>tv/tct-workers-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>459</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>459</total_tcn>\r
+ <pkg_name>tv/tct-time-tizen-tests-2.4-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>146</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>146</total_tcn>\r
+ <pkg_name>tv/tct-forms-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>97</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>97</total_tcn>\r
+ <pkg_name>tv/tct-fileapi-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-ext01-wrt-tests-2.3-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tv-channel-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>123</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>123</total_tcn>\r
+ <pkg_name>tv/tct-tv-channel-tizen-tests-2.4-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>63</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>63</total_tcn>\r
+ <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>133</auto_tcn>\r
+ <manual_tcn>78</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>common/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>common/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>175</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>175</total_tcn>\r
+ <pkg_name>tv/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>12</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>tv/tct-appcache-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>9</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>28</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>268</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>268</total_tcn>\r
+ <pkg_name>tv/tct-websocket-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>544</auto_tcn>\r
+ <manual_tcn>25</manual_tcn>\r
+ <total_tcn>569</total_tcn>\r
+ <pkg_name>tv/tct-extra-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>tv/tct-fullscreen-nonw3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>29</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>391</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>391</total_tcn>\r
+ <pkg_name>tv/tct-indexeddb-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>73</total_tcn>\r
+ <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>tv/tct-browserstate-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>202</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>202</total_tcn>\r
+ <pkg_name>tv/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>tv/tct-navigationtiming-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>80</total_tcn>\r
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>common/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>tv/tct-pagevisibility-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>230</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>230</total_tcn>\r
+ <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>tv/tct-notification-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tv-displaycontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>tv/tct-tv-displaycontrol-tizen-tests-2.4-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>51</manual_tcn>\r
+ <total_tcn>69</total_tcn>\r
+ <pkg_name>tv/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>tv/tct-websetting-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>338</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>339</total_tcn>\r
+ <pkg_name>common/tct-audio-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>tv/tct-screenorientation-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>common/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>159</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>165</total_tcn>\r
+ <pkg_name>tv/tct-application-tizen-tests-2.3-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>47</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>47</total_tcn>\r
+ <pkg_name>common/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>131</manual_tcn>\r
+ <total_tcn>142</total_tcn>\r
+ <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>tv/tct-ui01-wrt-tests-2.4-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dynamicbox-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>common/tct-dynamicbox-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tv-window-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>70</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>70</total_tcn>\r
+ <pkg_name>tv/tct-tv-window-tizen-tests-2.4-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>422</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>422</total_tcn>\r
+ <pkg_name>tv/tct-webaudio-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>100</auto_tcn>\r
+ <manual_tcn>19</manual_tcn>\r
+ <total_tcn>119</total_tcn>\r
+ <pkg_name>common/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>56</total_tcn>\r
+ <pkg_name>common/tct-power-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tv-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>tv/tct-tv-inputdevice-tizen-tests-2.4-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>70</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>70</total_tcn>\r
+ <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tv-audiocontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>tv/tct-tv-audiocontrol-tizen-tests-2.4-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>75</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>tv/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>209</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>212</total_tcn>\r
+ <pkg_name>common/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>148</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>149</total_tcn>\r
+ <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>846</auto_tcn>\r
+ <manual_tcn>19</manual_tcn>\r
+ <total_tcn>865</total_tcn>\r
+ <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>44</total_tcn>\r
+ <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-testconfig" launcher="WRTLauncher">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>19</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>common/tct-testconfig-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>68</total_tcn>\r
+ <pkg_name>tv/tct-sse-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>33</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests03" category="Web UI Framework">\r
+ <auto_tcn>179</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>179</total_tcn>\r
+ <pkg_name>tv/tct-webuifw-tests03-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests04" category="Web UI Framework">\r
+ <auto_tcn>375</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>375</total_tcn>\r
+ <pkg_name>tv/tct-webuifw-tests04-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-maxLength-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests05" category="Web UI Framework">\r
+ <auto_tcn>322</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>322</total_tcn>\r
+ <pkg_name>tv/tct-webuifw-tests05-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>291</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>294</total_tcn>\r
+ <pkg_name>tv/tct-filesystem-tizen-tests-2.3-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>276</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>276</total_tcn>\r
+ <pkg_name>tv/tct-systeminfo-tizen-tests-2.3-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests06" category="Web UI Framework">\r
+ <auto_tcn>98</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>98</total_tcn>\r
+ <pkg_name>tv/tct-webuifw-tests06-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests01" category="Web UI Framework">\r
+ <auto_tcn>355</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>355</total_tcn>\r
+ <pkg_name>tv/tct-webuifw-tests01-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests02" category="Web UI Framework">\r
+ <auto_tcn>455</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>455</total_tcn>\r
+ <pkg_name>tv/tct-webuifw-tests02-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>common/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-behavior-tests">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>tv/tct-behavior-tests-2.4-1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>177</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>181</total_tcn>\r
+ <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>52</total_tcn>\r
+ <pkg_name>tv/tct-mediaqueries-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>common/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>541</auto_tcn>\r
+ <manual_tcn>74</manual_tcn>\r
+ <total_tcn>615</total_tcn>\r
+ <pkg_name>tv/tct-backgrounds-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>366</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>370</total_tcn>\r
+ <pkg_name>tv/tct-video-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>889</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>889</total_tcn>\r
+ <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Full_wearable" profile="wearable">\r
+ <execute_type>All</execute_type>\r
+ <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>63</manual_tcn>\r
+ <total_tcn>131</total_tcn>\r
+ <pkg_name>wearable/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>338</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>339</total_tcn>\r
+ <pkg_name>common/tct-audio-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>common/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>86</total_tcn>\r
+ <pkg_name>wearable/tct-workers-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>159</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>165</total_tcn>\r
+ <pkg_name>wearable/tct-application-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>47</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>47</total_tcn>\r
+ <pkg_name>common/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>214</auto_tcn>\r
+ <manual_tcn>44</manual_tcn>\r
+ <total_tcn>258</total_tcn>\r
+ <pkg_name>common/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>131</manual_tcn>\r
+ <total_tcn>142</total_tcn>\r
+ <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>wearable/tct-ui01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dynamicbox-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>common/tct-dynamicbox-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>146</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>146</total_tcn>\r
+ <pkg_name>wearable/tct-forms-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>470</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>470</total_tcn>\r
+ <pkg_name>wearable/tct-time-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>98</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>101</total_tcn>\r
+ <pkg_name>wearable/tct-fileapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-ext01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>63</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>63</total_tcn>\r
+ <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>133</auto_tcn>\r
+ <manual_tcn>78</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>common/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>119</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>119</total_tcn>\r
+ <pkg_name>common/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>142</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>142</total_tcn>\r
+ <pkg_name>wearable/tct-privilege-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>56</total_tcn>\r
+ <pkg_name>common/tct-power-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>66</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>common/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>175</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>175</total_tcn>\r
+ <pkg_name>wearable/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>12</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>wearable/tct-notification-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>wearable/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>9</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>209</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>212</total_tcn>\r
+ <pkg_name>common/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>148</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>149</total_tcn>\r
+ <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>268</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>268</total_tcn>\r
+ <pkg_name>wearable/tct-websocket-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>28</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>544</auto_tcn>\r
+ <manual_tcn>25</manual_tcn>\r
+ <total_tcn>569</total_tcn>\r
+ <pkg_name>wearable/tct-extra-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>29</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>391</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>391</total_tcn>\r
+ <pkg_name>wearable/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>73</total_tcn>\r
+ <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>83</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>83</total_tcn>\r
+ <pkg_name>wearable/tct-camera-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>44</total_tcn>\r
+ <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>846</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>864</total_tcn>\r
+ <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-testconfig" launcher="WRTLauncher">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>19</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>common/tct-testconfig-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>202</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>202</total_tcn>\r
+ <pkg_name>wearable/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>281</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>281</total_tcn>\r
+ <pkg_name>wearable/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>289</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>289</total_tcn>\r
+ <pkg_name>wearable/tct-filesystem-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>80</total_tcn>\r
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>common/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>common/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>wearable/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-behavior-tests">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>19</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>wearable/tct-behavior-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>177</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>181</total_tcn>\r
+ <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests" category="Web UI Framework">\r
+ <auto_tcn>524</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>524</total_tcn>\r
+ <pkg_name>wearable/tct-webuifw-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>52</total_tcn>\r
+ <pkg_name>wearable/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>230</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>230</total_tcn>\r
+ <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>common/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>366</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>370</total_tcn>\r
+ <pkg_name>wearable/tct-video-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>541</auto_tcn>\r
+ <manual_tcn>74</manual_tcn>\r
+ <total_tcn>615</total_tcn>\r
+ <pkg_name>wearable/tct-backgrounds-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>889</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>889</total_tcn>\r
+ <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+function getScrollTop() {
+ return f_scrollTop();
+}
+
+function f_scrollTop() {
+ return f_filterResults($(window) ? $(window).scrollTop() : 0,
+ document.documentElement ? document.documentElement.scrollTop : 0,
+ document.body ? document.body.scrollTop : 0);
+}
+function f_filterResults(n_win, n_docel, n_body) {
+ var n_result = n_win ? n_win : 0;
+ if (n_docel && (!n_result || (n_result > n_docel)))
+ n_result = n_docel;
+ return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
+}
+
+function setScrollTop() {
+ $(window) ? $(window).scrollTop(0) : 0;
+ document.documentElement ? document.documentElement.scrollTop = 0 : 0;
+ document.body ? document.body.scrollTop = 0 : 0;
+}
+
+function goTopEx() {
+ $node = $('#goTopBtn');
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+
+ $(window).scroll(function() {
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+ });
+
+ $node.click(function() {
+ setScrollTop();
+ });
+}
+
+function drawRatio() {
+ $('.suite_item').each(function(i, node) {
+ drawSuiteRatio(node)
+ });
+}
+
+$(".see_all").click(function(){
+ $("#see_all").show();
+ $("#see_fail").hide();
+ $("#see_block").hide();
+ $("#see_na").hide();
+ updateToggles();
+ return false;
+});
+
+$(".see_failed").click(function(){
+ $("#see_all").hide();
+ $("#see_fail").show();
+ $("#see_block").hide();
+ $("#see_na").hide();
+ updateToggles();
+ return false;
+});
+
+$(".see_blocked").click(function(){
+ $("#see_all").hide();
+ $("#see_fail").hide();
+ $("#see_block").show();
+ $("#see_na").hide();
+ updateToggles();
+ return false;
+});
+
+$(".see_na").click(function(){
+ $("#see_all").hide();
+ $("#see_fail").hide();
+ $("#see_block").hide();
+ $("#see_na").show();
+ updateToggles();
+ return false;
+});
+
+$("a.test_case_popup").click(function(){
+ var $this = $(this);
+ Popup.show($this.attr('id'));
+ return false;
+});
+
+$(".see_capabilities").click(function(){
+ if ($('#capability_table').css('display') == 'none') {
+ $("#capability_table").show();
+ }else{
+ $("#capability_table").hide();
+ }
+ return false;
+});
+
+function drawSuiteRatio(node) {
+ arrTitle = new Array("Passed", "Failed", "Blocked", "Not Executed");
+ var $node = $(node);
+ var $total = $node.find('.total');
+ var $pass = $node.find('.pass');
+ var $fail = $node.find('.fail');
+ var $block = $node.find('.block');
+ var $na = $node.find('.na');
+ var $div = $node.find('.RatioGraphic');
+
+ var total_int = parseInt($total.text());
+ var pass_int = parseInt($pass.text());
+ var fail_int = parseInt($fail.text());
+ var block_int = parseInt($block.text());
+ var na_int = parseInt($na.text());
+
+ var pass_rate = pass_int * 100 / total_int;
+ var fail_rate = fail_int * 100 / total_int;
+ var block_rate = block_int * 100 / total_int;
+ var na_rate = na_int * 100 / total_int;
+
+ var areaWidth = 380;
+
+ var pass_width = areaWidth * pass_rate / 100;
+ var fail_width = areaWidth * fail_rate / 100;
+ var block_width = areaWidth * block_rate / 100;
+ var na_width = areaWidth * na_rate / 100;
+
+ pass_rate = pass_rate.toFixed(2);
+ fail_rate = fail_rate.toFixed(2);
+ block_rate = block_rate.toFixed(2);
+ na_rate = na_rate.toFixed(2);
+
+ var pass_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/blue.jpg");"
+ var fail_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/red.jpg");"
+ var block_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/orange.jpg");"
+ var na_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/gray.jpg");"
+
+ var html = "<table width=\"380.68\" align=\"center\"><tbody><tr>";
+ if (pass_width > 0){
+ html += "<td width=\""
+ + pass_width
+ + "\" style=\""
+ + pass_style
+ + "\" title=\"Passed :"
+ + pass_rate
+ + "%\">";
+ if (pass_width > 20){
+ html += pass_rate + "%"
+ }
+ html += "</td>";
+ }
+ if (fail_width > 0){
+ html += "<td width=\""
+ + fail_width
+ + "\" style=\""
+ + fail_style
+ + "\" title=\"Failed :"
+ + fail_rate
+ + "%\">";
+ if (fail_width > 20){
+ html += fail_rate + "%"
+ }
+ html += "</td>";
+ }
+ if (block_width > 0){
+ html += "<td width=\""
+ + block_width
+ + "\" style=\""
+ + block_style
+ + "\" title=\"Blocked :"
+ + block_rate
+ + "%\">";
+ if (block_width > 20){
+ html += block_rate + "%"
+ }
+ html += "</td>";
+ }
+ if (na_width > 0){
+ html += "<td width=\""
+ + na_width
+ + "\" style=\""
+ + na_style
+ + "\" title=\"Blocked :"
+ + na_rate
+ + "%\">";
+ if (na_width > 20){
+ html += na_rate + "%"
+ }
+ html += "</td>";
+ }
+ html += "</tr></tbody></table>";
+ $div.html(html);
+}
--- /dev/null
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
--- /dev/null
+/**
+ * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
+ *
+ * Dual licensed under the MIT and GPL licenses.
+ * This basically means you can use this code however you want for
+ * free, but don't claim to have written it yourself!
+ * Donations always accepted: http://www.JavascriptToolbox.com/donate/
+ *
+ * Please do not link to the .js files on javascripttoolbox.com from
+ * your site. Copy the files locally to your server instead.
+ *
+ */
+/* ******************************************************************* */
+/* UTIL FUNCTIONS */
+/* ******************************************************************* */
+var Util = {'$VERSION':1.06};
+
+// Util functions - these are GLOBAL so they
+// look like built-in functions.
+
+// Determine if an object is an array
+function isArray(o) {
+ return (o!=null && typeof(o)=="object" && typeof(o.length)=="number" && (o.length==0 || defined(o[0])));
+};
+
+// Determine if an object is an Object
+function isObject(o) {
+ return (o!=null && typeof(o)=="object" && defined(o.constructor) && o.constructor==Object && !defined(o.nodeName));
+};
+
+// Determine if a reference is defined
+function defined(o) {
+ return (typeof(o)!="undefined");
+};
+
+// Iterate over an array, object, or list of items and run code against each item
+// Similar functionality to Perl's map() function
+function map(func) {
+ var i,j,o;
+ var results = [];
+ if (typeof(func)=="string") {
+ func = new Function('$_',func);
+ }
+ for (i=1; i<arguments.length; i++) {
+ o = arguments[i];
+ if (isArray(o)) {
+ for (j=0; j<o.length; j++) {
+ results[results.length] = func(o[j]);
+ }
+ }
+ else if (isObject(o)) {
+ for (j in o) {
+ results[results.length] = func(o[j]);
+ }
+ }
+ else {
+ results[results.length] = func(o);
+ }
+ }
+ return results;
+};
+
+// Set default values in an object if they are undefined
+function setDefaultValues(o,values) {
+ if (!defined(o) || o==null) {
+ o = {};
+ }
+ if (!defined(values) || values==null) {
+ return o;
+ }
+ for (var val in values) {
+ if (!defined(o[val])) {
+ o[val] = values[val];
+ }
+ }
+ return o;
+};
+
+/* ******************************************************************* */
+/* DEFAULT OBJECT PROTOTYPE ENHANCEMENTS */
+/* ******************************************************************* */
+// These functions add useful functionality to built-in objects
+Array.prototype.contains = function(o) {
+ var i,l;
+ if (!(l = this.length)) { return false; }
+ for (i=0; i<l; i++) {
+ if (o==this[i]) {
+ return true;
+ }
+ }
+};
+
+/* ******************************************************************* */
+/* DOM FUNCTIONS */
+/* ******************************************************************* */
+var DOM = (function() {
+ var dom = {};
+
+ // Get a parent tag with a given nodename
+ dom.getParentByTagName = function(o,tagNames) {
+ if(o==null) { return null; }
+ if (isArray(tagNames)) {
+ tagNames = map("return $_.toUpperCase()",tagNames);
+ while (o=o.parentNode) {
+ if (o.nodeName && tagNames.contains(o.nodeName)) {
+ return o;
+ }
+ }
+ }
+ else {
+ tagNames = tagNames.toUpperCase();
+ while (o=o.parentNode) {
+ if (o.nodeName && tagNames==o.nodeName) {
+ return o;
+ }
+ }
+ }
+ return null;
+ };
+
+ // Remove a node from its parent
+ dom.removeNode = function(o) {
+ if (o!=null && o.parentNode && o.parentNode.removeChild) {
+ // First remove all attributes which are func references, to avoid memory leaks
+ for (var i in o) {
+ if (typeof(o[i])=="function") {
+ o[i] = null;
+ }
+ }
+ o.parentNode.removeChild(o);
+ return true;
+ }
+ return false;
+ };
+
+ // Get the outer width in pixels of an object, including borders, padding, and margin
+ dom.getOuterWidth = function(o) {
+ if (defined(o.offsetWidth)) {
+ return o.offsetWidth;
+ }
+ return null;
+ };
+
+ // Get the outer height in pixels of an object, including borders, padding, and margin
+ dom.getOuterHeight = function(o) {
+ if (defined(o.offsetHeight)) {
+ return o.offsetHeight;
+ }
+ return null;
+ };
+
+ // Resolve an item, an array of items, or an object of items
+ dom.resolve = function() {
+ var results = new Array();
+ var i,j,o;
+ for (var i=0; i<arguments.length; i++) {
+ var o = arguments[i];
+ if (o==null) {
+ if (arguments.length==1) {
+ return null;
+ }
+ results[results.length] = null;
+ }
+ else if (typeof(o)=='string') {
+ if (document.getElementById) {
+ o = document.getElementById(o);
+ }
+ else if (document.all) {
+ o = document.all[o];
+ }
+ if (arguments.length==1) {
+ return o;
+ }
+ results[results.length] = o;
+ }
+ else if (isArray(o)) {
+ for (j=0; j<o.length; j++) {
+ results[results.length] = o[j];
+ }
+ }
+ else if (isObject(o)) {
+ for (j in o) {
+ results[results.length] = o[j];
+ }
+ }
+ else if (arguments.length==1) {
+ return o;
+ }
+ else {
+ results[results.length] = o;
+ }
+ }
+ return results;
+ };
+ dom.$ = dom.resolve;
+
+ return dom;
+})();
+
+/* ******************************************************************* */
+/* CSS FUNCTIONS */
+/* ******************************************************************* */
+var CSS = (function(){
+ var css = {};
+
+ // Convert an RGB string in the form "rgb (255, 255, 255)" to "#ffffff"
+ css.rgb2hex = function(rgbString) {
+ if (typeof(rgbString)!="string" || !defined(rgbString.match)) { return null; }
+ var result = rgbString.match(/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/);
+ if (result==null) { return rgbString; }
+ var rgb = +result[1] << 16 | +result[2] << 8 | +result[3];
+ var hex = "";
+ var digits = "0123456789abcdef";
+ while(rgb!=0) {
+ hex = digits.charAt(rgb&0xf)+hex;
+ rgb>>>=4;
+ }
+ while(hex.length<6) { hex='0'+hex; }
+ return "#" + hex;
+ };
+
+ // Convert hyphen style names like border-width to camel case like borderWidth
+ css.hyphen2camel = function(property) {
+ if (!defined(property) || property==null) { return null; }
+ if (property.indexOf("-")<0) { return property; }
+ var str = "";
+ var c = null;
+ var l = property.length;
+ for (var i=0; i<l; i++) {
+ c = property.charAt(i);
+ str += (c!="-")?c:property.charAt(++i).toUpperCase();
+ }
+ return str;
+ };
+
+ // Determine if an object or class string contains a given class.
+ css.hasClass = function(obj,className) {
+ if (!defined(obj) || obj==null || !RegExp) { return false; }
+ var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
+ if (typeof(obj)=="string") {
+ return re.test(obj);
+ }
+ else if (typeof(obj)=="object" && obj.className) {
+ return re.test(obj.className);
+ }
+ return false;
+ };
+
+ // Add a class to an object
+ css.addClass = function(obj,className) {
+ if (typeof(obj)!="object" || obj==null || !defined(obj.className)) { return false; }
+ if (obj.className==null || obj.className=='') {
+ obj.className = className;
+ return true;
+ }
+ if (css.hasClass(obj,className)) { return true; }
+ obj.className = obj.className + " " + className;
+ return true;
+ };
+
+ // Remove a class from an object
+ css.removeClass = function(obj,className) {
+ if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
+ if (!css.hasClass(obj,className)) { return false; }
+ var re = new RegExp("(^|\\s+)" + className + "(\\s+|$)");
+ obj.className = obj.className.replace(re,' ');
+ return true;
+ };
+
+ // Fully replace a class with a new one
+ css.replaceClass = function(obj,className,newClassName) {
+ if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
+ css.removeClass(obj,className);
+ css.addClass(obj,newClassName);
+ return true;
+ };
+
+ // Get the currently-applied style of an object
+ css.getStyle = function(o, property) {
+ if (o==null) { return null; }
+ var val = null;
+ var camelProperty = css.hyphen2camel(property);
+ // Handle "float" property as a special case
+ if (property=="float") {
+ val = css.getStyle(o,"cssFloat");
+ if (val==null) {
+ val = css.getStyle(o,"styleFloat");
+ }
+ }
+ else if (o.currentStyle && defined(o.currentStyle[camelProperty])) {
+ val = o.currentStyle[camelProperty];
+ }
+ else if (window.getComputedStyle) {
+ val = window.getComputedStyle(o,null).getPropertyValue(property);
+ }
+ else if (o.style && defined(o.style[camelProperty])) {
+ val = o.style[camelProperty];
+ }
+ // For color values, make the value consistent across browsers
+ // Convert rgb() colors back to hex for consistency
+ if (/^\s*rgb\s*\(/.test(val)) {
+ val = css.rgb2hex(val);
+ }
+ // Lowercase all #hex values
+ if (/^#/.test(val)) {
+ val = val.toLowerCase();
+ }
+ return val;
+ };
+ css.get = css.getStyle;
+
+ // Set a style on an object
+ css.setStyle = function(o, property, value) {
+ if (o==null || !defined(o.style) || !defined(property) || property==null || !defined(value)) { return false; }
+ if (property=="float") {
+ o.style["cssFloat"] = value;
+ o.style["styleFloat"] = value;
+ }
+ else if (property=="opacity") {
+ o.style['-moz-opacity'] = value;
+ o.style['-khtml-opacity'] = value;
+ o.style.opacity = value;
+ if (defined(o.style.filter)) {
+ o.style.filter = "alpha(opacity=" + value*100 + ")";
+ }
+ }
+ else {
+ o.style[css.hyphen2camel(property)] = value;
+ }
+ return true;
+ };
+ css.set = css.setStyle;
+
+ // Get a unique ID which doesn't already exist on the page
+ css.uniqueIdNumber=1000;
+ css.createId = function(o) {
+ if (defined(o) && o!=null && defined(o.id) && o.id!=null && o.id!="") {
+ return o.id;
+ }
+ var id = null;
+ while (id==null || document.getElementById(id)!=null) {
+ id = "ID_"+(css.uniqueIdNumber++);
+ }
+ if (defined(o) && o!=null && (!defined(o.id)||o.id=="")) {
+ o.id = id;
+ }
+ return id;
+ };
+
+ return css;
+})();
+
+/* ******************************************************************* */
+/* EVENT FUNCTIONS */
+/* ******************************************************************* */
+
+var Event = (function(){
+ var ev = {};
+
+ // Resolve an event using IE's window.event if necessary
+ // --------------------------------------------------------------------
+ ev.resolve = function(e) {
+ if (!defined(e) && defined(window.event)) {
+ e = window.event;
+ }
+ return e;
+ };
+
+ // Add an event handler to a function
+ // Note: Don't use 'this' within functions added using this method, since
+ // the attachEvent and addEventListener models differ.
+ // --------------------------------------------------------------------
+ ev.add = function( obj, type, fn, capture ) {
+ if (obj.addEventListener) {
+ obj.addEventListener( type, fn, capture );
+ return true;
+ }
+ else if (obj.attachEvent) {
+ obj.attachEvent( "on"+type, fn );
+ return true;
+ }
+ return false;
+ };
+
+ // Get the mouse position of an event
+ // --------------------------------------------------------------------
+ // PageX/Y, where they exist, are more reliable than ClientX/Y because
+ // of some browser bugs in Opera/Safari
+ ev.getMouseX = function(e) {
+ e = ev.resolve(e);
+ if (defined(e.pageX)) {
+ return e.pageX;
+ }
+ if (defined(e.clientX)) {
+ return e.clientX+Screen.getScrollLeft();
+ }
+ return null;
+ };
+ ev.getMouseY = function(e) {
+ e = ev.resolve(e);
+ if (defined(e.pageY)) {
+ return e.pageY;
+ }
+ if (defined(e.clientY)) {
+ return e.clientY+Screen.getScrollTop();
+ }
+ return null;
+ };
+
+ // Stop the event from bubbling up to parent elements.
+ // Two method names map to the same function
+ // --------------------------------------------------------------------
+ ev.cancelBubble = function(e) {
+ e = ev.resolve(e);
+ if (typeof(e.stopPropagation)=="function") { e.stopPropagation(); }
+ if (defined(e.cancelBubble)) { e.cancelBubble = true; }
+ };
+ ev.stopPropagation = ev.cancelBubble;
+
+ // Prevent the default handling of the event to occur
+ // --------------------------------------------------------------------
+ ev.preventDefault = function(e) {
+ e = ev.resolve(e);
+ if (typeof(e.preventDefault)=="function") { e.preventDefault(); }
+ if (defined(e.returnValue)) { e.returnValue = false; }
+ };
+
+ return ev;
+})();
+
+/* ******************************************************************* */
+/* SCREEN FUNCTIONS */
+/* ******************************************************************* */
+var Screen = (function() {
+ var screen = {};
+
+ // Get a reference to the body
+ // --------------------------------------------------------------------
+ screen.getBody = function() {
+ if (document.body) {
+ return document.body;
+ }
+ if (document.getElementsByTagName) {
+ var bodies = document.getElementsByTagName("BODY");
+ if (bodies!=null && bodies.length>0) {
+ return bodies[0];
+ }
+ }
+ return null;
+ };
+
+ // Get the amount that the main document has scrolled from top
+ // --------------------------------------------------------------------
+ screen.getScrollTop = function() {
+ if (document.documentElement && defined(document.documentElement.scrollTop) && document.documentElement.scrollTop>0) {
+ return document.documentElement.scrollTop;
+ }
+ if (document.body && defined(document.body.scrollTop)) {
+ return document.body.scrollTop;
+ }
+ return null;
+ };
+
+ // Get the amount that the main document has scrolled from left
+ // --------------------------------------------------------------------
+ screen.getScrollLeft = function() {
+ if (document.documentElement && defined(document.documentElement.scrollLeft) && document.documentElement.scrollLeft>0) {
+ return document.documentElement.scrollLeft;
+ }
+ if (document.body && defined(document.body.scrollLeft)) {
+ return document.body.scrollLeft;
+ }
+ return null;
+ };
+
+ // Util function to default a bad number to 0
+ // --------------------------------------------------------------------
+ screen.zero = function(n) {
+ return (!defined(n) || isNaN(n))?0:n;
+ };
+
+ // Get the width of the entire document
+ // --------------------------------------------------------------------
+ screen.getDocumentWidth = function() {
+ var width = 0;
+ var body = screen.getBody();
+ if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ var rightMargin = parseInt(CSS.get(body,'marginRight'),10) || 0;
+ var leftMargin = parseInt(CSS.get(body,'marginLeft'), 10) || 0;
+ width = Math.max(body.offsetWidth + leftMargin + rightMargin, document.documentElement.clientWidth);
+ }
+ else {
+ width = Math.max(body.clientWidth, body.scrollWidth);
+ }
+ if (isNaN(width) || width==0) {
+ width = screen.zero(self.innerWidth);
+ }
+ return width;
+ };
+
+ // Get the height of the entire document
+ // --------------------------------------------------------------------
+ screen.getDocumentHeight = function() {
+ var body = screen.getBody();
+ var innerHeight = (defined(self.innerHeight)&&!isNaN(self.innerHeight))?self.innerHeight:0;
+ if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ var topMargin = parseInt(CSS.get(body,'marginTop'),10) || 0;
+ var bottomMargin = parseInt(CSS.get(body,'marginBottom'), 10) || 0;
+ return Math.max(body.offsetHeight + topMargin + bottomMargin, document.documentElement.clientHeight, document.documentElement.scrollHeight, screen.zero(self.innerHeight));
+ }
+ return Math.max(body.scrollHeight, body.clientHeight, screen.zero(self.innerHeight));
+ };
+
+ // Get the width of the viewport (viewable area) in the browser window
+ // --------------------------------------------------------------------
+ screen.getViewportWidth = function() {
+ if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ return document.documentElement.clientWidth;
+ }
+ else if (document.compatMode && document.body) {
+ return document.body.clientWidth;
+ }
+ return screen.zero(self.innerWidth);
+ };
+
+ // Get the height of the viewport (viewable area) in the browser window
+ // --------------------------------------------------------------------
+ screen.getViewportHeight = function() {
+ if (!window.opera && document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ return document.documentElement.clientHeight;
+ }
+ else if (document.compatMode && !window.opera && document.body) {
+ return document.body.clientHeight;
+ }
+ return screen.zero(self.innerHeight);
+ };
+
+ return screen;
+})();var Sort = (function(){
+ var sort = {};
+ sort.AlphaNumeric = function(a,b) {
+ if (a==b) { return 0; }
+ if (a<b) { return -1; }
+ return 1;
+ };
+
+ sort.Default = sort.AlphaNumeric;
+
+ sort.NumericConversion = function(val) {
+ if (typeof(val)!="number") {
+ if (typeof(val)=="string") {
+ val = parseFloat(val.replace(/,/g,''));
+ if (isNaN(val) || val==null) { val=0; }
+ }
+ else {
+ val = 0;
+ }
+ }
+ return val;
+ };
+
+ sort.Numeric = function(a,b) {
+ return sort.NumericConversion(a)-sort.NumericConversion(b);
+ };
+
+ sort.IgnoreCaseConversion = function(val) {
+ if (val==null) { val=""; }
+ return (""+val).toLowerCase();
+ };
+
+ sort.IgnoreCase = function(a,b) {
+ return sort.AlphaNumeric(sort.IgnoreCaseConversion(a),sort.IgnoreCaseConversion(b));
+ };
+
+ sort.CurrencyConversion = function(val) {
+ if (typeof(val)=="string") {
+ val = val.replace(/^[^\d\.]/,'');
+ }
+ return sort.NumericConversion(val);
+ };
+
+ sort.Currency = function(a,b) {
+ return sort.Numeric(sort.CurrencyConversion(a),sort.CurrencyConversion(b));
+ };
+
+ sort.DateConversion = function(val) {
+ // inner util function to parse date formats
+ function getdate(str) {
+ // inner util function to convert 2-digit years to 4
+ function fixYear(yr) {
+ yr = +yr;
+ if (yr<50) { yr += 2000; }
+ else if (yr<100) { yr += 1900; }
+ return yr;
+ };
+ var ret;
+ // YYYY-MM-DD
+ if (ret=str.match(/(\d{2,4})-(\d{1,2})-(\d{1,2})/)) {
+ return (fixYear(ret[1])*10000) + (ret[2]*100) + (+ret[3]);
+ }
+ // MM/DD/YY[YY] or MM-DD-YY[YY]
+ if (ret=str.match(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/)) {
+ return (fixYear(ret[3])*10000) + (ret[1]*100) + (+ret[2]);
+ }
+ return 99999999; // So non-parsed dates will be last, not first
+ };
+ return getdate(val);
+ };
+
+ sort.Date = function(a,b) {
+ return sort.Numeric(sort.DateConversion(a),sort.DateConversion(b));
+ };
+
+ return sort;
+})();
+
+var Position = (function() {
+ // Resolve a string identifier to an object
+ // ========================================
+ function resolveObject(s) {
+ if (document.getElementById && document.getElementById(s)!=null) {
+ return document.getElementById(s);
+ }
+ else if (document.all && document.all[s]!=null) {
+ return document.all[s];
+ }
+ else if (document.anchors && document.anchors.length && document.anchors.length>0 && document.anchors[0].x) {
+ for (var i=0; i<document.anchors.length; i++) {
+ if (document.anchors[i].name==s) {
+ return document.anchors[i]
+ }
+ }
+ }
+ }
+
+ var pos = {};
+ pos.$VERSION = 1.0;
+
+ // Set the position of an object
+ // =============================
+ pos.set = function(o,left,top) {
+ if (typeof(o)=="string") {
+ o = resolveObject(o);
+ }
+ if (o==null || !o.style) {
+ return false;
+ }
+
+ // If the second parameter is an object, it is assumed to be the result of getPosition()
+ if (typeof(left)=="object") {
+ var pos = left;
+ left = pos.left;
+ top = pos.top;
+ }
+
+ o.style.left = left + "px";
+ o.style.top = top + "px";
+ return true;
+ };
+
+ // Retrieve the position and size of an object
+ // ===========================================
+ pos.get = function(o) {
+ var fixBrowserQuirks = true;
+ // If a string is passed in instead of an object ref, resolve it
+ if (typeof(o)=="string") {
+ o = resolveObject(o);
+ }
+
+ if (o==null) {
+ return null;
+ }
+
+ var left = 0;
+ var top = 0;
+ var width = 0;
+ var height = 0;
+ var parentNode = null;
+ var offsetParent = null;
+
+
+ offsetParent = o.offsetParent;
+ var originalObject = o;
+ var el = o; // "el" will be nodes as we walk up, "o" will be saved for offsetParent references
+ while (el.parentNode!=null) {
+ el = el.parentNode;
+ if (el.offsetParent==null) {
+ }
+ else {
+ var considerScroll = true;
+ /*
+ In Opera, if parentNode of the first object is scrollable, then offsetLeft/offsetTop already
+ take its scroll position into account. If elements further up the chain are scrollable, their
+ scroll offsets still need to be added in. And for some reason, TR nodes have a scrolltop value
+ which must be ignored.
+ */
+ if (fixBrowserQuirks && window.opera) {
+ if (el==originalObject.parentNode || el.nodeName=="TR") {
+ considerScroll = false;
+ }
+ }
+ if (considerScroll) {
+ if (el.scrollTop && el.scrollTop>0) {
+ top -= el.scrollTop;
+ }
+ if (el.scrollLeft && el.scrollLeft>0) {
+ left -= el.scrollLeft;
+ }
+ }
+ }
+ // If this node is also the offsetParent, add on the offsets and reset to the new offsetParent
+ if (el == offsetParent) {
+ left += o.offsetLeft;
+ if (el.clientLeft && el.nodeName!="TABLE") {
+ left += el.clientLeft;
+ }
+ top += o.offsetTop;
+ if (el.clientTop && el.nodeName!="TABLE") {
+ top += el.clientTop;
+ }
+ o = el;
+ if (o.offsetParent==null) {
+ if (o.offsetLeft) {
+ left += o.offsetLeft;
+ }
+ if (o.offsetTop) {
+ top += o.offsetTop;
+ }
+ }
+ offsetParent = o.offsetParent;
+ }
+ }
+
+
+ if (originalObject.offsetWidth) {
+ width = originalObject.offsetWidth;
+ }
+ if (originalObject.offsetHeight) {
+ height = originalObject.offsetHeight;
+ }
+
+ return {'left':left, 'top':top, 'width':width, 'height':height
+ };
+ };
+
+ // Retrieve the position of an object's center point
+ // =================================================
+ pos.getCenter = function(o) {
+ var c = this.get(o);
+ if (c==null) { return null; }
+ c.left = c.left + (c.width/2);
+ c.top = c.top + (c.height/2);
+ return c;
+ };
+
+ return pos;
+})();// CLASS CONSTRUCTOR
+// --------------------------------------------------------------------
+var Popup = function(div, options) {
+ this.div = defined(div)?div:null;
+ this.index = Popup.maxIndex++;
+ this.ref = "Popup.objects["+this.index+"]";
+ Popup.objects[this.index] = this;
+ // Store a reference to the DIV by id, also
+ if (typeof(this.div)=="string") {
+ Popup.objectsById[this.div] = this;
+ }
+ if (defined(this.div) && this.div!=null && defined(this.div.id)) {
+ Popup.objectsById[this.div.id] = this.div.id;
+ }
+ // Apply passed-in options
+ if (defined(options) && options!=null && typeof(options)=="object") {
+ for (var i in options) {
+ this[i] = options[i];
+ }
+ }
+ return this;
+};
+
+// CLASS PROPERTIES
+// --------------------------------------------------------------------
+// Index of popup objects, to maintain a global reference if necessary
+Popup.maxIndex = 0;
+Popup.objects = {};
+Popup.objectsById = {};
+
+// The z-index value that popups will start at
+Popup.minZIndex = 101;
+
+// Class names to assign to other objects
+Popup.screenClass = "PopupScreen";
+Popup.iframeClass = "PopupIframe";
+Popup.screenIframeClass = "PopupScreenIframe";
+
+// CLASS METHODS
+// --------------------------------------------------------------------
+
+// Hide all currently-visible non-modal dialogs
+Popup.hideAll = function() {
+ for (var i in Popup.objects) {
+ var p = Popup.objects[i];
+ if (!p.modal && p.autoHide) {
+ p.hide();
+ }
+ }
+};
+// Catch global events as a trigger to hide auto-hide popups
+Event.add(document, "mouseup", Popup.hideAll, false);
+
+// A simple class method to show a popup without creating an instance
+Popup.show = function(divObject, referenceObject, position, options, modal) {
+ var popup;
+ if (defined(divObject)) {
+ popup = new Popup(divObject);
+ }
+ else {
+ popup = new Popup();
+ popup.destroyDivOnHide = true;
+ }
+ if (defined(referenceObject)) { popup.reference = DOM.resolve(referenceObject); }
+ if (defined(position)) { popup.position = position; }
+ if (defined(options) && options!=null && typeof(options)=="object") {
+ for (var i in options) {
+ popup[i] = options[i];
+ }
+ }
+ if (typeof(modal)=="boolean") {
+ popup.modal = modal;
+ }
+ popup.destroyObjectsOnHide = true;
+ popup.show();
+ return popup;
+};
+
+// A simple class method to show a modal popup
+Popup.showModal = function(divObject, referenceObject, position, options) {
+ Popup.show(divObject, referenceObject, position, options, true);
+};
+
+// A method to retrieve a popup object based on a div ID
+Popup.get = function(divId) {
+ if (defined(Popup.objectsById[divId])) {
+ return Popup.objectsById[divId];
+ }
+ return null;
+};
+
+// A method to hide a popup based on a div id
+Popup.hide = function(divId) {
+ var popup = Popup.get(divId);
+ if (popup!=null) {
+ popup.hide();
+ }
+};
+
+// PROTOTYPE PROPERTIES
+// --------------------------------------------------------------------
+Popup.prototype.content = null;
+Popup.prototype.className = "PopupDiv";
+Popup.prototype.style = null; // Styles to be applied to the DIV
+Popup.prototype.width = null;
+Popup.prototype.height = null;
+Popup.prototype.top = null;
+Popup.prototype.left = null;
+Popup.prototype.offsetLeft = 0;
+Popup.prototype.offsetTop = 0;
+Popup.prototype.constrainToScreen = true;
+Popup.prototype.autoHide = true;
+Popup.prototype.useIframeShim = false; /*@cc_on @*/ /*@if (@_win32) {Popup.prototype.useIframeShim = true;} @end @*/
+Popup.prototype.iframe = null;
+Popup.prototype.position = null; // vertical: "above top center bottom below", horizontal: "adjacent-left,left,center,right,adjacent-right"
+Popup.prototype.reference = null;
+Popup.prototype.modal = false;
+Popup.prototype.destroyDivOnHide = false;
+Popup.prototype.destroyObjectsOnHide = false;
+Popup.prototype.screen = null;
+Popup.prototype.screenIframeShim = null;
+Popup.prototype.screenOpacity=.4;
+Popup.prototype.screenColor="#cccccc";
+
+// INSTANCE METHODS
+// --------------------------------------------------------------------
+
+// Show the popup
+// --------------------------------------------------------------------
+Popup.prototype.show = function(options, modal) {
+ this.modal = this.modal || (typeof(modal)=="boolean" && modal);
+ if (defined(options) && options!=null && typeof(options)=="object") {
+ for (var i in options) {
+ this[i] = options[i];
+ }
+ }
+ this.div = DOM.resolve(this.div);
+ CSS.setStyle(this.div,'position','absolute');
+
+ // If there is no div pre-defined to use, create one
+ if (this.div==null) {
+ this.div = this.createDiv();
+ }
+ if (this.content!=null) {
+ this.div.innerHTML = this.content;
+ this.content = null;
+ }
+ if (this.className!=null) {
+ this.div.className = this.className;
+ }
+ if (this.style!=null) {
+ this.applyStyle();
+ }
+ if (this.width!=null) {
+ this.div.style.width = this.width+"px";
+ this.div.style.overflowX="auto";
+ }
+ if (this.height!=null) {
+ this.div.style.height = this.height+"px";
+ this.div.style.overflowY="auto";
+ }
+
+ // Do the actual display - this is a separate method so display transitions can be implemented
+ this.transition();
+
+ // Make sure clicks on the DIV don't bubble up to the document
+ this.div.onclick = function(e) {
+ Event.cancelBubble(Event.resolve(e));
+ };
+ this.div.onmouseup = this.div.onclick;
+
+ // Focus to the DIV if possible
+ if (this.modal && this.div.focus) {
+ this.div.focus();
+ }
+};
+
+// Show the popup but make it modal
+// --------------------------------------------------------------------
+Popup.prototype.transition = function() {
+ if (this.modal) {
+ this.addScreen();
+ }
+
+ // Make the DIV displayed but hidden so its size can be measured
+ CSS.setStyle(this.div,'visibility','hidden');
+ CSS.setStyle(this.div,'display','block');
+
+ // Position the popup
+ this.setPosition();
+
+ // Add the shim if necessary
+ if (this.useIframeShim) {
+ this.addIframeShim();
+ }
+
+ // Make sure the DIV is higher than the shim
+ this.div.style.zIndex = Popup.minZIndex++;
+
+ CSS.setStyle(this.div,'display','block');
+ CSS.setStyle(this.div,'visibility','visible');
+};
+
+// Show the popup but make it modal
+// --------------------------------------------------------------------
+Popup.prototype.showModal = function(options) {
+ this.show(options,true);
+};
+
+// Apply user styles to the DIV
+// --------------------------------------------------------------------
+Popup.prototype.applyStyle = function() {
+ if (this.div!=null && this.style!=null && typeof(this.style)=="object") {
+ for (var i in this.style) {
+ this.div.style[i] = this.style[i];
+ }
+ }
+};
+
+// Hide the popup
+// --------------------------------------------------------------------
+Popup.prototype.hide = function() {
+ // If this was a temp object creating on-the-fly, then remove objects from the DOM so
+ // The document doesn't get littered with extra objects
+ if (this.destroyDivOnHide) {
+ DOM.removeNode(this.div);
+ this.div = null;
+ delete Popup.objects[this.id];
+ }
+ else if (this.div!=null) {
+ CSS.setStyle(this.div,'display','none');
+ }
+
+ if (this.destroyObjectsOnHide) {
+ DOM.removeNode(this.iframe);
+ DOM.removeNode(this.screen);
+ DOM.removeNode(this.screenIframeShim);
+ }
+ else {
+ if (this.iframe!=null) {
+ this.iframe.style.display = "none";
+ }
+ if (this.screen!=null) {
+ this.screen.style.display = "none";
+ }
+ if (this.screenIframeShim!=null) {
+ this.screenIframeShim.style.display = "none";
+ }
+ }
+};
+
+// Util funcs for position
+// --------------------------------------------------------------------
+Popup.prototype.setTop = function(top) {
+ this.div.style.top = top+"px";
+};
+Popup.prototype.setLeft = function(left) {
+ this.div.style.left = left+"px";
+};
+Popup.prototype.getTop = function() {
+ return parseInt(CSS.getStyle(this.div,"top"),10);
+};
+Popup.prototype.getLeft = function() {
+ return parseInt(CSS.getStyle(this.div,"left"),10);
+};
+
+// All the logic to position the popup based on various criteria
+// --------------------------------------------------------------------
+Popup.prototype.setPosition = function() {
+ if (this.position!=null) {
+ var m = this.position.match(/^(\S+)\s+(\S+)/);
+ if (m!=null && m.length==3) {
+ var v = m[1];
+ var h = m[2];
+
+ var ref = this.reference;
+ if (ref==null) { ref = Screen.getBody(); }
+ var p = Position.get(ref);
+ var refTop = p.top;
+ var refLeft = p.left;
+ var refWidth = DOM.getOuterWidth(ref);
+ var refHeight = DOM.getOuterHeight(ref);
+
+ var width = DOM.getOuterWidth(this.div);
+ var height = DOM.getOuterHeight(this.div);
+
+ var scrollLeft = Screen.getScrollLeft();
+ var scrollTop = Screen.getScrollTop();
+
+ // Set vertical position relative to reference object
+ if (v=="above") { this.setTop(refTop-height+this.offsetTop); }
+ else if (v=="top") { this.setTop(refTop+this.offsetTop); }
+ else if (v=="center") { this.setTop(refTop+(refHeight/2)-(height/2)+this.offsetTop); }
+ else if (v=="bottom") { this.setTop(refTop+refHeight-height+this.offsetTop); }
+ else if (v=="below") { this.setTop(refTop+refHeight+this.offsetTop); }
+
+ // Set horizontal position relative to reference object
+ if (h=="adjacent-left") { this.setLeft(refLeft-width+this.offsetLeft); }
+ else if (h=="left") { this.setLeft(refLeft+this.offsetLeft); }
+ else if (h=="center") { this.setLeft(refLeft+(refWidth/2)-(width/2)+this.offsetLeft); }
+ else if (h=="right") { this.setLeft(refLeft+refWidth-width+this.offsetLeft); }
+ else if (h=="adjacent-right") { this.setLeft(refLeft+refWidth+this.offsetLeft); }
+ }
+ }
+ else if (this.top==null && this.left==null) {
+ this.center();
+ }
+ else {
+ if (this.top==null) { this.top=0; }
+ if (this.left==null) { this.left=0; }
+ this.div.style.top = this.top+this.offsetTop+"px";
+ this.div.style.left = this.left+this.offsetLeft+"px";
+ }
+
+ // Re-position to make sure it stays on the screen
+ if (this.constrainToScreen) {
+ this.fitToScreen();
+ }
+};
+
+// Append an object to the body
+// --------------------------------------------------------------------
+Popup.prototype.appendToBody = function(o) {
+ var body = Screen.getBody();
+ if (body && body.appendChild) {
+ body.appendChild(o);
+ }
+};
+
+// Create a new DIV object to be used for a popup
+// --------------------------------------------------------------------
+Popup.prototype.createDiv = function() {
+ if (document.createElement) {
+ var d = document.createElement("DIV");
+ d.style.position="absolute";
+ d.style.display="block";
+ d.style.visibility="hidden";
+ this.appendToBody(d);
+ return d;
+ }
+ alert("ERROR: Couldn't create DIV element in Popup.prototype.createDiv()");
+ return null;
+};
+
+// Create a new IFRAME object to be used behind the popup
+// --------------------------------------------------------------------
+Popup.prototype.createIframe = function() {
+ if (document.createElement) {
+ var i= document.createElement("IFRAME");
+ i.style.position="absolute";
+ i.style.display="block";
+ i.style.visibility="hidden";
+ i.style.background="none";
+ this.appendToBody(i);
+ return i;
+ }
+ else {
+ alert("ERROR: Couldn't create IFRAME object in Popup.prototype.createIframe()");
+ }
+};
+
+// Add an IFRAME shim for the DIV
+// --------------------------------------------------------------------
+Popup.prototype.addIframeShim = function() {
+ if (this.iframe==null) {
+ this.iframe = this.createIframe();
+ }
+ this.iframe.className = Popup.iframeClass;
+ CSS.setStyle(this.iframe,'top',this.getTop()+"px");
+ CSS.setStyle(this.iframe,'left',this.getLeft()+"px");
+ CSS.setStyle(this.iframe,'width',DOM.getOuterWidth(this.div) + "px");
+ CSS.setStyle(this.iframe,'height',DOM.getOuterHeight(this.div) + "px");
+ CSS.setStyle(this.iframe,'zIndex',Popup.minZIndex++);
+ CSS.setStyle(this.iframe,'opacity',0);
+ CSS.setStyle(this.iframe,'visibility','visible');
+ CSS.setStyle(this.iframe,'display','block');
+};
+
+// Create a "screen" to make a popup modal
+// --------------------------------------------------------------------
+Popup.prototype.addScreen = function() {
+ if (this.screen==null) {
+ this.screen = this.createDiv();
+ this.screen.style.top="0px";
+ this.screen.style.left="0px";
+ this.screen.style.backgroundColor = this.screenColor;
+ this.screen.className=Popup.screenClass;;
+ CSS.setStyle(this.screen,"opacity",this.screenOpacity);
+ this.screen.onclick = function(e) { Event.cancelBubble(Event.resolve(e)); }
+ }
+ if (this.screenIframeShim==null) {
+ this.screenIframeShim = this.createIframe();
+ this.screenIframeShim.style.top="0px";
+ this.screenIframeShim.style.left="0px";
+ this.screenIframeShim.className=Popup.screenIframeClass;
+ CSS.setStyle(this.screenIframeShim,"opacity",0);
+ }
+ this.screen.style.width = Screen.getDocumentWidth()+"px";
+ this.screen.style.height = Screen.getDocumentHeight()+"px";
+ this.screenIframeShim.style.width = Screen.getDocumentWidth()+"px";
+ this.screenIframeShim.style.height = Screen.getDocumentHeight()+"px";
+ this.screenIframeShim.style.zIndex = Popup.minZIndex++;
+ this.screenIframeShim.style.visibility="visible";
+ this.screenIframeShim.style.display="block";
+ this.screen.style.zIndex = Popup.minZIndex++;
+ this.screen.style.visibility="visible";
+ this.screen.style.display="block";
+};
+
+// Re-position the DIV so it stays on the screen
+// --------------------------------------------------------------------
+Popup.prototype.fitToScreen = function() {
+ var width = DOM.getOuterWidth(this.div);
+ var height = DOM.getOuterHeight(this.div);
+ var top = this.getTop();
+ var left = this.getLeft();
+
+ var clientWidth = Screen.getViewportWidth();
+ var clientHeight = Screen.getViewportHeight();
+
+ var scrollLeft = Screen.getScrollLeft();
+ var scrollTop = Screen.getScrollTop();
+
+ if (top-scrollTop+height>clientHeight) {
+ top = top - ((top+height) - (scrollTop+clientHeight));
+ this.div.style.top = top + "px";
+ }
+ if (left-scrollLeft+width>clientWidth) {
+ left = left - ((left+width) - (scrollLeft+clientWidth));
+ this.div.style.left = left + "px";
+ }
+ if (top<scrollTop) {
+ this.div.style.top=scrollTop+"px";
+ }
+ if (left<scrollLeft) {
+ this.div.style.left=scrollLeft+"px";
+ }
+};
+
+// Center the DIV object
+// --------------------------------------------------------------------
+Popup.prototype.center = function() {
+ var left = DOM.getOuterWidth(this.div);
+ var top = DOM.getOuterHeight(this.div);
+ if (isNaN(left)) { left=0; }
+ if (isNaN(top)) { top=0; }
+ var clientW = Screen.getViewportWidth();
+ var clientH = Screen.getViewportHeight();
+ if (clientW!=null && clientH!=null) {
+ top = (clientH-top)/2;
+ left = (clientW-left)/2;
+ }
+ top += Screen.getScrollTop();
+ left += Screen.getScrollLeft();
+
+ this.div.style.top = top+this.offsetTop+"px";
+ this.div.style.left = left+this.offsetLeft+"px";
+};
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "./style/tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="./style/jquery.min.js" />
+ </head>
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>TCT Report</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="overview">
+ <table>
+ <tr>
+ <td>
+ <div id="summary">
+ <table>
+ <tr>
+ <th colspan="2">Test Summary</th>
+ </tr>
+ <tr>
+ <td>TCT Version</td>
+ <td>
+ <xsl:value-of select="result_summary/environment/@tct_version" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Plan Name</td>
+ <td>
+ <xsl:value-of select="result_summary/@plan_name" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Profile</td>
+ <td>
+ <xsl:value-of select="result_summary/environment/@tct_profile" />
+ </td>
+ </tr>
+ <tr>
+ <td>Build ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@build_id">
+ <xsl:if test="result_summary/environment/@build_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@build_id" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Total</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/total_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Passed</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/pass_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Failed</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/fail_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Blocked</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/block_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Not Executed</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/na_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Time</td>
+ <td>
+ <xsl:value-of select="result_summary/summary/start_at" />
+ ~
+ <xsl:value-of select="result_summary/summary/end_at" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ <td>
+ <div id="device">
+ <table>
+ <tr>
+ <th colspan="2">Device Information</th>
+ </tr>
+ <tr>
+ <td>Host Device</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@host">
+ <xsl:if test="result_summary/environment/@host = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@host" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Manufacturer</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@manufacturer">
+ <xsl:if test="result_summary/environment/@manufacturer = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@manufacturer" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device Model</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@device_model">
+ <xsl:if test="result_summary/environment/@device_model = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@device_model" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@device_id">
+ <xsl:if test="result_summary/environment/@device_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@device_id" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Screen Size</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@screen_size">
+ <xsl:if test="result_summary/environment/@screen_size = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@screen_size" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Resolution</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@resolution">
+ <xsl:if test="result_summary/environment/@resolution = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@resolution" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="capability">
+ <div id="title">
+ <a name="contents"></a>
+ <table>
+ <tr>
+ <td class="title">
+ <h1><a href="#" class="see_capabilities">Device Capability</a></h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:choose>
+ <xsl:when test="result_summary/capabilities">
+ <div id="capability_table" style="display:none;">
+ <table>
+ <tr>
+ <th>Capability Name</th>
+ <th>Type</th>
+ <th>Value</th>
+ </tr>
+ <xsl:for-each select="result_summary/capabilities/capability">
+ <xsl:sort select="@name" />
+ <tr>
+ <td>
+ <xsl:value-of select="@name" />
+ </td>
+ <td>
+ <xsl:value-of select="@type" />
+ </td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="value">
+ <xsl:value-of select="value" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@support" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ The information of device capability is not available.
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ <div id="btc">
+ <table>
+ <tr>
+ <td>
+ <a href="#" class="see_all">Show all</a>
+ </td>
+ <td>
+ <a href="#" class="see_failed">Show only failed</a>
+ </td>
+ <td>
+ <a href="#" class="see_blocked">Show only blocked</a>
+ </td>
+ <td>
+ <a href="#" class="see_na">Show only not executed</a>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="title">
+ <h1></h1>
+ </div>
+ <div id="suite_summary">
+ <div id="title">
+ <a name="contents"></a>
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Test Summary by Suite</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="see_all">
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Total</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Executed</th>
+ <th class="Ratio">Ratio</th>
+ </tr>
+ <xsl:for-each select="result_summary/suite">
+ <xsl:if test="total_case > 0">
+ <tr class="suite_item">
+ <xsl:attribute name="id">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <td>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@name" />.xml</xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td class="total">
+ <xsl:value-of select="total_case" />
+ </td>
+ <td class="pass">
+ <xsl:value-of select="pass_case" />
+ </td>
+ <td class="fail">
+ <xsl:value-of select="fail_case" />
+ </td>
+ <td class="block">
+ <xsl:value-of select="block_case" />
+ </td>
+ <td class="na">
+ <xsl:value-of select="na_case" />
+ </td>
+ <td class="Ratio">
+ <div class="RatioGraphic" />
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="see_fail" style="display:none;">
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Total</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Executed</th>
+ <th class="Ratio">Ratio</th>
+ </tr>
+ <xsl:for-each select="result_summary/suite">
+ <xsl:if test="fail_case > 0">
+ <tr class="suite_item">
+ <xsl:attribute name="id">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <td>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@name" />.xml</xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td class="total">
+ <xsl:value-of select="total_case" />
+ </td>
+ <td class="pass">
+ <xsl:value-of select="pass_case" />
+ </td>
+ <td class="fail">
+ <xsl:value-of select="fail_case" />
+ </td>
+ <td class="block">
+ <xsl:value-of select="block_case" />
+ </td>
+ <td class="na">
+ <xsl:value-of select="na_case" />
+ </td>
+ <td class="Ratio">
+ <div class="RatioGraphic" />
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="see_block" style="display:none;">
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Total</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Executed</th>
+ <th class="Ratio">Ratio</th>
+ </tr>
+ <xsl:for-each select="result_summary/suite">
+ <xsl:if test="block_case > 0">
+ <tr class="suite_item">
+ <xsl:attribute name="id">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <td>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@name" />.xml</xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td class="total">
+ <xsl:value-of select="total_case" />
+ </td>
+ <td class="pass">
+ <xsl:value-of select="pass_case" />
+ </td>
+ <td class="fail">
+ <xsl:value-of select="fail_case" />
+ </td>
+ <td class="block">
+ <xsl:value-of select="block_case" />
+ </td>
+ <td class="na">
+ <xsl:value-of select="na_case" />
+ </td>
+ <td class="Ratio">
+ <div class="RatioGraphic" />
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="see_na" style="display:none;">
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Total</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Executed</th>
+ <th class="Ratio">Ratio</th>
+ </tr>
+ <xsl:for-each select="result_summary/suite">
+ <xsl:if test="na_case > 0">
+ <tr class="suite_item">
+ <xsl:attribute name="id">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <td>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@name" />.xml</xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td class="total">
+ <xsl:value-of select="total_case" />
+ </td>
+ <td class="pass">
+ <xsl:value-of select="pass_case" />
+ </td>
+ <td class="fail">
+ <xsl:value-of select="fail_case" />
+ </td>
+ <td class="block">
+ <xsl:value-of select="block_case" />
+ </td>
+ <td class="na">
+ <xsl:value-of select="na_case" />
+ </td>
+ <td class="Ratio">
+ <div class="RatioGraphic" />
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+ </div>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./style/back_top.png" />
+ </div>
+ <script type="text/javascript" src="./style/application.js" />
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ drawRatio();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word" />
+ <xsl:variable name="cr">
+ <xsl:text>\n</xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)" />
+ <br />
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "./style/tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="./style/jquery.min.js" />
+ <script type="text/javascript" src="./style/popup.js" />
+ </head>
+ <body>
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">Suite Test Results</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="btc">
+ <table>
+ <tr>
+ <td>
+ <a href="#" class="see_all">Show all</a>
+ </td>
+ <td>
+ <a href="#" class="see_failed">Show only failed</a>
+ </td>
+ <td>
+ <a href="#" class="see_blocked">Show only blocked</a>
+ </td>
+ <td>
+ <a href="#" class="see_na">Show only not executed</a>
+ </td>
+ <td>
+ <a href="summary.xml">Summary</a>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="testcasepage">
+ <div id="cases">
+ <div id="see_all">
+ <xsl:for-each select="test_definition/suite">
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (All)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id"><xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id"><xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+ <td class="red_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'PASS'">
+ <td class="green_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'BLOCK' ">
+ <td class="orange_rate">
+ BLOCK
+ </td>
+ </xsl:if>
+ <xsl:if
+ test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
+ <td class="gray_rate">
+ Not Run
+ </td>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>
+
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stdout" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="see_fail" style="display:none;">
+ <xsl:for-each select="test_definition/suite">
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (Failed only)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase[@result='FAIL']">
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id">fail_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id">fail_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <td class="red_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stdout" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="see_block" style="display:none;">
+ <xsl:for-each select="test_definition/suite">
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (Blocked Only)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase[@result='BLOCK']">
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id">block_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id">block_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <td class="orange_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stdout" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="see_na" style="display:none;">
+ <xsl:for-each select="test_definition/suite">
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (Not executed Only)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase[@result='N/A']">
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id">na_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id">na_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <td class="gray_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stdout" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./style/back_top.png" />
+ </div>
+ <script type="text/javascript" src="./style/application.js" />
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word" />
+ <xsl:variable name="cr">
+ <xsl:text>\n</xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)" />
+ <br />
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+@charset "UTF-8";\r
+/* CSS Document */\r
+#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td\r
+ {\r
+ margin: 0;\r
+ padding: 0;\r
+ border: 0;\r
+ font-weight: inherit;\r
+ font-style: inherit;\r
+ font-size: 0.96em;\r
+ font-family: arial;\r
+ vertical-align: baseline;\r
+}\r
+\r
+#title td, #btc td{\r
+ margin: 0;\r
+ padding: 0;\r
+ border: 0;\r
+ font-weight: inherit;\r
+ font-style: inherit;\r
+ font-size: 0.96em;\r
+ font-family: arial;\r
+ vertical-align: baseline;\r
+}\r
+\r
+td.Ratio {\r
+ text-align: left;\r
+ font-weight: normal;\r
+ padding: 4px 10px 4px 5px;\r
+ vertical-align: middle;\r
+}\r
+\r
+th.Ratio {\r
+ width: 400px;\r
+}\r
+\r
+#testcasepage p {\r
+ text-align: left;\r
+}\r
+\r
+#suite_title {\r
+ text-align: left;\r
+}\r
+\r
+#btc {\r
+ text-align: right;\r
+}\r
+\r
+#btc table {\r
+ position: absolute;\r
+ right: 0px;\r
+ width: 600px;\r
+}\r
+\r
+#testcasepage table {\r
+ border-collapse: separate;\r
+ border-spacing: 0;\r
+ margin-bottom: 1.4em;\r
+ vertical-align: middle;\r
+}\r
+\r
+#testcasepage th,#testcasepage td {\r
+ text-align: left;\r
+ font-weight: normal;\r
+ padding: 4px 10px 4px 5px;\r
+ vertical-align: middle;\r
+}\r
+\r
+#cases table {\r
+ width: 101%;\r
+}\r
+\r
+#cases td {\r
+ border-left: 0px;\r
+ font-weight: normal;\r
+ border-bottom: 0px;\r
+}\r
+\r
+#suite_summary table {\r
+ width: 100%;\r
+}\r
+\r
+\r
+#overview table {\r
+ width: 101%;\r
+}\r
+\r
+#overview table, #overview td, #overview tr {\r
+ border-left: none;\r
+ border-bottom: none;\r
+ border-right: none;\r
+ vertical-align: top;\r
+}\r
+\r
+#overview td{\r
+ width: 50%;\r
+}\r
+\r
+#capability table {\r
+ width: 50%;\r
+}\r
+\r
+#fail_cases table {\r
+ width: 101%;\r
+}\r
+\r
+#title table {\r
+ width: 101%;\r
+}\r
+\r
+#device table {\r
+ width: 100%;\r
+}\r
+\r
+#summary table {\r
+ width: 100%;\r
+}\r
+\r
+#testcasepage th {\r
+ border-bottom: 1px solid #000;\r
+ background-color: #AAAAAA;\r
+ border-left: 1px solid #000;\r
+ border-top: 1px solid #000;\r
+ color: #000;\r
+ font-weight: bold;\r
+ vertical-align: bottom;\r
+}\r
+\r
+#summary th:last-child,#summary td:last-child, #device th:last-child,#device td:last-child, #suite_summary th:last-child,#suite_summary td:last-child,#cases th:last-child,#cases td:last-child,#capability th:last-child,#capability td:last-child {\r
+ border-right: 1px solid #000;\r
+}\r
+\r
+#testcasepage td {\r
+ font-weight: normal;\r
+}\r
+\r
+#summary td, #device td, #capability td, #suite_summary td, #cases td{\r
+ border-left: 1px solid;\r
+ font-weight: normal;\r
+ border-bottom: 1px solid;\r
+}\r
+\r
+#testcasepage td.yellow_rate {\r
+ background-color: #ffcc00;\r
+}\r
+\r
+#testcasepage td.green_rate {\r
+ background-color: #1E90FF;\r
+}\r
+\r
+#testcasepage td.dgreen_rate {\r
+ background-color: #339933;\r
+}\r
+\r
+#testcasepage td.red_rate {\r
+ background-color: #FF3333;\r
+}\r
+\r
+#testcasepage td.orange_rate {\r
+ background-color: #FFA500;\r
+}\r
+\r
+#testcasepage td.gray_rate {\r
+ background-color: #AAAAAA;\r
+}\r
+\r
+#title table,#title tr,#title td {\r
+ border-left: none;\r
+ border-bottom: none;\r
+ text-align: center;\r
+}\r
+\r
+#title td:last-child {\r
+ border-right: none;\r
+}\r
+\r
+#testcasepage h1 {\r
+ font-size: 2em;\r
+ font-family: Arial, sans-serif;\r
+ font-weight: bold;\r
+ line-height: 1;\r
+ color: #000;\r
+ margin-bottom: 0.75em;\r
+ padding-top: 0.25em;\r
+ font-weight: bold;\r
+}\r
+\r
+#goTopBtn {\r
+ right: 0px;\r
+ bottom: 0px;\r
+ position: fixed; +\r
+ position: absolute;\r
+ top: expression(parseInt(document.body.scrollTop)+document.body.clientHeight-40\r
+ );\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?fileVersion 4.0.0?><cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
+ <storageModule moduleId="org.eclipse.cdt.core.settings">
+ <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660" moduleId="org.eclipse.cdt.core.settings" name="Debug">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactName="{TESTSUITE_NAME}" buildArtefactType="org.tizen.nativecore.buildArtefactType.app" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.debug,org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.app" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660" name="Debug" parent="org.tizen.nativecore.config.sbi.gcc45.app.debug">
+ <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.app.debug.542757660." name="/" resourcePath="">
+ <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.app.debug.1784086492" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.app.debug">
+ <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.165304646" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
+ <builder autoBuildTarget="all" buildPath="${workspace_loc:/{TESTSUITE_NAME}/Debug}" enableAutoBuild="true" id="org.tizen.nativecore.target.sbi.gnu.builder.910776161" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.707842937" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.1219153705" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
+ <option id="gnu.cpp.compiler.option.optimization.level.235211314" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.none" valueType="enumerated"/>
+ <option id="sbi.gnu.cpp.compiler.option.debugging.level.275888905" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level" value="gnu.cpp.compiler.debugging.level.max" valueType="enumerated"/>
+ <option id="sbi.gnu.cpp.compiler.option.debug.applog.437831432" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.cpp.compiler.option.debug.applog" value="true" valueType="boolean"/>
+ <option id="sbi.gnu.cpp.compiler.option.2067868547" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
+ <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.1395160493" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-x-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ewebkit2-0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.2042453024" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value=" -fPIE"/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ </option>
+ <option id="gnu.cpp.compiler.option.include.paths.1491943414" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks.core.399579441" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
+ <listOptionValue builtIn="false" value="Native_API"/>
+ </option>
+ <option id="gnu.cpp.compiler.option.preprocessor.def.1290489636" superClass="gnu.cpp.compiler.option.preprocessor.def" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="_DEBUG"/>
+ </option>
+ <inputType id="sbi.gnu.cpp.compiler.tizen.inputType.1444030222"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.828773414" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+ </tool>
+ <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.1332097163" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.none" id="gnu.c.compiler.option.optimization.level.569133032" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
+ <option id="sbi.gnu.c.compiler.option.debugging.level.1038790997" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level" value="gnu.c.debugging.level.max" valueType="enumerated"/>
+ <option id="sbi.gnu.c.compiler.option.debug.applog.30619937" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.c.compiler.option.debug.applog" value="true" valueType="boolean"/>
+ <option id="sbi.gnu.c.compiler.option.2093892473" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
+ <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.1795177369" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-x-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ewebkit2-0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.129230233" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value=" -fPIE"/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ </option>
+ <option id="gnu.c.compiler.option.include.paths.2147015964" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks.core.435620859" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
+ <listOptionValue builtIn="false" value="Native_API"/>
+ </option>
+ <option id="gnu.c.compiler.option.preprocessor.def.symbols.927058880" superClass="gnu.c.compiler.option.preprocessor.def.symbols" valueType="definedSymbols">
+ <listOptionValue builtIn="false" value="_DEBUG"/>
+ </option>
+ <inputType id="sbi.gnu.c.compiler.tizen.inputType.386884738"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.981494680" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+ </tool>
+ <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.640241801" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.901135465" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
+ <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.787442281" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
+ <listOptionValue builtIn="false" value="-pie -lpthread "/>
+ <listOptionValue builtIn="false" value="-Xlinker -rpath="/home/developer/sdk_tools/lib""/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ <listOptionValue builtIn="false" value="-Xlinker --version-script="${PROJ_PATH}/.exportMap""/>
+ <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/usr/lib""/>
+ <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
+ </option>
+ <option id="gnu.cpp.link.option.paths.1307041173" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib}""/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.2119600729" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool command="i386-linux-gnueabi-as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.2146766494" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.2008442855" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ </tool>
+ <tool id="org.tizen.nativecore.tool.sbi.po.compiler.248419226" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
+ <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.2010848909" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler"/>
+ <tool id="org.tizen.nativecore.tool.fnmapgen.147350839" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
+ <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.2051940365" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
+ <tool id="org.tizen.nativecore.tool.ast.1075947210" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
+ <tool id="org.tizen.nativecore.tool.ast.cpp.255856593" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.1173374538" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ <cconfiguration id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853">
+ <storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853" moduleId="org.eclipse.cdt.core.settings" name="Release">
+ <externalSettings/>
+ <extensions>
+ <extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
+ <extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ <extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+ </extensions>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <configuration artifactName="${ProjName}" buildArtefactType="org.tizen.nativecore.buildArtefactType.app" buildProperties="org.eclipse.cdt.build.core.buildType=org.eclipse.cdt.build.core.buildType.release,org.eclipse.cdt.build.core.buildArtefactType=org.tizen.nativecore.buildArtefactType.app" description="" errorParsers="org.eclipse.cdt.core.MakeErrorParser;org.eclipse.cdt.core.GCCErrorParser;" id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853" name="Release" parent="org.tizen.nativecore.config.sbi.gcc45.app.release">
+ <folderInfo id="org.tizen.nativecore.config.sbi.gcc45.app.release.728069853." name="/" resourcePath="">
+ <toolChain id="org.tizen.nativecore.toolchain.sbi.gcc45.app.release.1698569602" name="Tizen Native Toolchain" superClass="org.tizen.nativecore.toolchain.sbi.gcc45.app.release">
+ <targetPlatform binaryParser="org.eclipse.cdt.core.ELF" id="org.tizen.nativeide.target.sbi.gnu.platform.base.530558826" osList="linux,win32" superClass="org.tizen.nativeide.target.sbi.gnu.platform.base"/>
+ <builder buildPath="${workspace_loc:/{TESTSUITE_NAME}/Release}" id="org.tizen.nativecore.target.sbi.gnu.builder.975214550" keepEnvironmentInBuildfile="false" managedBuildOn="true" name="Tizen Application Builder" superClass="org.tizen.nativecore.target.sbi.gnu.builder"/>
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.1514849212" name="Archiver" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver"/>
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler.1790549045" name="C++ Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.compiler">
+ <option id="gnu.cpp.compiler.option.optimization.level.316489008" name="Optimization Level" superClass="gnu.cpp.compiler.option.optimization.level" value="gnu.cpp.compiler.optimization.level.most" valueType="enumerated"/>
+ <option id="sbi.gnu.cpp.compiler.option.debugging.level.1500294719" name="Debug level" superClass="sbi.gnu.cpp.compiler.option.debugging.level"/>
+ <option id="sbi.gnu.cpp.compiler.option.debug.applog.220428565" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.cpp.compiler.option.debug.applog"/>
+ <option id="sbi.gnu.cpp.compiler.option.900296718" superClass="sbi.gnu.cpp.compiler.option" valueType="userObjs">
+ <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_inc.core.1334366520" superClass="sbi.gnu.cpp.compiler.option.frameworks_inc.core" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-x-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ewebkit2-0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks_cflags.core.528700311" superClass="sbi.gnu.cpp.compiler.option.frameworks_cflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value=" -fPIE"/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ </option>
+ <option id="gnu.cpp.compiler.option.include.paths.623797688" superClass="gnu.cpp.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+ </option>
+ <option id="sbi.gnu.cpp.compiler.option.frameworks.core.1909718066" superClass="sbi.gnu.cpp.compiler.option.frameworks.core" valueType="userObjs">
+ <listOptionValue builtIn="false" value="Native_API"/>
+ </option>
+ <inputType id="sbi.gnu.cpp.compiler.tizen.inputType.1912377546"/>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.916984243" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+ </tool>
+ <tool command="clang" id="org.tizen.nativecore.tool.sbi.gnu.c.compiler.2061633942" name="C Compiler" superClass="org.tizen.nativecore.tool.sbi.gnu.c.compiler">
+ <option defaultValue="gnu.c.optimization.level.most" id="gnu.c.compiler.option.optimization.level.2022990414" name="Optimization Level" superClass="gnu.c.compiler.option.optimization.level" valueType="enumerated"/>
+ <option id="sbi.gnu.c.compiler.option.debugging.level.2037589780" name="Debug level" superClass="sbi.gnu.c.compiler.option.debugging.level"/>
+ <option id="sbi.gnu.c.compiler.option.debug.applog.930351060" name="Enable application logging (-D_APP_LOG)" superClass="sbi.gnu.c.compiler.option.debug.applog"/>
+ <option id="sbi.gnu.c.compiler.option.623943791" superClass="sbi.gnu.c.compiler.option" valueType="userObjs">
+ <listOptionValue builtIn="false" value="mobile-2.4-emulator.core_llvm36.i386.core.app"/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks_inc.core.1091342970" superClass="sbi.gnu.c.compiler.option.frameworks_inc.core" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/libxml2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appcore-agent""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/appfw""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/attach-panel""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/badge""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/base""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/cairo""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/calendar-service2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ckm""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/contacts-svc""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/context-service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dali-toolkit""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dbus-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/device""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/dlog""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-con-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-file-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-imf-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-input-evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-ipc-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ecore-x-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/e_dbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/edje-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efl-extension""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/efreet-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eina-1/eina""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eio-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eldbus-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/elementary-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/embryo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eo-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/eom""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ethumb-client-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/evas-1""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ewebkit2-0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/feedback""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/fontconfig""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/freetype2""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/geofence""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/gio-unix-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/glib-2.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/harfbuzz""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/json-glib-1.0""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/location""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/maps""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/media-content""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/messaging""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/metadata-editor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minicontrol""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/minizip""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/network""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/notification""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/phonenumber-utils""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/sensor""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/shortcut""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/storage""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/system""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/telephony""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/ui""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/web""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_service""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/widget_viewer_evas""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/include/wifi-direct""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/dbus-1.0/include""/>
+ <listOptionValue builtIn="false" value=""${SBI_SYSROOT}/usr/lib/glib-2.0/include""/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks_cflags.core.1782808167" superClass="sbi.gnu.c.compiler.option.frameworks_cflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_COMPILER_MISC}"/>
+ <listOptionValue builtIn="false" value=" -fPIE"/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ </option>
+ <option id="gnu.c.compiler.option.include.paths.499488519" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/inc}""/>
+ </option>
+ <option id="sbi.gnu.c.compiler.option.frameworks.core.120447946" superClass="sbi.gnu.c.compiler.option.frameworks.core" valueType="userObjs">
+ <listOptionValue builtIn="false" value="Native_API"/>
+ </option>
+ <inputType id="sbi.gnu.c.compiler.tizen.inputType.1431704404"/>
+ <inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.27305889" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+ </tool>
+ <tool id="org.tizen.nativeide.tool.sbi.gnu.c.linker.base.267766539" name="C Linker" superClass="org.tizen.nativeide.tool.sbi.gnu.c.linker.base"/>
+ <tool command="clang++" id="org.tizen.nativecore.tool.sbi.gnu.cpp.linker.1382202266" name="C++ Linker" superClass="org.tizen.nativecore.tool.sbi.gnu.cpp.linker">
+ <option id="sbi.gnu.cpp.linker.option.frameworks_lflags.core.476062144" superClass="sbi.gnu.cpp.linker.option.frameworks_lflags.core" valueType="stringList">
+ <listOptionValue builtIn="false" value="${TC_LINKER_MISC}"/>
+ <listOptionValue builtIn="false" value="${RS_LINKER_MISC}"/>
+ <listOptionValue builtIn="false" value="-pie -lpthread "/>
+ <listOptionValue builtIn="false" value="-Xlinker -rpath="/home/developer/sdk_tools/lib""/>
+ <listOptionValue builtIn="false" value="--sysroot="${SBI_SYSROOT}""/>
+ <listOptionValue builtIn="false" value="-Xlinker --version-script="${PROJ_PATH}/.exportMap""/>
+ <listOptionValue builtIn="false" value="-L"${SBI_SYSROOT}/usr/lib""/>
+ <listOptionValue builtIn="false" value="$(RS_LIBRARIES)"/>
+ </option>
+ <option id="gnu.cpp.link.option.paths.29188932" superClass="gnu.cpp.link.option.paths" valueType="libPaths">
+ <listOptionValue builtIn="false" value=""${workspace_loc:/${ProjName}/lib}""/>
+ </option>
+ <inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.140241049" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+ <additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+ <additionalInput kind="additionalinput" paths="$(LIBS)"/>
+ </inputType>
+ </tool>
+ <tool command="i386-linux-gnueabi-as" id="org.tizen.nativeapp.tool.sbi.gnu.assembler.base.1380224608" name="Assembler" superClass="org.tizen.nativeapp.tool.sbi.gnu.assembler.base">
+ <inputType id="cdt.managedbuild.tool.gnu.assembler.input.383736666" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+ </tool>
+ <tool id="org.tizen.nativecore.tool.sbi.po.compiler.1356965384" name="PO Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.po.compiler"/>
+ <tool id="org.tizen.nativecore.tool.sbi.edc.compiler.1251472052" name="EDC Resource Compiler" superClass="org.tizen.nativecore.tool.sbi.edc.compiler"/>
+ <tool id="org.tizen.nativecore.tool.fnmapgen.1001165225" name="C FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen"/>
+ <tool id="org.tizen.nativecore.tool.fnmapgen.cpp.259998567" name="C++ FN-Map Generator" superClass="org.tizen.nativecore.tool.fnmapgen.cpp"/>
+ <tool id="org.tizen.nativecore.tool.ast.277372493" name="C Static Analyzer" superClass="org.tizen.nativecore.tool.ast"/>
+ <tool id="org.tizen.nativecore.tool.ast.cpp.616356266" name="C++ Static Analyzer" superClass="org.tizen.nativecore.tool.ast.cpp"/>
+ <tool id="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib.1007103551" name="Archive Generator" superClass="org.tizen.nativecore.tool.sbi.gnu.archiver.mergelib"/>
+ </toolChain>
+ </folderInfo>
+ <sourceEntries>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="res"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="src"/>
+ <entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="inc"/>
+ </sourceEntries>
+ </configuration>
+ </storageModule>
+ <storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
+ </cconfiguration>
+ </storageModule>
+ <storageModule moduleId="cdtBuildSystem" version="4.0.0">
+ <project id="{TESTSUITE_NAME}.org.tizen.nativecore.target.sbi.gcc45.app.893663013" name="Tizen Core Application" projectType="org.tizen.nativecore.target.sbi.gcc45.app"/>
+ </storageModule>
+ <storageModule moduleId="com.samsung.tizen.nativeapp.projectInfo" version="1.0.0"/>
+ <storageModule moduleId="scannerConfiguration"/>
+ <storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
+</cproject>
--- /dev/null
+{
+ global: main;
+ local: *;
+};
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>{TESTSUITE_NAME}</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
+ <arguments>
+ <dictionary>
+ <key>?name?</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.append_environment</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.autoBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildArguments</key>
+ <value></value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildCommand</key>
+ <value>sbi-make</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.buildLocation</key>
+ <value>${workspace_loc:/{TESTSUITE_NAME}/Debug}</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
+ <value>clean</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.contents</key>
+ <value>org.eclipse.cdt.make.core.activeConfigSettings</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableAutoBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableCleanBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.enableFullBuild</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.fullBuildTarget</key>
+ <value>all</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.stopOnError</key>
+ <value>true</value>
+ </dictionary>
+ <dictionary>
+ <key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
+ <value>true</value>
+ </dictionary>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
+ <triggers>full,incremental,</triggers>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.tizen.nativecore.apichecker.core.builder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.cdt.core.cnature</nature>
+ <nature>org.eclipse.cdt.core.ccnature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
+ <nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
+ <nature>org.tizen.nativecore.apichecker.core.tizenCppNature</nature>
+ </natures>
+ <filteredResources>
+ <filter>
+ <id>1360216703005</id>
+ <name></name>
+ <type>26</type>
+ <matcher>
+ <id>org.eclipse.ui.ide.multiFilter</id>
+ <arguments>1.0-projectRelativePath-matches-false-false-*/.tpk</arguments>
+ </matcher>
+ </filter>
+ </filteredResources>
+</projectDescription>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<tproject xmlns="http://www.tizen.org/tproject">
+ <platforms>
+ <platform>
+ <name>mobile-2.4</name>
+ </platform>
+ </platforms>
+</tproject>
--- /dev/null
+# Appendix
--- /dev/null
+# Add inputs and outputs from these tool invocations to the build variables
+
+C_DEPS +=
+
+USES_EFL = yes
+USES_USR_INC = yes
+
+SYSROOT = $(SBI_SYSROOT)
+
+ifneq ($(strip $(SYSROOT)),)
+
+ifeq ($(strip $(USES_EFL)),yes)
+_EFL_INCS := \
+ ecore-1 \
+ ecore-audio-1 \
+ ecore-avahi-1 \
+ ecore-con-1 \
+ ecore-evas-1 \
+ ecore-fb-1 \
+ ecore-file-1 \
+ ecore-imf-1 \
+ ecore-imf-evas-1 \
+ ecore-input-1 \
+ ecore-input-evas-1 \
+ ecore-ipc-1 \
+ ecore-x-1 \
+ e_dbus-1 \
+ edje-1 \
+ eet-1 \
+ efl-1 \
+ efl-extension efl-extension/default efl-extension/circle \
+ efreet-1 \
+ eina-1 eina-1/eina \
+ eio-1 \
+ eldbus-1 \
+ elementary-1 \
+ embryo-1 \
+ eo-1 \
+ eom \
+ ethumb-1 \
+ ethumb-client-1 \
+ evas-1 \
+ ewebkit2-0
+_EFL_INC_ROOT := $(SYSROOT)/usr/include
+EFL_INCS := $(addprefix -I $(_EFL_INC_ROOT)/,$(_EFL_INCS))
+endif
+
+ifeq ($(strip $(USES_USR_INC)),yes)
+_USR_INCS := \
+ usr/include \
+ usr/include/AL \
+ usr/include/feedback \
+ usr/include/ui-extension \
+ usr/include/vconf \
+ usr/include/weconn \
+ usr/include/wipc \
+ usr/include/wnoti-service \
+ usr/include/appcore-agent \
+ usr/include/appcore-watch \
+ usr/include/appfw \
+ usr/include/badge \
+ usr/include/base \
+ usr/include/cairo \
+ usr/include/calendar-service2 \
+ usr/include/ckm \
+ usr/include/contacts-svc \
+ usr/include/content \
+ usr/include/context-manager \
+ usr/include/context-service \
+ usr/include/dali \
+ usr/include/dali-toolkit \
+ usr/include/dbus-1.0 \
+ usr/include/device \
+ usr/include/dlog \
+ usr/include/fontconfig \
+ usr/include/freetype2 \
+ usr/include/geofence \
+ usr/include/gio-unix-2.0 \
+ usr/include/glib-2.0 \
+ usr/include/json-glib-1.0 \
+ usr/include/json-glib-1.0/json-glib \
+ usr/include/libxml2 \
+ usr/include/location \
+ usr/include/maps \
+ usr/include/media \
+ usr/include/media-content \
+ usr/include/messaging \
+ usr/include/metadata-editor \
+ usr/include/minicontrol \
+ usr/include/minizip \
+ usr/include/network \
+ usr/include/notification \
+ usr/include/phonenumber-utils \
+ usr/include/sensor \
+ usr/include/shortcut \
+ usr/include/storage \
+ usr/include/system \
+ usr/include/telephony \
+ usr/include/ui \
+ usr/include/web \
+ usr/include/widget_service \
+ usr/include/widget_viewer_evas \
+ usr/include/wifi-direct \
+ usr/lib/dbus-1.0/include \
+ usr/lib/glib-2.0/include
+_USR_INC_ROOT := $(SYSROOT)
+USR_INCS := $(addprefix -I $(_USR_INC_ROOT)/,$(_USR_INCS))
+endif
+
+PLATFORM_INCS = $(USR_INCS) $(EFL_INCS) \
+ -I"$(SDK_PATH)/library"
+
+endif
--- /dev/null
+
+COMPILE_FLAGS = $(DEBUG_OP) $(OPTIMIZATION_OP) -Wall -c -fmessage-length=0
+
+CPP_COMPILE_FLAGS = $(DEBUG_OP) $(OPTIMIZATION_OP)
+
+LINK_FLAGS =
+
+AR_FLAGS =
+
+EDC_COMPILE_FLAGS =
\ No newline at end of file
--- /dev/null
+BUILD_SCRIPT_VERSION := 1.0.6
+
+BSLASH := \\#
+
+PROJ_ROOT := $(subst $(BSLASH),/,$(PROJPATH))
+
+-include $(PROJ_ROOT)/project_def.prop
+-include basedef.mk
+-include tooldef.mk
+-include flags.mk
+-include prepost.mk
+
+APPTYPE := $(type)
+
+OBJ_OUTPUT := $(OUTPUT_DIR)/objs
+
+OS_NAME = $(shell $(UNAME))
+
+ifneq ($(strip $(PLATFORM_INCS)),)
+PLATFORM_INCS_FILE := $(OBJ_OUTPUT)/platform_incs_file.inc
+endif
+
+FIND_FILES = $(shell $(FIND) $(PROJ_ROOT)/$(dir $(1)) -type f -name $(notdir $(1)) -printf '$(dir $(1))%P ')
+
+#USER_SRCS2 := $(shell sed -n '/^\s*USER_SRCS\s*=/s/USER_SRCS\s*=\s*//gp' '$(PROJ_ROOT)/project_def.prop')
+USER_SRCS2 := $(shell sed --version)
+
+NORMAL_SRCS := $(filter-out %*.c %*.cpp,$(USER_SRCS))
+WIDLCARD_SRCS := $(filter %*.c %*.cpp,$(USER_SRCS))
+ALL_SRCS := $(NORMAL_SRCS) $(foreach var,$(WIDLCARD_SRCS),$(call FIND_FILES,$(var)))
+
+C_SRCS := $(filter %.c,$(ALL_SRCS))
+CPP_SRCS := $(filter %.cpp,$(ALL_SRCS))
+
+USER_EDCS := $(subst $(BSLASH),/,$(USER_EDCS))
+NORMAL_EDCS := $(filter-out %*.edc,$(USER_EDCS))
+WIDLCARD_EDCS := $(filter %*.edc,$(USER_EDCS))
+EDCS := $(NORMAL_EDCS) $(foreach var,$(WIDLCARD_EDCS),$(call FIND_FILES,$(var)))
+
+NORMAL_POS := $(filter-out %*.po,$(USER_POS))
+WIDLCARD_POS := $(filter %*.po,$(USER_POS))
+POS := $(NORMAL_POS) $(foreach var,$(WIDLCARD_POS),$(call FIND_FILES,$(var)))
+
+LIBPATHS := $(addprefix -L$(PROJ_ROOT)/,$(USER_LIB_DIRS)) \
+ $(addprefix -L,$(USER_LIB_DIRS_ABS))
+LIBS += $(addprefix -l,$(USER_LIBS))
+UOBJS := $(addprefix $(PROJ_ROOT)/,$(USER_OBJS)) \
+ $(USER_OBJS_ABS)
+
+M_OPT = -MMD -MP -MF"$(@:%.o=%.d)"
+
+#LOWER_APPNAME := $(shell echo translit($(APPNAME),[A-Z],[a-z])|$(M4))
+LOWER_APPNAME := $(shell echo $(APPNAME)|$(TR) [A-Z] [a-z])
+
+ifeq ($(strip $(APPTYPE)),app)
+APPFILE := $(OUTPUT_DIR)/$(LOWER_APPNAME)
+endif
+ifeq ($(strip $(APPTYPE)),staticLib)
+APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).a
+endif
+ifeq ($(strip $(APPTYPE)),sharedLib)
+APPFILE := $(OUTPUT_DIR)/lib$(LOWER_APPNAME).so
+endif
+
+FUNC_C2O = $(patsubst %.c,$(OBJ_OUTPUT)/%.o,$(1))
+FUNC_CPP2O = $(patsubst %.cpp,$(OBJ_OUTPUT)/%.o,$(1))
+FUNC_EDC2EDJ = $(patsubst %.edc,$(OUTPUT_DIR)/%.edj,$(1))
+FUNC_PO2MO = $(patsubst %.po,$(OUTPUT_DIR)/res/locale/%/LC_MESSAGES/$(LOWER_APPNAME).mo,$(notdir $(1)))
+
+
+C_OBJS := $(call FUNC_C2O,$(C_SRCS))
+CPP_OBJS := $(call FUNC_CPP2O,$(CPP_SRCS))
+OBJS := $(C_OBJS) $(CPP_OBJS)
+EDJ_FILES := $(call FUNC_EDC2EDJ,$(EDCS))
+MO_FILES := $(call FUNC_PO2MO,$(POS))
+DEPS := $(OBJS:.o=.d)
+
+
+all : preproc $(APPFILE) secondary-outputs postproc
+
+ifneq ($(strip $(DEPS)),)
+-include $(DEPS)
+endif
+
+ifeq ($(strip $(APPTYPE)),app)
+$(APPFILE) : $(OBJS) $(UOBJS)
+ @echo ' Building target: $@'
+ @echo ' Invoking: C/C++ Linker'
+ @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+ $(CXX) -o "$(APPFILE)" $(OBJS) $(UOBJS) $(LIBPATHS) $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -pie -lpthread -Xlinker -rpath="/home/developer/sdk_tools/lib" --sysroot="$(SYSROOT)" -Xlinker --version-script="$(PROJ_PATH)/.exportMap" -L"$(SBI_SYSROOT)/usr/lib" $(RS_LIBRARIES) -Xlinker -rpath="/opt/usr/apps/$(APPID)/lib" -Werror-implicit-function-declaration
+ @echo ' Finished building target: $@'
+endif
+ifeq ($(strip $(APPTYPE)),staticLib)
+$(APPFILE) : $(OBJS) $(UOBJS)
+ @echo ' Building target: $@'
+ @echo ' Invoking: Archive utility'
+ @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+ $(AR) -r "$(APPFILE)" $(OBJS) $(UOBJS) $(AR_FLAGS)
+ @echo ' Finished building target: $@'
+endif
+ifeq ($(strip $(APPTYPE)),sharedLib)
+$(APPFILE) : $(OBJS) $(UOBJS)
+ @echo ' Building target: $@'
+ @echo ' Invoking: C/C++ Linker'
+ @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+ $(CXX) -o "$(APPFILE)" $(OBJS) $(UOBJS) $(LIBPATHS) $(LIBS) $(LINK_FLAGS) $(TC_LINKER_MISC) $(RS_LINKER_MISC) -shared -lpthread --sysroot="$(SYSROOT)" -L"$(SYSROOT)/usr/lib" $(RS_LIBRARIES)
+ @echo ' Finished building target: $@'
+endif
+
+
+ifneq ($(strip $(C_SRCS)),)
+CDEFS += $(addprefix -D,$(USER_DEFS))
+CDEFS += $(addprefix -U,$(USER_UNDEFS))
+
+INCS := $(addprefix -I$(PROJ_ROOT)/,$(USER_INC_DIRS)) \
+ $(addprefix -I,$(USER_INC_DIRS_ABS)) \
+ $(addprefix -include$(PROJ_ROOT)/,$(USER_INC_FILES)) \
+ $(addprefix -include,$(USER_INC_FILES_ABS))
+
+$(C_OBJS) : $(OBJ_OUTPUT)/%.o : $(PROJ_ROOT)/%.c $(PLATFORM_INCS_FILE)
+ @echo ' Building file: $<'
+ @echo ' Invoking: C Compiler'
+ @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+ifeq ($(strip $(APPTYPE)),sharedLib)
+ $(CC) -c $< -o $@ $(CDEFS) $(INCS) -I"pch" $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIC --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
+else
+ $(CC) -c $< -o $@ $(CDEFS) $(INCS) -I"pch" $(COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIE --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
+endif
+ @echo ' Finished building: $<'
+endif
+
+ifneq ($(strip $(CPP_SRCS)),)
+CPPDEFS += $(addprefix -D,$(USER_CPP_DEFS))
+CPPDEFS += $(addprefix -U,$(USER_CPP_UNDEFS))
+
+CPP_INCS := $(addprefix -I$(PROJ_ROOT)/,$(USER_CPP_INC_DIRS)) \
+ $(addprefix -I,$(USER_CPP_INC_DIRS_ABS)) \
+ $(addprefix -include$(PROJ_ROOT)/,$(USER_CPP_INC_FILES)) \
+ $(addprefix -include,$(USER_CPP_INC_FILES_ABS))
+
+$(CPP_OBJS) : $(OBJ_OUTPUT)/%.o : $(PROJ_ROOT)/%.cpp $(PLATFORM_INCS_FILE)
+ @echo ' Building file: $<'
+ @echo ' Invoking: C++ Compiler'
+ @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+ifeq ($(strip $(APPTYPE)),sharedLib)
+ $(CXX) -c $< -o $@ $(CPPDEFS) $(CPP_INCS) -I"pch" $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIC --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
+else
+ $(CXX) -c $< -o $@ $(CPPDEFS) $(CPP_INCS) -I"pch" $(CPP_COMPILE_FLAGS) $(TC_COMPILER_MISC) $(RS_COMPILER_MISC) -fPIE --sysroot="$(SYSROOT)" -Werror-implicit-function-declaration $(M_OPT) @$(PLATFORM_INCS_FILE)
+endif
+ @echo ' Finished building: $<'
+endif
+
+preproc :
+ifneq ($(strip $(PREBUILD_COMMAND)),)
+ifneq ($(strip $(PREBUILD_DESC)),)
+ @echo $(PREBUILD_DESC)
+endif
+ @echo $(shell $(PREBUILD_COMMAND))
+endif
+ @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(OBJ_OUTPUT))
+
+postproc :
+ifneq ($(strip $(POSTBUILD_COMMAND)),)
+ifneq ($(strip $(POSTBUILD_DESC)),)
+ @echo $(POSTBUILD_DESC)
+endif
+ @echo $(shell $(POSTBUILD_COMMAND))
+endif
+
+ifneq ($(strip $(PLATFORM_INCS)),)
+$(PLATFORM_INCS_FILE) :
+ @$(MKDIR) $(MKDIR_OP) $(subst $(BSLASH),/,$(@D))
+ifneq ($(findstring Linux,$(OS_NAME)),)
+ @echo $(PLATFORM_INCS) > $@
+else
+ifneq ($(findstring 3.82,$(MAKE_VERSION)),)
+ $(file > $@,$(PLATFORM_INCS))
+else
+ @echo $(PLATFORM_INCS) > $@
+endif
+endif
+endif
+
+ALL_EDJ_FILES :=
+
+define EDJ_PROC
+ALL_EDCS := $$(subst $(BSLASH),/,$$($(2)))
+NORMAL_EDCS := $$(filter-out %*.edc,$$(ALL_EDCS))
+WIDLCARD_EDCS := $$(filter %*.edc,$$(ALL_EDCS))
+EDCS := $$(NORMAL_EDCS) $$(foreach var_edc,$$(WIDLCARD_EDCS),$$(call FIND_FILES,$$(var_edc)))
+
+ifneq ($$(strip $$(EDCS)),)
+EDJ_FILES := $$(call FUNC_EDC2EDJ,$$(EDCS))
+
+ALL_EDJ_FILES += $$(EDJ_FILES)
+
+EDC_$(1)_COMPILER_FLAGS := -id "$$(SDK_TOOLPATH)/enventor/share/enventor/images"
+EDC_$(1)_COMPILER_FLAGS += -sd "$$(SDK_TOOLPATH)/enventor/share/enventor/sounds"
+EDC_$(1)_COMPILER_FLAGS += -fd "$$(SDK_TOOLPATH)/enventor/share/enventor/fonts"
+
+ifneq ($$(strip $(3)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -id $$(PROJ_PATH)/,$$($(3)))
+endif
+ifneq ($$(strip $(4)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -id ,$$($(4)))
+endif
+ifneq ($$(strip $(5)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -sd $$(PROJ_PATH)/,$$($(5)))
+endif
+ifneq ($$(strip $(6)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -sd ,$$($(6)))
+endif
+ifneq ($$(strip $(7)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -fd $$(PROJ_PATH)/,$$($(7)))
+endif
+ifneq ($$(strip $(8)),)
+EDC_$(1)_COMPILER_FLAGS += $$(addprefix -fd ,$$($(8)))
+endif
+
+$$(EDJ_FILES) : $$(OUTPUT_DIR)/%.edj : $$(PROJ_ROOT)/%.edc
+ @echo ' Building file: $$<'
+ @echo ' Invoking: EDC Resource Compiler'
+ @$$(MKDIR) $$(MKDIR_OP) $$(subst $$(BSLASH),/,$$(@D))
+ $$(EDJE_CC) $$(EDC_$(1)_COMPILER_FLAGS) $$(CDEFS) "$$<" "$$@"
+ @echo ' Finished building: $$<'
+endif
+endef
+
+# Global EDCs
+ifneq ($(strip $(USER_EDCS)),)
+$(eval $(call EDJ_PROC,,USER_EDCS,USER_EDCS_IMAGE_DIRS,USER_EDCS_IMAGE_DIRS_ABS,USER_EDCS_SOUND_DIRS,USER_EDCS_SOUND_DIRS_ABS,USER_EDCS_FONT_DIRS,USER_EDCS_FONT_DIRS_ABS))
+endif
+
+# Individual EDCs
+ifneq ($(strip $(USER_EXT_EDC_KEYS)),)
+$(foreach var,$(USER_EXT_EDC_KEYS),$(eval $(call EDJ_PROC,$(var),USER_EXT_$(var)_EDCS,USER_EXT_$(var)_EDCS_IMAGE_DIRS,USER_EXT_$(var)_EDCS_IMAGE_DIRS_ABS,USER_EXT_$(var)_EDCS_SOUND_DIRS,USER_EXT_$(var)_EDCS_SOUND_DIRS_ABS,USER_EXT_$(var)_EDCS_FONT_DIRS,USER_EXT_$(var)_EDCS_FONT_DIRS_ABS)))
+endif
+
+
+ifneq ($(strip $(POS)),)
+define MO_RULE
+$(call FUNC_PO2MO,$(1)) : $(PROJ_ROOT)/$(1)
+ @echo ' Building file: $$<'
+ @echo ' Invoking: msgfmt String Formatter'
+ @$$(MKDIR) $$(MKDIR_OP) $$(subst $$(BSLASH),/,$$(@D))
+ $$(MSGFMT) -o $$@ $$<
+ @echo ' Finished building: $$<'
+endef
+
+$(foreach var,$(POS),$(eval $(call MO_RULE,$(var))))
+endif
+
+
+secondary-outputs : $(ALL_EDJ_FILES) $(MO_FILES)
+
+-include appendix.mk
+
+
+clean :
+ rm -f "$(APPFILE)"
+ rm -rf "$(OUTPUT_DIR)"
+
+
+version :
+ @echo $(BUILD_SCRIPT_VERSION)
--- /dev/null
+
+# Add pre/post build process
+PREBUILD_DESC =
+PREBUILD_COMMAND =
+POSTBUILD_DESC =
+POSTBUILD_COMMAND =
--- /dev/null
+# Add inputs and outputs from these tool invocations to the build variables
+
+ifeq ($(strip $(BUILD_CONFIG)),)
+BUILD_CONFIG = Debug
+endif
+
+ifeq ($(strip $(OUTPUT_DIR)),)
+OUTPUT_DIR := $(PROJPATH)/$(BUILD_CONFIG)
+endif
+
+
+ifneq ($(strip $(MKDIR_BIN)),)
+MKDIR = $(MKDIR_BIN)
+MKDIR_OP = -p
+else
+MKDIR = mkdir
+MKDIR_OP = -p
+endif
+
+ifneq ($(strip $(UNAME_BIN)),)
+UNAME = $(UNAME_BIN)
+else
+UNAME = uname
+endif
+
+ifneq ($(strip $(M4_BIN)),)
+M4 = $(M4_BIN)
+else
+M4 = m4
+endif
+
+ifneq ($(strip $(TR_BIN)),)
+TR = $(TR_BIN)
+else
+TR = tr
+endif
+
+ifneq ($(strip $(FIND_BIN)),)
+FIND = $(FIND_BIN)
+else
+FIND = find
+endif
+
+ifneq ($(strip $(GREP_BIN)),)
+GREP = $(GREP_BIN)
+else
+GREP = grep
+endif
+
+ifneq ($(strip $(EDJE_CC_BIN)),)
+EDJE_CC = $(EDJE_CC_BIN)
+else
+EDJE_CC = edje_cc
+endif
+
+ifneq ($(strip $(MSGFMT_BIN)),)
+MSGFMT = $(MSGFMT_BIN)
+else
+MSGFMT = msgfmt
+endif
+
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef _ASSERT_H_
+#define _ASSERT_H_
+#include <stdio.h>
+#include <stdlib.h>
+
+#define assert(exp) \
+ if (!(exp)) { \
+ fprintf(stderr, \
+ "\\n[TCT][%s][Line : %d] Assert Fail; Following expression is not true: %s\\n", __FILE__, __LINE__, #exp); \
+ return 1; \
+ }
+
+#define assert_eq(var, ref) \
+ if (var != ref) { \
+ fprintf(stderr, \
+ "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) and (%s) are not equal\\n", __FILE__, __LINE__, #var, #ref); \
+ return 1; \
+ }
+
+#define assert_neq(var, ref) \
+ if (var == ref) { \
+ fprintf(stderr, \
+ "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) and (%s) are equal\\n", __FILE__, __LINE__, #var, #ref); \
+ return 1; \
+ }
+
+#define assert_gt(var, ref) \
+ if (var <= ref) { \
+ fprintf(stderr, \
+ "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not greater than (%s)\\n", __FILE__, __LINE__, #var, #ref); \
+ return 1; \
+ }
+
+#define assert_geq(var, ref) \
+ if (var < ref) { \
+ fprintf(stderr, \
+ "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not greater than or equal to (%s)\\n", __FILE__, __LINE__, #var, #ref); \
+ return 1; \
+ }
+
+#define assert_lt(var, ref) \
+ if (var >= ref) { \
+ fprintf(stderr, \
+ "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not lower than (%s)\\n", __FILE__, __LINE__, #var, #ref); \
+ return 1; \
+ }
+
+#define assert_leq(var, ref) \
+ if (var > ref) { \
+ fprintf(stderr, \
+ "\\n[TCT][%s][Line : %d] Assert fail; Values (%s) is not lower than or equal to (%s)\\n", __FILE__, __LINE__, #var, #ref); \
+ return 1; \
+ }
+
+#endif // _ASSERT_H_
--- /dev/null
+#ifndef __ASSERT_COMMON_H__
+#define __ASSERT_COMMON_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <app.h>
+
+int utc_result;
+
+#define assert_with_exit(exp) do { \
+ if (!(exp)) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Following expression is not true:\n" \
+ "%s\n", #exp); \
+ utc_result = 1; \
+ ui_app_exit(); \
+ return 1; \
+ } \
+ } while (0)
+
+#define assert_eq_with_exit(var, ref) do { \
+ if (var != ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Values \"%s\" and \"%s\" are not equal:\n" \
+ "%s == %d, %s == %d\n", \
+ #var, #ref, #var, (int)var, #ref, (int)ref); \
+ utc_result = 1; \
+ ui_app_exit(); \
+ return 1; \
+ } \
+ } while (0)
+
+#define assert_neq_with_exit(var, ref) do { \
+ if (var == ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Values \"%s\" and \"%s\" are equal:\n" \
+ "%s == %s == %d\n", \
+ #var, #ref, #var, #ref, (int)ref); \
+ utc_result = 1; \
+ ui_app_exit(); \
+ return 1; \
+ } \
+ } while (0)
+
+#define assert_eq_without_exit(var, ref) do { \
+ if (var != ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Values \"%s\" and \"%s\" are not equal:\n" \
+ "%s == %d, %s == %d\n", \
+ #var, #ref, #var, (int)var, #ref, (int)ref); \
+ utc_result = 1; \
+ return 1; \
+ } \
+ } while (0)
+
+#define assert_neq_without_exit(var, ref) do { \
+ if (var == ref) { \
+ fprintf(stderr, \
+ "Assert fail in %s:%d\n", __FILE__, __LINE__); \
+ fprintf(stderr, \
+ "Values \"%s\" and \"%s\" are equal:\n" \
+ "%s == %s == %d\n", \
+ #var, #ref, #var, #ref, (int)ref); \
+ utc_result = 1; \
+ return 1; \
+ } \
+ } while (0)
+
+#define normal_exit(result) do { \
+ utc_result = result; \
+ ui_app_exit(); \
+ } while (0)
+
+
+#endif /* __ASSERT_COMMON_H__ */
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef _TCT_COMMON_H_
+#define _TCT_COMMON_H_
+
+#include "assert.h"
+
+#include <malloc.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <system_info.h>
+
+#define DEBUG 1
+#define ERR_LOG "/tmp/tclog"
+#define TC_RESULT "/tmp/tcresult"
+#define UTC_LOG "/tmp/utclog_core"
+#define CONFIGFILE_PATH "/tmp/TC_Config.txt"
+#define CONFIG_LINE_LEN_MAX 2048
+#define CONFIG_VALUE_LEN_MAX 1024
+
+FILE *g_fpLog;
+FILE *g_fpLogDump;
+
+#define FPRINTF(...) {\
+ g_fpLog = fopen(ERR_LOG, "a");\
+ fprintf(g_fpLog, __VA_ARGS__);\
+ fclose(g_fpLog);\
+}
+
+#define DUMP_UTC_ERRLOG() {\
+ g_fpLogDump = freopen(ERR_LOG, "w", stderr);\
+ fflush(stderr);\
+}
+
+#define CLOSE_UTC_ERRLOG() {\
+ if(g_fpLogDump) \
+ { fclose(g_fpLogDump); g_fpLogDump = NULL; }\
+}
+
+#define PRINT_UTC_LOG(...) {\
+ g_fpLog = fopen(UTC_LOG, "a");\
+ fprintf(g_fpLog, __VA_ARGS__);\
+ fclose(g_fpLog);\
+}
+
+
+#define PRINT_TC_RESULT(...) {\
+ g_fpLog = fopen(TC_RESULT, "w");\
+ fprintf(g_fpLog, __VA_ARGS__);\
+ fclose(g_fpLog);\
+}
+
+
+#define IS_FEATURE_SUPPORTED(feature_name, featureFlag, ModuleName)\
+{\
+ if ( !(TCTCheckSystemInfoFeatureSupported(feature_name, ModuleName)) )\
+{\
+ featureFlag = false;\
+}\
+ else\
+{\
+ featureFlag = true;\
+}\
+}
+
+#define PRINT_RESULT(eCompare, eRetVal, API, Error) {\
+ if ( eRetVal == eCompare )\
+{\
+ if ( DEBUG )\
+{\
+ FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+ else \
+{\
+ FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+ return 1;\
+}\
+}
+
+#define PRINT_RESULT_NORETURN(eCompare, eRetVal, API, Error) {\
+ if ( eRetVal == eCompare )\
+{\
+ if ( DEBUG )\
+{\
+ FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+ else \
+{\
+ FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+}\
+}
+
+#define PRINT_RESULT_CLEANUP(eCompare, eRetVal, API, Error, FreeResource) {\
+ if ( eRetVal == eCompare )\
+{\
+ if ( DEBUG )\
+{\
+ FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+else \
+{\
+ FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+ FreeResource;\
+ return 1;\
+}\
+}
+
+
+#define PRINT_RESULT(eCompare, eRetVal, API, Error) {\
+ if ( eRetVal == eCompare )\
+{\
+ if ( DEBUG )\
+{\
+ FPRINTF("[Line : %d][%s] %s passed\\n", __LINE__, API_NAMESPACE, API);\
+}\
+}\
+ else \
+{\
+ FPRINTF("[Line : %d][%s] %s failed, error returned = %s [%d]\\n", __LINE__, API_NAMESPACE, API, Error, eRetVal);\
+ return 1;\
+}\
+}
+
+
+#define CHECK_VALUE_STRING(StringVariable, API) {\
+ if ( StringVariable == NULL )\
+{\
+ FPRINTF("[Line : %d][%s] %s failed, error returned = value returned is NULL\\n", __LINE__, API_NAMESPACE, API);\
+ return 1;\
+}\
+ else if ( DEBUG )\
+{\
+ FPRINTF("[Line : %d][%s] value returned = %s\\n", __LINE__, API_NAMESPACE, StringVariable);\
+}\
+ free(StringVariable);\
+ StringVariable = NULL;\
+}
+
+#define CHECK_VALUE_INT(Variable, API) {\
+ if ( Variable == 0 )\
+{\
+ FPRINTF("[Line : %d][%s] %s failed, error returned = value returned is Zero\\n", __LINE__, API_NAMESPACE, API);\
+ return 1;\
+}\
+ else if ( DEBUG )\
+{\
+ FPRINTF("[Line : %d][%s] value returned = %d\\n", __LINE__, API_NAMESPACE, Variable);\
+}\
+}
+
+#define CHECK_HANDLE(Handle, API) {\
+ if ( Handle == NULL )\
+{\
+ FPRINTF("[Line : %d][%s] %s failed, error returned = Handle returned is NULL\\n", __LINE__, API_NAMESPACE, API);\
+ return 1;\
+}\
+}
+
+#define FREE_MEMORY(buffer) {\
+ if ( buffer != NULL )\
+{\
+ free(buffer);\
+ buffer = NULL;\
+}\
+}
+
+bool TCTCheckSystemInfoFeatureSupported(char* pszKey, char* pszModuleName);
+char* TCTSystemInfoGetError(int nRet);
+bool GetValueFromConfigFile(char* pstrKeyString, char* pstrValue, char* pstrModule);
+#endif // _TCT_COMMON_H_
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef _TESTCASE_H_
+#define _TESTCASE_H_
+
+/* pointer to startup/cleanup functions */
+typedef void (*void_fun_ptr)(void);
+
+/* pointer to testcase functions */
+typedef int (*tc_fun_ptr)(void);
+
+/* struct describing specific testcase */
+typedef struct testcase_s {
+ const char* name;
+ tc_fun_ptr function;
+ void_fun_ptr startup;
+ void_fun_ptr cleanup;
+} testcase;
+
+#endif // _TESTCASE_H_
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#ifndef __{TESTSUITE_NAME}_H__
+#define __{TESTSUITE_NAME}_H__
+
+#include "testcase.h"
+#include "tct_common.h"
+
+
+testcase tc_array[] = {
+ {NULL, NULL}
+};
+
+#endif
--- /dev/null
+
+# Project Name
+APPNAME = {TESTSUITE_NAME}
+
+# Project Type
+type = app
+
+# Project Profile
+profile = mobile-2.4
+
+# C Sources
+USER_SRCS = src/tct_common.c src/{TESTSUITE_NAME}.c
+
+# EDC Sources
+USER_EDCS =
+
+# PO Sources
+USER_POS =
+
+# User Defines
+USER_DEFS =
+USER_CPP_DEFS =
+
+# User Undefines
+USER_UNDEFS =
+USER_CPP_UNDEFS =
+
+# User Libraries
+USER_LIBS =
+
+# User Objects
+USER_OBJS =
+USER_OBJS_ABS =
+
+# User Includes
+## C Compiler
+USER_INC_DIRS = inc
+USER_INC_DIRS_ABS =
+USER_INC_FILES =
+USER_INC_FILES_ABS =
+## C++ Compiler
+USER_CPP_INC_DIRS =
+USER_CPP_INC_DIRS_ABS =
+USER_CPP_INC_FILES =
+USER_CPP_INC_FILES_ABS =
+
+# User Library Path
+USER_LIB_DIRS =
+USER_LIB_DIRS_ABS =
+
+# EDC Resource Path
+USER_EDCS_IMAGE_DIRS =
+USER_EDCS_IMAGE_DIRS_ABS =
+USER_EDCS_SOUND_DIRS =
+USER_EDCS_SOUND_DIRS_ABS =
+USER_EDCS_FONT_DIRS =
+USER_EDCS_FONT_DIRS_ABS =
+
+# EDC Flags
+USER_EXT_EDC_KEYS =
+
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "tct_common.h"
+
+/**
+* @function TCTCheckSystemInfoFeatureSupported
+* @description Check the supported feature for the given key value
+* @parameter char* pszKey : key value, char* pszModuleName : module name
+* @return true if supported else false
+*/
+bool TCTCheckSystemInfoFeatureSupported(char* pszKey, char* pszModuleName)
+{
+ if ( NULL == pszKey )
+ {
+ FPRINTF("[Line : %d][%s] Null key value passed to function : TCTCheckSystemInfoFeatureSupported\\n", __LINE__, pszModuleName);
+ return false;
+ }
+
+ bool bValue = false;
+ int nRet = system_info_get_platform_bool (pszKey, &bValue);
+
+ if ( nRet != SYSTEM_INFO_ERROR_NONE )
+ {
+ FPRINTF("[Line : %d][%s] system_info_get_platform_bool returned (error = %s) for (key = %s)\\n", __LINE__, pszModuleName, TCTSystemInfoGetError(nRet), pszKey);
+ return false;
+ }
+
+ if ( bValue )
+ {
+ FPRINTF("[Line : %d][%s] Feature %s is supported\\n", __LINE__, pszModuleName, pszKey);
+ }
+ else
+ {
+ FPRINTF("[Line : %d][%s] Feature %s is not supported\\n", __LINE__, pszModuleName, pszKey);
+ }
+
+
+ return bValue;
+}
+
+/**
+* @function TCTSystemInfoGetError
+* @description Maps error enums to string values
+* @parameter nRet : error code returned
+* @return error string
+*/
+char* TCTSystemInfoGetError(int nRet)
+{
+ char *szErrorVal = NULL;
+
+ switch ( nRet )
+ {
+ case SYSTEM_INFO_ERROR_NONE: szErrorVal = "SYSTEM_INFO_ERROR_NONE"; break;
+ case SYSTEM_INFO_ERROR_INVALID_PARAMETER: szErrorVal = "SYSTEM_INFO_ERROR_INVALID_PARAMETER"; break;
+ case SYSTEM_INFO_ERROR_IO_ERROR: szErrorVal = "SYSTEM_INFO_ERROR_IO_ERROR"; break;
+ case SYSTEM_INFO_ERROR_OUT_OF_MEMORY : szErrorVal = "SYSTEM_INFO_ERROR_OUT_OF_MEMORY"; break;
+ default : szErrorVal = "Unknown error"; break;
+ }
+
+ return szErrorVal;
+}
+
+/**
+* @function GetValueFromConfigFile
+* @description Get the corresponding value for a key from config file
+* @parameter pstrKeyString : Key, pstrValue : Value
+* @return true for success, false for failure
+*/
+bool GetValueFromConfigFile(char* pstrKeyString, char* pstrValue, char* pstrModule)
+{
+ if ( NULL == pstrKeyString )
+ {
+ FPRINTF("[Line : %d][%s] The key string provided to fetch config file value is null\\n", __LINE__, pstrModule);
+ return false;
+ }
+
+
+ FILE* pfilePtr = fopen(CONFIGFILE_PATH, "r");
+ if ( NULL == pfilePtr )
+ {
+ FPRINTF("[Line : %d][%s] Unable to open configuration file : %s\\n", __LINE__, pstrModule, CONFIGFILE_PATH);
+ return false;
+ }
+
+ char* pszKey = NULL;
+ char* pszValue = NULL;
+ char* pszDelim = "=\n";
+ char szConfigLine[CONFIG_LINE_LEN_MAX] = {0,};
+
+ while ( !feof(pfilePtr) )
+ {
+ if ( fgets(szConfigLine, CONFIG_LINE_LEN_MAX, pfilePtr) != NULL )
+ {
+ pszKey = strtok(szConfigLine, pszDelim);
+ pszValue = strtok(NULL, pszDelim);
+
+ if ( 0 == strcmp(pszKey, pstrKeyString) )
+ {
+#if DEBUG
+ FPRINTF("[Line : %d][%s][Key = %s;Config value = %s]\\n", __LINE__, pstrModule, pszKey, pszValue);
+#endif
+ break;
+ }
+
+ pszKey = NULL;
+ pszValue = NULL;
+ }
+ }
+
+ fclose(pfilePtr);
+ if ( NULL == pszValue )
+ {
+ FPRINTF("[Line : %d][%s][Key = %s;Unable to retrieve config value for this key. Check key at config file location : %s]\\n", __LINE__, pstrModule, pstrKeyString, CONFIGFILE_PATH);
+ return false;
+ }
+
+ if (strlen(pszValue) >= CONFIG_VALUE_LEN_MAX )
+ {
+ FPRINTF("[Line : %d][%s][Key = %s;Config Value should be less than %d characters in length]\\n", __LINE__, pstrModule, pszKey, CONFIG_VALUE_LEN_MAX);
+ return false;
+ }
+
+ memset(pstrValue, 0, CONFIG_VALUE_LEN_MAX);
+ strcpy(pstrValue, pszValue);
+ return true;
+}
--- /dev/null
+//
+// Copyright (c) 2014 Samsung Electronics Co., Ltd.
+//
+// Licensed under the Apache License, Version 2.0 (the License);
+// you may not use this g_TCFILE except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+#include <stdio.h>
+#include <string.h>
+#include "{TESTSUITE_NAME}.h"
+#include <malloc.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/wait.h>
+#include <glib.h>
+#include <stdbool.h>
+#include "tct_common.h"
+#include <app.h>
+#include <dlog.h>
+#include <errno.h>
+
+#include <Elementary.h>
+#include <efl_extension.h>
+
+typedef struct appdata {
+ Evas_Object *win;
+ Evas_Object *conform;
+ Evas_Object *label;
+} appdata_s;
+
+static bool app_create(void *data)
+{
+ return true;
+}
+
+static void app_control(app_control_h app_control, void *data)
+{
+ char* pszGetTCName = NULL;
+ int i=0, result=0, nRet=0;
+ nRet = app_control_get_extra_data(app_control, "testcase_name", &pszGetTCName);
+ if(nRet != APP_CONTROL_ERROR_NONE)
+ {
+ dlog_print(DLOG_ERROR, "NativeTCT", "[%s:%d] app_control_get_extra_data returns error = %d", __FUNCTION__, __LINE__, nRet);
+ PRINT_UTC_LOG("\\n[%s][Line : %d]Unable to fetch test case name: app_control_get_extra_data API call fails\\n", __FILE__, __LINE__);
+ PRINT_TC_RESULT("%d",1);
+ FREE_MEMORY(pszGetTCName);
+ return;
+ }
+
+ dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Executing TC Name = %s", __FUNCTION__, __LINE__, pszGetTCName);
+ for ( i = 0; tc_array[i].name; i++ )
+ {
+ if ( 0 == strncmp(pszGetTCName, tc_array[i].name, strlen(pszGetTCName)) )
+ {
+ DUMP_UTC_ERRLOG();
+ if ( tc_array[i].startup )
+ {
+ dlog_print(DLOG_INFO, "NativeTCT", "%s : Start up", pszGetTCName);
+ tc_array[i].startup();
+ }
+
+ dlog_print(DLOG_INFO, "NativeTCT", "%s : Body", pszGetTCName);
+ result = tc_array[i].function();
+ dlog_print(DLOG_INFO, "NativeTCT", "%s returns value = %d", pszGetTCName, result);
+
+ if ( tc_array[i].cleanup )
+ {
+ dlog_print(DLOG_INFO, "NativeTCT", "%s : Clean up", pszGetTCName);
+ tc_array[i].cleanup();
+ }
+
+ CLOSE_UTC_ERRLOG();
+ PRINT_TC_RESULT("%d",result);
+ FREE_MEMORY(pszGetTCName);
+ return;
+ }
+ }
+
+ dlog_print(DLOG_ERROR, "NativeTCT", "[%s:%d] Unable to execute %s : Unknown Test Case Name", __FUNCTION__, __LINE__, pszGetTCName);
+ PRINT_UTC_LOG("\\n[%s][Line : %d]Unable to execute %s : Unknown Test Case Name\\n", __FILE__, __LINE__, pszGetTCName);
+ PRINT_TC_RESULT("%d",1);
+ FREE_MEMORY(pszGetTCName);
+ return;
+}
+
+static void app_terminate(void *data)
+{
+ dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Application Package is now Terminating", __FUNCTION__, __LINE__);
+}
+
+int main(int argc, char *argv[])
+{
+ int ret = 0;
+ appdata_s ad = {0,};
+
+ ui_app_lifecycle_callback_s event_callback = {0,};
+ event_callback.create = app_create;
+ event_callback.terminate = app_terminate;
+ event_callback.app_control = app_control;
+
+ dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Application Main Function is Invoked", __FUNCTION__, __LINE__);
+ ret = ui_app_main(argc, argv, &event_callback, &ad);
+ if (ret != APP_ERROR_NONE)
+ {
+ dlog_print(DLOG_ERROR, "NativeTCT", "Application ui_app_main call gets failed. err = %d", ret);
+ PRINT_UTC_LOG("\\n[%s][Line : %d]Application ui_app_main call gets failed. err = %d\\n", __FILE__, __LINE__, ret);
+ PRINT_TC_RESULT("%d",1);
+ return ret;
+ }
+
+ dlog_print(DLOG_INFO, "NativeTCT", "[%s:%d] Application Package is Terminated", __FUNCTION__, __LINE__);
+ return ret;
+}
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns="http://tizen.org/ns/packages" api-version="2.4" package="org.tizen.{TESTSUITE_NAME}" version="1.0.0">
+ <profile name="mobile" />
+ <ui-application appid="org.tizen.{TESTSUITE_NAME}" exec="{TESTSUITE_NAME}" type="capp" multiple="false" taskmanage="true" nodisplay="false">
+ <icon>{TESTSUITE_NAME}.png</icon>
+ <label>{TESTSUITE_NAME}</label>
+ </ui-application>
+ <privileges>
+ <privilege></privilege>
+ </privileges>
+</manifest>
--- /dev/null
+Copyright (c) 2015 Samsung Electronics Co.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
--- /dev/null
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
--- /dev/null
+commondir = resources webrunner
+SUBDIRS = testcase $(commondir)
+docdir = $(prefix)/opt/{TESTSUITE_NAME}
+dist_doc_DATA = README tests.xml tests.full.xml NOTICE LICENSE.Apache-2.0 COPYING
--- /dev/null
+Copyright (c) 2015 Samsung Electronics Co., Ltd. All rights reserved.
+Copyright (c) 2012 Intel Corporation.
+Except as noted, this software is licensed under Apache License, Version 2 or BSD-3-Clause License.
+Please, see the LICENSE.Apache-2.0 file for Apache License, Version 2 terms and conditions
+or the COPYING file for BSD-3-Clause License.
--- /dev/null
+----------------------------------------------
+License
+----------------------------------------------
+Copyright (c) 2015 Samsung Electronics Co.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+
+
+----------------------------------------------
+Introduction
+----------------------------------------------
+This test suite is for testing Tizen {API_NAME} API, which covers the following specifications:
+
+
+
+----------------------------------------------
+Test Environment
+----------------------------------------------
+1. Testkit-stub must be installed on target device.
+2. Testkit-lite must be installed on test machine.
+
+
+----------------------------------------------
+Build and Run
+----------------------------------------------
+(Suppose you only get the source code and Testkit-Lite has been set up on your test machine.
+ If you have obtained tct-alarm-tizen-tests ZIP packages, you can directly go to step 3 on the test machine;
+ if you have not installed Testkit-Lite, you need to install the latest version.)
+
+Steps:
+1. Prepare for building by running the following command:
+ cd {TESTSUITE_NAME}
+
+2. Build ZIP package by running the following command:
+ ./pack.sh
+
+3. Unzip the package on the test machine by running the following command:
+ unzip -o {TESTSUITE_NAME}-<version>.zip -d /opt/usr/media/tct
+
+4. Install the package on the test machine by running the following command:
+ /opt/usr/media/tct/opt/{TESTSUITE_NAME}/inst.sh
+
+5. Run test cases by running the following command on host:
+ testkit-lite -f device:/opt/usr/media/tct/opt/{TESTSUITE_NAME}/tests.xml -e "WRTLauncher" -o {TESTSUITE_NAME}.results.xml
--- /dev/null
+#!/bin/sh
+
+autoreconf --install
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<widget id='http://tizen.org/test/{TESTSUITE_NAME}' xmlns='http://www.w3.org/ns/widgets' xmlns:tizen='http://tizen.org/ns/widgets' version='{TIZEN_VERSION}'>
+ <name>{TESTSUITE_NAME}</name>
+ <icon src="icon.png" height="117" width="117"/>
+ <tizen:application id="{APP_ID}" package="{PACK_ID}" required_version="{REQUIRED_VER}"/>
+ <tizen:setting screen-orientation="landscape" />
+ <tizen:setting background-support="enable"/>
+</widget>
--- /dev/null
+AC_INIT([{TESTSUITE_NAME}], [2.4], [kimsamsung@samsung.com])
+AM_INIT_AUTOMAKE([-Wall -Werror foreign])
+
+AC_CONFIG_FILES([Makefile \
+testcase/Makefile \
+resources/Makefile \
+webrunner/Makefile])
+AC_OUTPUT
--- /dev/null
+#!/bin/bash
+wgt_installer="pkgcmd"
+NAME=$(basename $(cd $(dirname $0);pwd))
+
+#parse params
+USAGE="Usage: ./inst.sh [-i] [-u]
+ -i install wgt and config environment
+ -u uninstall wgt and remove source file
+[-i] option was set as default."
+
+function installpkg(){
+### install wgt ###
+type $wgt_installer > /dev/null 2>&1
+if [ $? -eq 0 ]; then
+ [ -e /opt/usr/media/tct/opt/$NAME/$NAME.wgt ] && $wgt_installer -i -t wgt -q -p /opt/usr/media/tct/opt/$NAME/$NAME.wgt
+ if [ $? -eq 0 ]; then
+ echo "Install /opt/usr/media/tct/opt/$NAME/$NAME.wgt to /opt/usr/apps/`wrt-launcher -l 2> /dev/null | grep $NAME | tail -n 1 | awk '{ print $(NF-1) }'` done"
+ echo "$(wrt-launcher -l | grep $NAME | awk '{ print $(NF-1) }') sdbd rw" | smackload
+ else
+ echo "Install /opt/$NAME/$NAME.wgt fail ..."
+ fi
+ sync
+fi
+}
+
+function uninstallpkg(){
+### uninstall wgt ###
+type $wgt_installer > /dev/null 2>&1
+if [ $? -eq 0 ]; then
+ package_id=`wrt-launcher -l 2> /dev/null | grep $NAME | tail -n 1 | awk '{ print $(NF-1) }'`
+ if [ -n "$(ps -ef | grep $package_id | grep -v grep | awk '{print $2}')" ]; then
+ for i in $(ps -ef | grep $package_id | grep -v grep | awk '{print $2}')
+ do
+ kill -9 $i
+ if [ "$?" -ne 0 ]; then
+ echo "Kill the processes of $NAME fail ..."
+ else
+ echo "Kill the processes of $NAME done"
+ fi
+ done
+ fi
+ if [ -n "$package_id" ]; then
+ $wgt_installer -u -q -t wgt -n $package_id
+ if [ "$?" -ne 0 ]; then
+ echo "Uninstall $NAME fail ..."
+ else
+ echo "Uninstall $NAME done"
+ fi
+ sync
+ fi
+ for i in testalar00
+ do
+ if [ -n "$(ps -ef | grep $i | grep -v grep | awk '{print $2}')" ]; then
+ kill -9 $(ps -ef | grep $i | grep -v grep | awk '{print $2}')
+ if [ "$?" -ne 0 ]; then
+ echo "Kill the processes of $i fail ..."
+ else
+ echo "Kill the processes of $i done"
+ fi
+ fi
+ INSTALLED=`wrt-launcher -l | awk /$i/' { print $(NF); }'`
+ if [ -n "$INSTALLED" ] ; then
+ $wgt_installer -u -q -t wgt -n $i
+ if [ "$?" -ne 0 ]; then
+ echo "Uninstall $i fail ..."
+ else
+ echo "Uninstall $i done"
+ fi
+ fi
+ done
+fi
+
+### remove source file ###
+if [ -d /opt/usr/media/tct/opt/$NAME ];then
+ rm -rf /opt/usr/media/tct/opt/$NAME
+else
+ echo "Remove source file fail,please check if the source file exist: /opt/usr/media/tct/opt/$NAME ..."
+fi
+}
+
+case "$1" in
+ -h|--help) echo "$USAGE"
+ exit ;;
+ ""|-i) installpkg;;
+ -u) uninstallpkg;;
+ *) echo "Unknown option: $1"
+ echo "$USAGE"
+ exit ;;
+esac
--- /dev/null
+{
+ "version": "{TIZEN_VERSION}",
+ "name": "{TESTSUITE_NAME}",
+ "permissions": ["tabs", "unlimited_storage", "notifications", "http://*/*", "https://*/*"],
+ "description": "{TESTSUITE_NAME}",
+ "webapimanager": true,
+ "file_name": "manifest.json",
+ "app": {
+ "launch": {
+ "local_path": "index.html"
+ }
+ }
+}
--- /dev/null
+#!/bin/bash
+source $(dirname $0)/$(basename $(pwd)).spec
+
+#parse params
+usage="Usage: ./pack.sh [-t <package type: wgt | apk | crx | xpk>]
+[-t wgt] option was set as default."
+
+if [[ $1 == "-h" || $1 == "--help" ]]; then
+ echo $usage
+ exit 1
+fi
+
+type="wgt"
+while getopts t: o
+do
+ case "$o" in
+ t) type=$OPTARG;;
+ *) echo $usage
+ exit 1;;
+ esac
+done
+
+if [[ $type == "wgt" || $type == "apk" || $type == "crx" || $type == "xpk" ]];then
+ echo "Create package with $type and raw source"
+else
+ echo "Sorry,$type is not support... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+ echo "$usage"
+ exit 1
+fi
+
+if [[ -z $name || -z $version || -z $appname ]];then
+ echo "Package name or version not specified in setting file"
+ exit 1
+fi
+
+SRC_ROOT=$PWD
+BUILD_ROOT=/tmp/${name}_pack
+BUILD_DEST=/tmp/${name}
+
+# check precondition
+function check_precondition(){
+ which $1 > /dev/null 2>&1
+ if [ $? -ne 0 ]; then
+ echo "Error: no tool: $1"
+ exit 1
+ fi
+}
+check_precondition autoreconf
+check_precondition gcc
+check_precondition make
+
+# clean
+function clean_workspace(){
+echo "cleaning workspace... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+rm -rf $BUILD_ROOT $BUILD_DEST
+}
+
+clean_workspace
+mkdir -p $BUILD_ROOT $BUILD_DEST
+
+# copy source code
+rm -rf *.rpm *.tar.bz2 *.tar.gz *.zip
+cp -arf $SRC_ROOT/* $BUILD_ROOT/
+
+# build
+echo "build from workspace... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+cd $BUILD_ROOT
+./autogen && ./configure --prefix=/ && make && make install DESTDIR=$BUILD_DEST
+if [ $? -ne 0 ];then
+ echo "build fail,please check Makefile.am and cofigure.ac... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+ clean_workspace
+ exit 1
+fi
+find $BUILD_DEST -name "Makefile*" -delete
+
+## function for create wgt apk xpk ##
+
+function create_wgt(){
+# create wgt
+cd $BUILD_DEST
+cp -a $BUILD_ROOT/manifest.json $BUILD_DEST/
+cp -a $BUILD_ROOT/icon.png $BUILD_DEST/
+cat > index.html << EOF
+<!doctype html>
+<head>
+ <meta http-equiv="Refresh" content="1; url=opt/$name/webrunner/index.html?testsuite=/opt/usr/media/tct/opt/$name/tests.xml">
+</head>
+EOF
+cp -f $BUILD_ROOT/config.xml $BUILD_DEST/config.xml
+zip -rq $BUILD_DEST/opt/$name/$name.wgt *
+if [ $? -ne 0 ];then
+ echo "Create $name.wgt fail.... >>>>>>>>>>>>>>>>>>>>>>>>>"
+ clean_workspace
+ exit 1
+fi
+
+# sign wgt
+if [ $sign -eq 1 ];then
+ # copy signing tool
+ echo "copy signing tool... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+ cp -arf $SRC_ROOT/../../tools/signing $BUILD_ROOT/signing
+ if [ $? -ne 0 ];then
+ echo "No signing tool found in $SRC_ROOT/../tools.... >>>>>>>>>>>>>>>>>>>>>>>>>"
+ clean_workspace
+ exit 1
+ fi
+ wgt=$(find $BUILD_DEST/opt/$name/ -name *.wgt)
+ for wgt in $(find $BUILD_DEST/opt/$name/ -name *.wgt);do
+ $BUILD_ROOT/signing/sign-widget.sh --dist platform $wgt
+ if [ $? -ne 0 ];then
+ echo "Please check your signature files... >>>>>>>>>>>>>>>>>>>>>>>>>"
+ clean_workspace
+ exit 1
+ fi
+ done
+fi
+}
+
+function create_apk(){
+cd $BUILD_DEST
+cat > index.html << EOF
+<!doctype html>
+<head>
+ <meta http-equiv="Refresh" content="1; url=opt/$name/webrunner/index.html?testsuite=../tests.xml&testprefix=../../..">
+</head>
+EOF
+cp $BUILD_DEST/opt/$name/tests.xml $BUILD_DEST/
+cp -a $BUILD_ROOT/icon.png $BUILD_DEST/
+cp -r $SRC_ROOT/../tools/xwalk_app_template $BUILD_ROOT/xwalk_app_template
+
+cd $BUILD_ROOT/xwalk_app_template
+python make_apk.py --package=org.xwalk.$appname --name=$appname --app-root=$BUILD_DEST --app-local-path=index.html --icon=$BUILD_DEST/icon.png
+if [ $? -ne 0 ];then
+ echo "Create $name.apk fail.... >>>>>>>>>>>>>>>>>>>>>>>>>"
+ clean_workspace
+ exit 1
+fi
+}
+
+function create_xpk(){
+cp -a $BUILD_ROOT/manifest.json $BUILD_DEST/
+cp -a $BUILD_ROOT/icon.png $BUILD_DEST/
+
+cd $BUILD_DEST
+cat > index.html << EOF
+<!doctype html>
+<head>
+ <meta http-equiv="Refresh" content="1; url=opt/$name/webrunner/index.html?testsuite=../tests.xml&testprefix=../../..">
+</head>
+EOF
+
+cp $SRC_ROOT/../tools/xpk_generator $BUILD_ROOT/xpk_generator
+cd $BUILD_ROOT
+./xpk_generator /tmp/$name key
+if [ $? -ne 0 ];then
+ echo "Create $name.xpk fail.... >>>>>>>>>>>>>>>>>>>>>>>>>"
+ clean_workspace
+ exit 1
+fi
+}
+
+function create_crx(){
+echo "crx is not support yet... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+clean_workspace
+exit 1
+}
+
+## zip function ##
+function zip_for_wgt(){
+cd $BUILD_DEST
+# cp inst.sh script #
+cp -af $BUILD_ROOT/inst.sh $BUILD_DEST/opt/$name/inst.sh
+
+if [ $src_file -eq 0 ];then
+ for file in $(ls opt/$name |grep -v wgt);do
+ if [[ "${whitelist[@]}" =~ $file ]];then
+ echo "$file in whitelist,keep it..."
+ else
+ echo "Remove unnessary file:$file..."
+ rm -rf opt/$name/$file
+ fi
+ done
+fi
+zip -Drq $BUILD_DEST/$name-$version.zip opt/
+if [ $? -ne 0 ];then
+ echo "Create zip package fail... >>>>>>>>>>>>>>>>>>>>>>>>>"
+ clean_workspace
+ exit 1
+fi
+}
+
+function zip_for_apk(){
+cd $BUILD_DEST
+# cp inst.sh script #
+cp -af $BUILD_ROOT/inst.sh.apk $BUILD_DEST/opt/$name/inst.sh
+mv $BUILD_ROOT/xwalk_app_template/$appname.apk $BUILD_DEST/opt/$name/
+
+if [ $src_file -eq 0 ];then
+ for file in $(ls opt/$name |grep -v apk);do
+ if [[ "${whitelist[@]}" =~ $file ]];then
+ echo "$file in whitelist,keep it..."
+ else
+ echo "Remove unnessary file:$file..."
+ rm -rf opt/$name/$file
+ fi
+ done
+fi
+zip -Drq $BUILD_DEST/$name-$version.zip opt/
+if [ $? -ne 0 ];then
+ echo "Create zip package fail... >>>>>>>>>>>>>>>>>>>>>>>>>"
+ clean_workspace
+ exit 1
+fi
+}
+
+function zip_for_xpk(){
+cd $BUILD_DEST
+cp -af $BUILD_ROOT/inst.sh.xpk $BUILD_DEST/opt/$name/inst.sh
+mv $BUILD_ROOT/$name.xpk $BUILD_DEST/opt/$name/
+
+if [ $src_file -eq 0 ];then
+ for file in $(ls opt/$name |grep -v xpk);do
+ if [[ "${whitelist[@]}" =~ $file ]];then
+ echo "$file in whitelist,keep it..."
+ else
+ echo "Remove unnessary file:$file..."
+ rm -rf opt/$name/$file
+ fi
+ done
+fi
+zip -Drq $BUILD_DEST/$name-$version.zip opt/
+if [ $? -ne 0 ];then
+ echo "Create zip package fail... >>>>>>>>>>>>>>>>>>>>>>>>>"
+ clean_workspace
+ exit 1
+fi
+}
+
+function zip_for_crx(){
+echo "zip_for_crx not ready yet... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+clean_workspace
+exit 1
+}
+
+## create wgt crx apk xpk and zip package ##
+case $type in
+ wgt) create_wgt
+ zip_for_wgt;;
+ apk) create_apk
+ zip_for_apk;;
+ xpk) create_xpk
+ zip_for_xpk;;
+ crx) create_crx
+ zip_for_crx;;
+esac
+
+
+# copy zip file
+echo "copy package from workspace... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+cp -f $BUILD_DEST/$name-$version.zip $SRC_ROOT/$name-$version.zip
+
+# clean workspace
+clean_workspace
+
+# validate
+echo "checking result... >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>"
+if [ -z "`ls $SRC_ROOT | grep "\.zip"`" ];then
+ echo "------------------------------ FAILED to build $name packages --------------------------"
+ exit 1
+fi
+
+echo "------------------------------ Done to build $name packages --------------------------"
+cd $SRC_ROOT
+ls *.zip 2>/dev/null
--- /dev/null
+All test files under this folder except COPYING and Makefile.am come from
+https://github.com/w3c/testharness.js (commit 81649066b179216eed02dfb58f631eb8bb6c7629)
+without any modification besides the necessary adjustment on reference path to test harness
+
+These tests are copyright by W3C and/or the author listed in the test
+file. The tests are dual-licensed under the W3C Test Suite License:
+http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
+and the BSD 3-clause License:
+http://www.w3.org/Consortium/Legal/2008/03-bsd-license
+under W3C's test suite licensing policy:
+http://www.w3.org/Consortium/Legal/2008/04-testsuite-copyright
+
--- /dev/null
+resources_SCRIPTS = *
+resourcesdir = $(prefix)/opt/{TESTSUITE_NAME}/resources
+EXTRA_DIST = $(resources_SCRIPTS)
+docdir = $(prefix)/opt/{TESTSUITE_NAME}/resources
+dist_doc_DATA = COPYING
--- /dev/null
+html {
+ font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;
+}
+
+#log .warning,
+#log .warning a {
+ color: black;
+ background: yellow;
+}
+
+#log .error,
+#log .error a {
+ color: white;
+ background: red;
+}
+
+#log pre {
+ border: 1px solid black;
+ padding: 1em;
+}
+
+section#summary {
+ margin-bottom:1em;
+}
+
+table#results {
+ border-collapse:collapse;
+ table-layout:fixed;
+ width:100%;
+}
+
+table#results th:first-child,
+table#results td:first-child {
+ width:4em;
+}
+
+table#results th:last-child,
+table#results td:last-child {
+ width:50%;
+}
+
+table#results.assertions th:last-child,
+table#results.assertions td:last-child {
+ width:35%;
+}
+
+table#results th {
+ padding:0;
+ padding-bottom:0.5em;
+ border-bottom:medium solid black;
+}
+
+table#results td {
+ padding:1em;
+ padding-bottom:0.5em;
+ border-bottom:thin solid black;
+}
+
+tr.pass > td:first-child {
+ color:green;
+}
+
+tr.fail > td:first-child {
+ color:red;
+}
+
+tr.timeout > td:first-child {
+ color:red;
+}
+
+tr.notrun > td:first-child {
+ color:blue;
+}
+
+.pass > td:first-child, .fail > td:first-child, .timeout > td:first-child, .notrun > td:first-child {
+ font-variant:small-caps;
+}
+
+table#results span {
+ display:block;
+}
+
+table#results span.expected {
+ font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace;
+ white-space:pre;
+}
+
+table#results span.actual {
+ font-family:DejaVu Sans Mono, Bitstream Vera Sans Mono, Monospace;
+ white-space:pre;
+}
+
--- /dev/null
+/*
+Distributed under both the W3C Test Suite License [1] and the W3C
+3-clause BSD License [2]. To contribute to a W3C Test Suite, see the
+policies and contribution forms [3].
+
+[1] http://www.w3.org/Consortium/Legal/2008/04-testsuite-license
+[2] http://www.w3.org/Consortium/Legal/2008/03-bsd-license
+[3] http://www.w3.org/2004/10/27-testcases
+*/
+
+/*
+ * == Introduction ==
+ *
+ * This file provides a framework for writing testcases. It is intended to
+ * provide a convenient API for making common assertions, and to work both
+ * for testing synchronous and asynchronous DOM features in a way that
+ * promotes clear, robust, tests.
+ *
+ * == Basic Usage ==
+ *
+ * To use this file, import the script and the testharnessreport script into
+ * the test document:
+ * <script src="/resources/testharness.js"></script>
+ * <script src="/resources/testharnessreport.js"></script>
+ *
+ * Within each file one may define one or more tests. Each test is atomic
+ * in the sense that a single test has a single result (pass/fail/timeout).
+ * Within each test one may have a number of asserts. The test fails at the
+ * first failing assert, and the remainder of the test is (typically) not run.
+ *
+ * If the file containing the tests is a HTML file with an element of id "log"
+ * this will be populated with a table containing the test results after all
+ * the tests have run.
+ *
+ * NOTE: By default tests must be created before the load event fires. For ways
+ * to create tests after the load event, see "Determining when all tests
+ * are complete", below
+ *
+ * == Synchronous Tests ==
+ *
+ * To create a synchronous test use the test() function:
+ *
+ * test(test_function, name, properties)
+ *
+ * test_function is a function that contains the code to test. For example a
+ * trivial passing test would be:
+ *
+ * test(function() {assert_true(true)}, "assert_true with true")
+ *
+ * The function passed in is run in the test() call.
+ *
+ * properties is an object that overrides default test properties. The
+ * recognised properties are:
+ * timeout - the test timeout in ms
+ *
+ * e.g.
+ * test(test_function, "Sample test", {timeout:1000})
+ *
+ * would run test_function with a timeout of 1s.
+ *
+ * Additionally, test-specific metadata can be passed in the properties. These
+ * are used when the individual test has different metadata from that stored
+ * in the <head>.
+ * The recognized metadata properties are:
+ *
+ * help - The url of the part of the specification being tested
+ *
+ * assert - A human readable description of what the test is attempting
+ * to prove
+ *
+ * author - Name and contact information for the author of the test in the
+ * format: "Name <email_addr>" or "Name http://contact/url"
+ *
+ * == Asynchronous Tests ==
+ *
+ * Testing asynchronous features is somewhat more complex since the result of
+ * a test may depend on one or more events or other callbacks. The API provided
+ * for testing these features is indended to be rather low-level but hopefully
+ * applicable to many situations.
+ *
+ * To create a test, one starts by getting a Test object using async_test:
+ *
+ * async_test(name, properties)
+ *
+ * e.g.
+ * var t = async_test("Simple async test")
+ *
+ * Assertions can be added to the test by calling the step method of the test
+ * object with a function containing the test assertions:
+ *
+ * t.step(function() {assert_true(true)});
+ *
+ * When all the steps are complete, the done() method must be called:
+ *
+ * t.done();
+ *
+ * As a convenience, async_test can also takes a function as first argument.
+ * This function is called with the test object as both its `this` object and
+ * first argument. The above example can be rewritten as:
+ *
+ * async_test(function(t) {
+ * object.some_event = function() {
+ * t.step(function (){assert_true(true); t.done();});
+ * };
+ * }, "Simple async test");
+ *
+ * which avoids cluttering the global scope with references to async
+ * tests instances.
+ *
+ * The properties argument is identical to that for test().
+ *
+ * In many cases it is convenient to run a step in response to an event or a
+ * callback. A convenient method of doing this is through the step_func method
+ * which returns a function that, when called runs a test step. For example
+ *
+ * object.some_event = t.step_func(function(e) {assert_true(e.a)});
+ *
+ * == Making assertions ==
+ *
+ * Functions for making assertions start assert_
+ * The best way to get a list is to look in this file for functions names
+ * matching that pattern. The general signature is
+ *
+ * assert_something(actual, expected, description)
+ *
+ * although not all assertions precisely match this pattern e.g. assert_true
+ * only takes actual and description as arguments.
+ *
+ * The description parameter is used to present more useful error messages when
+ * a test fails
+ *
+ * NOTE: All asserts must be located in a test() or a step of an async_test().
+ * asserts outside these places won't be detected correctly by the harness
+ * and may cause a file to stop testing.
+ *
+ * == Setup ==
+ *
+ * Sometimes tests require non-trivial setup that may fail. For this purpose
+ * there is a setup() function, that may be called with one or two arguments.
+ * The two argument version is:
+ *
+ * setup(func, properties)
+ *
+ * The one argument versions may omit either argument.
+ * func is a function to be run synchronously. setup() becomes a no-op once
+ * any tests have returned results. Properties are global properties of the test
+ * harness. Currently recognised properties are:
+ *
+ * timeout - The time in ms after which the harness should stop waiting for
+ * tests to complete (this is different to the per-test timeout
+ * because async tests do not start their timer until .step is called)
+ *
+ * explicit_done - Wait for an explicit call to done() before declaring all
+ * tests complete (see below)
+ *
+ * output_document - The document to which results should be logged. By default
+ * this is the current document but could be an ancestor
+ * document in some cases e.g. a SVG test loaded in an HTML
+ * wrapper
+ *
+ * explicit_timeout - disable file timeout; only stop waiting for results
+ * when the timeout() function is called (typically for
+ * use when integrating with some existing test framework
+ * that has its own timeout mechanism).
+ *
+ * == Determining when all tests are complete ==
+ *
+ * By default the test harness will assume there are no more results to come
+ * when:
+ * 1) There are no Test objects that have been created but not completed
+ * 2) The load event on the document has fired
+ *
+ * This behaviour can be overridden by setting the explicit_done property to
+ * true in a call to setup(). If explicit_done is true, the test harness will
+ * not assume it is done until the global done() function is called. Once done()
+ * is called, the two conditions above apply like normal.
+ *
+ * == Generating tests ==
+ *
+ * NOTE: this functionality may be removed
+ *
+ * There are scenarios in which is is desirable to create a large number of
+ * (synchronous) tests that are internally similar but vary in the parameters
+ * used. To make this easier, the generate_tests function allows a single
+ * function to be called with each set of parameters in a list:
+ *
+ * generate_tests(test_function, parameter_lists, properties)
+ *
+ * For example:
+ *
+ * generate_tests(assert_equals, [
+ * ["Sum one and one", 1+1, 2],
+ * ["Sum one and zero", 1+0, 1]
+ * ])
+ *
+ * Is equivalent to:
+ *
+ * test(function() {assert_equals(1+1, 2)}, "Sum one and one")
+ * test(function() {assert_equals(1+0, 1)}, "Sum one and zero")
+ *
+ * Note that the first item in each parameter list corresponds to the name of
+ * the test.
+ *
+ * The properties argument is identical to that for test(). This may be a
+ * single object (used for all generated tests) or an array.
+ *
+ * == Callback API ==
+ *
+ * The framework provides callbacks corresponding to 3 events:
+ *
+ * start - happens when the first Test is created
+ * result - happens when a test result is recieved
+ * complete - happens when all results are recieved
+ *
+ * The page defining the tests may add callbacks for these events by calling
+ * the following methods:
+ *
+ * add_start_callback(callback) - callback called with no arguments
+ * add_result_callback(callback) - callback called with a test argument
+ * add_completion_callback(callback) - callback called with an array of tests
+ * and an status object
+ *
+ * tests have the following properties:
+ * status: A status code. This can be compared to the PASS, FAIL, TIMEOUT and
+ * NOTRUN properties on the test object
+ * message: A message indicating the reason for failure. In the future this
+ * will always be a string
+ *
+ * The status object gives the overall status of the harness. It has the
+ * following properties:
+ * status: Can be compared to the OK, ERROR and TIMEOUT properties
+ * message: An error message set when the status is ERROR
+ *
+ * == External API ==
+ *
+ * In order to collect the results of multiple pages containing tests, the test
+ * harness will, when loaded in a nested browsing context, attempt to call
+ * certain functions in each ancestor and opener browsing context:
+ *
+ * start - start_callback
+ * result - result_callback
+ * complete - completion_callback
+ *
+ * These are given the same arguments as the corresponding internal callbacks
+ * described above.
+ *
+ * == External API through cross-document messaging ==
+ *
+ * Where supported, the test harness will also send messages using
+ * cross-document messaging to each ancestor and opener browsing context. Since
+ * it uses the wildcard keyword (*), cross-origin communication is enabled and
+ * script on different origins can collect the results.
+ *
+ * This API follows similar conventions as those described above only slightly
+ * modified to accommodate message event API. Each message is sent by the harness
+ * is passed a single vanilla object, available as the `data` property of the
+ * event object. These objects are structures as follows:
+ *
+ * start - { type: "start" }
+ * result - { type: "result", test: Test }
+ * complete - { type: "complete", tests: [Test, ...], status: TestsStatus }
+ *
+ * == List of assertions ==
+ *
+ * assert_true(actual, description)
+ * asserts that /actual/ is strictly true
+ *
+ * assert_false(actual, description)
+ * asserts that /actual/ is strictly false
+ *
+ * assert_equals(actual, expected, description)
+ * asserts that /actual/ is the same value as /expected/
+ *
+ * assert_not_equals(actual, expected, description)
+ * asserts that /actual/ is a different value to /expected/. Yes, this means
+ * that "expected" is a misnomer
+ *
+ * assert_in_array(actual, expected, description)
+ * asserts that /expected/ is an Array, and /actual/ is equal to one of the
+ * members -- expected.indexOf(actual) != -1
+ *
+ * assert_array_equals(actual, expected, description)
+ * asserts that /actual/ and /expected/ have the same length and the value of
+ * each indexed property in /actual/ is the strictly equal to the corresponding
+ * property value in /expected/
+ *
+ * assert_approx_equals(actual, expected, epsilon, description)
+ * asserts that /actual/ is a number within +/- /epsilon/ of /expected/
+ *
+ * assert_less_than(actual, expected, description)
+ * asserts that /actual/ is a number less than /expected/
+ *
+ * assert_greater_than(actual, expected, description)
+ * asserts that /actual/ is a number greater than /expected/
+ *
+ * assert_less_than_equal(actual, expected, description)
+ * asserts that /actual/ is a number less than or equal to /expected/
+ *
+ * assert_greater_than_equal(actual, expected, description)
+ * asserts that /actual/ is a number greater than or equal to /expected/
+ *
+ * assert_regexp_match(actual, expected, description)
+ * asserts that /actual/ matches the regexp /expected/
+ *
+ * assert_class_string(object, class_name, description)
+ * asserts that the class string of /object/ as returned in
+ * Object.prototype.toString is equal to /class_name/.
+ *
+ * assert_own_property(object, property_name, description)
+ * assert that object has own property property_name
+ *
+ * assert_inherits(object, property_name, description)
+ * assert that object does not have an own property named property_name
+ * but that property_name is present in the prototype chain for object
+ *
+ * assert_idl_attribute(object, attribute_name, description)
+ * assert that an object that is an instance of some interface has the
+ * attribute attribute_name following the conditions specified by WebIDL
+ *
+ * assert_readonly(object, property_name, description)
+ * assert that property property_name on object is readonly
+ *
+ * assert_throws(code, func, description)
+ * code - the expected exception:
+ * o string: the thrown exception must be a DOMException with the given
+ * name, e.g., "TimeoutError" (for compatibility with existing
+ * tests, a constant is also supported, e.g., "TIMEOUT_ERR")
+ * o object: the thrown exception must have a property called "name" that
+ * matches code.name
+ * o null: allow any exception (in general, one of the options above
+ * should be used)
+ * func - a function that should throw
+ *
+ * assert_unreached(description)
+ * asserts if called. Used to ensure that some codepath is *not* taken e.g.
+ * an event does not fire.
+ *
+ * assert_any(assert_func, actual, expected_array, extra_arg_1, ... extra_arg_N)
+ * asserts that one assert_func(actual, expected_array_N, extra_arg1, ..., extra_arg_N)
+ * is true for some expected_array_N in expected_array. This only works for assert_func
+ * with signature assert_func(actual, expected, args_1, ..., args_N). Note that tests
+ * with multiple allowed pass conditions are bad practice unless the spec specifically
+ * allows multiple behaviours. Test authors should not use this method simply to hide
+ * UA bugs.
+ *
+ * assert_exists(object, property_name, description)
+ * *** deprecated ***
+ * asserts that object has an own property property_name
+ *
+ * assert_not_exists(object, property_name, description)
+ * *** deprecated ***
+ * assert that object does not have own property property_name
+ */
+
+(function ()
+{
+ var debug = false;
+ // default timeout is 5 seconds, test can override if needed
+ var settings = {
+ output:true,
+ timeout:5000,
+ test_timeout:2000
+ };
+
+ var xhtml_ns = "http://www.w3.org/1999/xhtml";
+
+ // script_prefix is used by Output.prototype.show_results() to figure out
+ // where to get testharness.css from. It's enclosed in an extra closure to
+ // not pollute the library's namespace with variables like "src".
+ var script_prefix = null;
+ (function ()
+ {
+ var scripts = document.getElementsByTagName("script");
+ for (var i = 0; i < scripts.length; i++)
+ {
+ if (scripts[i].src)
+ {
+ var src = scripts[i].src;
+ }
+ else if (scripts[i].href)
+ {
+ //SVG case
+ var src = scripts[i].href.baseVal;
+ }
+ if (src && src.slice(src.length - "testharness.js".length) === "testharness.js")
+ {
+ script_prefix = src.slice(0, src.length - "testharness.js".length);
+ break;
+ }
+ }
+ })();
+
+ /*
+ * API functions
+ */
+
+ var name_counter = 0;
+ function next_default_name()
+ {
+ //Don't use document.title to work around an Opera bug in XHTML documents
+ var prefix = document.getElementsByTagName("title").length > 0 ?
+ document.getElementsByTagName("title")[0].firstChild.data :
+ "Untitled";
+ var suffix = name_counter > 0 ? " " + name_counter : "";
+ name_counter++;
+ return prefix + suffix;
+ }
+
+ function test(func, name, properties)
+ {
+ var test_name = name ? name : next_default_name();
+ properties = properties ? properties : {};
+ var test_obj = new Test(test_name, properties);
+ test_obj.step(func);
+ if (test_obj.status === test_obj.NOTRUN) {
+ test_obj.done();
+ }
+ }
+
+ function async_test(func, name, properties)
+ {
+ if (typeof func !== "function") {
+ properties = name;
+ name = func;
+ func = null;
+ }
+ var test_name = name ? name : next_default_name();
+ properties = properties ? properties : {};
+ var test_obj = new Test(test_name, properties);
+ if (func) {
+ test_obj.step(func, test_obj, test_obj);
+ }
+ return test_obj;
+ }
+
+ function setup(func_or_properties, maybe_properties)
+ {
+ var func = null;
+ var properties = {};
+ if (arguments.length === 2) {
+ func = func_or_properties;
+ properties = maybe_properties;
+ } else if (func_or_properties instanceof Function){
+ func = func_or_properties;
+ } else {
+ properties = func_or_properties;
+ }
+ tests.setup(func, properties);
+ output.setup(properties);
+ }
+
+ function done() {
+ tests.end_wait();
+ }
+
+ function generate_tests(func, args, properties) {
+ forEach(args, function(x, i)
+ {
+ var name = x[0];
+ test(function()
+ {
+ func.apply(this, x.slice(1));
+ },
+ name,
+ Array.isArray(properties) ? properties[i] : properties);
+ });
+ }
+
+ function on_event(object, event, callback)
+ {
+ object.addEventListener(event, callback, false);
+ }
+
+ expose(test, 'test');
+ expose(async_test, 'async_test');
+ expose(generate_tests, 'generate_tests');
+ expose(setup, 'setup');
+ expose(done, 'done');
+ expose(on_event, 'on_event');
+
+ /*
+ * Return a string truncated to the given length, with ... added at the end
+ * if it was longer.
+ */
+ function truncate(s, len)
+ {
+ if (s.length > len) {
+ return s.substring(0, len - 3) + "...";
+ }
+ return s;
+ }
+
+ /*
+ * Convert a value to a nice, human-readable string
+ */
+ function format_value(val)
+ {
+ if (Array.isArray(val))
+ {
+ return "[" + val.map(format_value).join(", ") + "]";
+ }
+
+ switch (typeof val)
+ {
+ case "string":
+ val = val.replace("\\", "\\\\");
+ for (var i = 0; i < 32; i++)
+ {
+ var replace = "\\";
+ switch (i) {
+ case 0: replace += "0"; break;
+ case 1: replace += "x01"; break;
+ case 2: replace += "x02"; break;
+ case 3: replace += "x03"; break;
+ case 4: replace += "x04"; break;
+ case 5: replace += "x05"; break;
+ case 6: replace += "x06"; break;
+ case 7: replace += "x07"; break;
+ case 8: replace += "b"; break;
+ case 9: replace += "t"; break;
+ case 10: replace += "n"; break;
+ case 11: replace += "v"; break;
+ case 12: replace += "f"; break;
+ case 13: replace += "r"; break;
+ case 14: replace += "x0e"; break;
+ case 15: replace += "x0f"; break;
+ case 16: replace += "x10"; break;
+ case 17: replace += "x11"; break;
+ case 18: replace += "x12"; break;
+ case 19: replace += "x13"; break;
+ case 20: replace += "x14"; break;
+ case 21: replace += "x15"; break;
+ case 22: replace += "x16"; break;
+ case 23: replace += "x17"; break;
+ case 24: replace += "x18"; break;
+ case 25: replace += "x19"; break;
+ case 26: replace += "x1a"; break;
+ case 27: replace += "x1b"; break;
+ case 28: replace += "x1c"; break;
+ case 29: replace += "x1d"; break;
+ case 30: replace += "x1e"; break;
+ case 31: replace += "x1f"; break;
+ }
+ val = val.replace(RegExp(String.fromCharCode(i), "g"), replace);
+ }
+ return '"' + val.replace(/"/g, '\\"') + '"';
+ case "boolean":
+ case "undefined":
+ return String(val);
+ case "number":
+ // In JavaScript, -0 === 0 and String(-0) == "0", so we have to
+ // special-case.
+ if (val === -0 && 1/val === -Infinity)
+ {
+ return "-0";
+ }
+ return String(val);
+ case "object":
+ if (val === null)
+ {
+ return "null";
+ }
+
+ // Special-case Node objects, since those come up a lot in my tests. I
+ // ignore namespaces. I use duck-typing instead of instanceof, because
+ // instanceof doesn't work if the node is from another window (like an
+ // iframe's contentWindow):
+ // http://www.w3.org/Bugs/Public/show_bug.cgi?id=12295
+ if ("nodeType" in val
+ && "nodeName" in val
+ && "nodeValue" in val
+ && "childNodes" in val)
+ {
+ switch (val.nodeType)
+ {
+ case Node.ELEMENT_NODE:
+ var ret = "<" + val.tagName.toLowerCase();
+ for (var i = 0; i < val.attributes.length; i++)
+ {
+ ret += " " + val.attributes[i].name + '="' + val.attributes[i].value + '"';
+ }
+ ret += ">" + val.innerHTML + "</" + val.tagName.toLowerCase() + ">";
+ return "Element node " + truncate(ret, 60);
+ case Node.TEXT_NODE:
+ return 'Text node "' + truncate(val.data, 60) + '"';
+ case Node.PROCESSING_INSTRUCTION_NODE:
+ return "ProcessingInstruction node with target " + format_value(truncate(val.target, 60)) + " and data " + format_value(truncate(val.data, 60));
+ case Node.COMMENT_NODE:
+ return "Comment node <!--" + truncate(val.data, 60) + "-->";
+ case Node.DOCUMENT_NODE:
+ return "Document node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children");
+ case Node.DOCUMENT_TYPE_NODE:
+ return "DocumentType node";
+ case Node.DOCUMENT_FRAGMENT_NODE:
+ return "DocumentFragment node with " + val.childNodes.length + (val.childNodes.length == 1 ? " child" : " children");
+ default:
+ return "Node object of unknown type";
+ }
+ }
+
+ // Fall through to default
+ default:
+ return typeof val + ' "' + truncate(String(val), 60) + '"';
+ }
+ }
+ expose(format_value, "format_value");
+
+ /*
+ * Assertions
+ */
+
+ function assert_true(actual, description)
+ {
+ assert(actual === true, "assert_true", description,
+ "expected true got ${actual}", {actual:actual});
+ };
+ expose(assert_true, "assert_true");
+
+ function assert_false(actual, description)
+ {
+ assert(actual === false, "assert_false", description,
+ "expected false got ${actual}", {actual:actual});
+ };
+ expose(assert_false, "assert_false");
+
+ function same_value(x, y) {
+ if (y !== y)
+ {
+ //NaN case
+ return x !== x;
+ }
+ else if (x === 0 && y === 0) {
+ //Distinguish +0 and -0
+ return 1/x === 1/y;
+ }
+ else
+ {
+ //typical case
+ return x === y;
+ }
+ }
+
+ function assert_equals(actual, expected, description)
+ {
+ /*
+ * Test if two primitives are equal or two objects
+ * are the same object
+ */
+ if (typeof actual != typeof expected)
+ {
+ assert(false, "assert_equals", description,
+ "expected (" + typeof expected + ") ${expected} but got (" + typeof actual + ") ${actual}",
+ {expected:expected, actual:actual});
+ return;
+ }
+ assert(same_value(actual, expected), "assert_equals", description,
+ "expected ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_equals, "assert_equals");
+
+ function assert_not_equals(actual, expected, description)
+ {
+ /*
+ * Test if two primitives are unequal or two objects
+ * are different objects
+ */
+ assert(!same_value(actual, expected), "assert_not_equals", description,
+ "got disallowed value ${actual}",
+ {actual:actual});
+ };
+ expose(assert_not_equals, "assert_not_equals");
+
+ function assert_in_array(actual, expected, description)
+ {
+ assert(expected.indexOf(actual) != -1, "assert_in_array", description,
+ "value ${actual} not in array ${expected}",
+ {actual:actual, expected:expected});
+ }
+ expose(assert_in_array, "assert_in_array");
+
+ function assert_object_equals(actual, expected, description)
+ {
+ //This needs to be improved a great deal
+ function check_equal(actual, expected, stack)
+ {
+ stack.push(actual);
+
+ var p;
+ for (p in actual)
+ {
+ assert(expected.hasOwnProperty(p), "assert_object_equals", description,
+ "unexpected property ${p}", {p:p});
+
+ if (typeof actual[p] === "object" && actual[p] !== null)
+ {
+ if (stack.indexOf(actual[p]) === -1)
+ {
+ check_equal(actual[p], expected[p], stack);
+ }
+ }
+ else
+ {
+ assert(same_value(actual[p], expected[p]), "assert_object_equals", description,
+ "property ${p} expected ${expected} got ${actual}",
+ {p:p, expected:expected, actual:actual});
+ }
+ }
+ for (p in expected)
+ {
+ assert(actual.hasOwnProperty(p),
+ "assert_object_equals", description,
+ "expected property ${p} missing", {p:p});
+ }
+ stack.pop();
+ }
+ check_equal(actual, expected, []);
+ };
+ expose(assert_object_equals, "assert_object_equals");
+
+ function assert_array_equals(actual, expected, description)
+ {
+ assert(actual.length === expected.length,
+ "assert_array_equals", description,
+ "lengths differ, expected ${expected} got ${actual}",
+ {expected:expected.length, actual:actual.length});
+
+ for (var i=0; i < actual.length; i++)
+ {
+ assert(actual.hasOwnProperty(i) === expected.hasOwnProperty(i),
+ "assert_array_equals", description,
+ "property ${i}, property expected to be $expected but was $actual",
+ {i:i, expected:expected.hasOwnProperty(i) ? "present" : "missing",
+ actual:actual.hasOwnProperty(i) ? "present" : "missing"});
+ assert(same_value(expected[i], actual[i]),
+ "assert_array_equals", description,
+ "property ${i}, expected ${expected} but got ${actual}",
+ {i:i, expected:expected[i], actual:actual[i]});
+ }
+ }
+ expose(assert_array_equals, "assert_array_equals");
+
+ function assert_approx_equals(actual, expected, epsilon, description)
+ {
+ /*
+ * Test if two primitive numbers are equal withing +/- epsilon
+ */
+ assert(typeof actual === "number",
+ "assert_approx_equals", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(Math.abs(actual - expected) <= epsilon,
+ "assert_approx_equals", description,
+ "expected ${expected} +/- ${epsilon} but got ${actual}",
+ {expected:expected, actual:actual, epsilon:epsilon});
+ };
+ expose(assert_approx_equals, "assert_approx_equals");
+
+ function assert_less_than(actual, expected, description)
+ {
+ /*
+ * Test if a primitive number is less than another
+ */
+ assert(typeof actual === "number",
+ "assert_less_than", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(actual < expected,
+ "assert_less_than", description,
+ "expected a number less than ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_less_than, "assert_less_than");
+
+ function assert_greater_than(actual, expected, description)
+ {
+ /*
+ * Test if a primitive number is greater than another
+ */
+ assert(typeof actual === "number",
+ "assert_greater_than", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(actual > expected,
+ "assert_greater_than", description,
+ "expected a number greater than ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_greater_than, "assert_greater_than");
+
+ function assert_less_than_equal(actual, expected, description)
+ {
+ /*
+ * Test if a primitive number is less than or equal to another
+ */
+ assert(typeof actual === "number",
+ "assert_less_than_equal", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(actual <= expected,
+ "assert_less_than", description,
+ "expected a number less than or equal to ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_less_than_equal, "assert_less_than_equal");
+
+ function assert_greater_than_equal(actual, expected, description)
+ {
+ /*
+ * Test if a primitive number is greater than or equal to another
+ */
+ assert(typeof actual === "number",
+ "assert_greater_than_equal", description,
+ "expected a number but got a ${type_actual}",
+ {type_actual:typeof actual});
+
+ assert(actual >= expected,
+ "assert_greater_than_equal", description,
+ "expected a number greater than or equal to ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ };
+ expose(assert_greater_than_equal, "assert_greater_than_equal");
+
+ function assert_regexp_match(actual, expected, description) {
+ /*
+ * Test if a string (actual) matches a regexp (expected)
+ */
+ assert(expected.test(actual),
+ "assert_regexp_match", description,
+ "expected ${expected} but got ${actual}",
+ {expected:expected, actual:actual});
+ }
+ expose(assert_regexp_match, "assert_regexp_match");
+
+ function assert_class_string(object, class_string, description) {
+ assert_equals({}.toString.call(object), "[object " + class_string + "]",
+ description);
+ }
+ expose(assert_class_string, "assert_class_string");
+
+
+ function _assert_own_property(name) {
+ return function(object, property_name, description)
+ {
+ assert(object.hasOwnProperty(property_name),
+ name, description,
+ "expected property ${p} missing", {p:property_name});
+ };
+ }
+ expose(_assert_own_property("assert_exists"), "assert_exists");
+ expose(_assert_own_property("assert_own_property"), "assert_own_property");
+
+ function assert_not_exists(object, property_name, description)
+ {
+ assert(!object.hasOwnProperty(property_name),
+ "assert_not_exists", description,
+ "unexpected property ${p} found", {p:property_name});
+ };
+ expose(assert_not_exists, "assert_not_exists");
+
+ function _assert_inherits(name) {
+ return function (object, property_name, description)
+ {
+ assert(typeof object === "object",
+ name, description,
+ "provided value is not an object");
+
+ assert("hasOwnProperty" in object,
+ name, description,
+ "provided value is an object but has no hasOwnProperty method");
+
+ assert(!object.hasOwnProperty(property_name),
+ name, description,
+ "property ${p} found on object expected in prototype chain",
+ {p:property_name});
+
+ assert(property_name in object,
+ name, description,
+ "property ${p} not found in prototype chain",
+ {p:property_name});
+ };
+ }
+ expose(_assert_inherits("assert_inherits"), "assert_inherits");
+ expose(_assert_inherits("assert_idl_attribute"), "assert_idl_attribute");
+
+ function assert_readonly(object, property_name, description)
+ {
+ var initial_value = object[property_name];
+ try {
+ //Note that this can have side effects in the case where
+ //the property has PutForwards
+ object[property_name] = initial_value + "a"; //XXX use some other value here?
+ assert(same_value(object[property_name], initial_value),
+ "assert_readonly", description,
+ "changing property ${p} succeeded",
+ {p:property_name});
+ }
+ finally
+ {
+ object[property_name] = initial_value;
+ }
+ };
+ expose(assert_readonly, "assert_readonly");
+
+ function assert_throws(code, func, description)
+ {
+ try
+ {
+ func.call(this);
+ assert(false, "assert_throws", description,
+ "${func} did not throw", {func:func});
+ }
+ catch(e)
+ {
+ if (e instanceof AssertionError) {
+ throw(e);
+ }
+ if (code === null)
+ {
+ return;
+ }
+ if (typeof code === "object")
+ {
+ assert(typeof e == "object" && "name" in e && e.name == code.name,
+ "assert_throws", description,
+ "${func} threw ${actual} (${actual_name}) expected ${expected} (${expected_name})",
+ {func:func, actual:e, actual_name:e.name,
+ expected:code,
+ expected_name:code.name});
+ return;
+ }
+
+ var code_name_map = {
+ INDEX_SIZE_ERR: 'IndexSizeError',
+ HIERARCHY_REQUEST_ERR: 'HierarchyRequestError',
+ WRONG_DOCUMENT_ERR: 'WrongDocumentError',
+ INVALID_CHARACTER_ERR: 'InvalidCharacterError',
+ NO_MODIFICATION_ALLOWED_ERR: 'NoModificationAllowedError',
+ NOT_FOUND_ERR: 'NotFoundError',
+ NOT_SUPPORTED_ERR: 'NotSupportedError',
+ INVALID_STATE_ERR: 'InvalidStateError',
+ SYNTAX_ERR: 'SyntaxError',
+ INVALID_MODIFICATION_ERR: 'InvalidModificationError',
+ NAMESPACE_ERR: 'NamespaceError',
+ INVALID_ACCESS_ERR: 'InvalidAccessError',
+ TYPE_MISMATCH_ERR: 'TypeMismatchError',
+ SECURITY_ERR: 'SecurityError',
+ NETWORK_ERR: 'NetworkError',
+ ABORT_ERR: 'AbortError',
+ URL_MISMATCH_ERR: 'URLMismatchError',
+ QUOTA_EXCEEDED_ERR: 'QuotaExceededError',
+ TIMEOUT_ERR: 'TimeoutError',
+ INVALID_NODE_TYPE_ERR: 'InvalidNodeTypeError',
+ DATA_CLONE_ERR: 'DataCloneError'
+ };
+
+ var name = code in code_name_map ? code_name_map[code] : code;
+
+ var name_code_map = {
+ IndexSizeError: 1,
+ HierarchyRequestError: 3,
+ WrongDocumentError: 4,
+ InvalidCharacterError: 5,
+ NoModificationAllowedError: 7,
+ NotFoundError: 8,
+ NotSupportedError: 9,
+ InvalidStateError: 11,
+ SyntaxError: 12,
+ InvalidModificationError: 13,
+ NamespaceError: 14,
+ InvalidAccessError: 15,
+ TypeMismatchError: 17,
+ SecurityError: 18,
+ NetworkError: 19,
+ AbortError: 20,
+ URLMismatchError: 21,
+ QuotaExceededError: 22,
+ TimeoutError: 23,
+ InvalidNodeTypeError: 24,
+ DataCloneError: 25,
+
+ UnknownError: 0,
+ ConstraintError: 0,
+ DataError: 0,
+ TransactionInactiveError: 0,
+ ReadOnlyError: 0,
+ VersionError: 0
+ };
+
+ if (!(name in name_code_map))
+ {
+ throw new AssertionError('Test bug: unrecognized DOMException code "' + code + '" passed to assert_throws()');
+ }
+
+ var required_props = { code: name_code_map[name] };
+
+ if (required_props.code === 0
+ || ("name" in e && e.name !== e.name.toUpperCase() && e.name !== "DOMException"))
+ {
+ // New style exception: also test the name property.
+ required_props.name = name;
+ }
+
+ //We'd like to test that e instanceof the appropriate interface,
+ //but we can't, because we don't know what window it was created
+ //in. It might be an instanceof the appropriate interface on some
+ //unknown other window. TODO: Work around this somehow?
+
+ assert(typeof e == "object",
+ "assert_throws", description,
+ "${func} threw ${e} with type ${type}, not an object",
+ {func:func, e:e, type:typeof e});
+
+ for (var prop in required_props)
+ {
+ assert(typeof e == "object" && prop in e && e[prop] == required_props[prop],
+ "assert_throws", description,
+ "${func} threw ${e} that is not a DOMException " + code + ": property ${prop} is equal to ${actual}, expected ${expected}",
+ {func:func, e:e, prop:prop, actual:e[prop], expected:required_props[prop]});
+ }
+ }
+ }
+ expose(assert_throws, "assert_throws");
+
+ function assert_unreached(description) {
+ assert(false, "assert_unreached", description,
+ "Reached unreachable code");
+ }
+ expose(assert_unreached, "assert_unreached");
+
+ function assert_any(assert_func, actual, expected_array)
+ {
+ var args = [].slice.call(arguments, 3)
+ var errors = []
+ var passed = false;
+ forEach(expected_array,
+ function(expected)
+ {
+ try {
+ assert_func.apply(this, [actual, expected].concat(args))
+ passed = true;
+ } catch(e) {
+ errors.push(e.message);
+ }
+ });
+ if (!passed) {
+ throw new AssertionError(errors.join("\n\n"));
+ }
+ }
+ expose(assert_any, "assert_any");
+
+ function Test(name, properties)
+ {
+ this.name = name;
+ this.status = this.NOTRUN;
+ this.timeout_id = null;
+ this.is_done = false;
+
+ this.properties = properties;
+ this.timeout_length = properties.timeout ? properties.timeout : settings.test_timeout;
+
+ this.message = null;
+
+ var this_obj = this;
+ this.steps = [];
+
+ tests.push(this);
+ }
+
+ Test.statuses = {
+ PASS:0,
+ FAIL:1,
+ TIMEOUT:2,
+ NOTRUN:3
+ };
+
+ Test.prototype = merge({}, Test.statuses);
+
+ Test.prototype.structured_clone = function()
+ {
+ if(!this._structured_clone)
+ {
+ var msg = this.message;
+ msg = msg ? String(msg) : msg;
+ this._structured_clone = merge({
+ name:String(this.name),
+ status:this.status,
+ message:msg
+ }, Test.statuses);
+ }
+ return this._structured_clone;
+ };
+
+ Test.prototype.step = function(func, this_obj)
+ {
+ //In case the test has already failed
+ if (this.status !== this.NOTRUN)
+ {
+ return;
+ }
+
+ tests.started = true;
+
+ if (this.timeout_id === null) {
+ this.set_timeout();
+ }
+
+ this.steps.push(func);
+
+ if (arguments.length === 1)
+ {
+ this_obj = this;
+ }
+
+ try
+ {
+ return func.apply(this_obj, Array.prototype.slice.call(arguments, 2));
+ }
+ catch(e)
+ {
+ //This can happen if something called synchronously invoked another
+ //step
+ if (this.status !== this.NOTRUN)
+ {
+ return;
+ }
+ this.status = this.FAIL;
+ this.message = (typeof e === "object" && e !== null) ? e.message : e;
+ if (typeof e.stack != "undefined" && typeof e.message == "string") {
+ //Try to make it more informative for some exceptions, at least
+ //in Gecko and WebKit. This results in a stack dump instead of
+ //just errors like "Cannot read property 'parentNode' of null"
+ //or "root is null". Makes it a lot longer, of course.
+ this.message += "(stack: " + e.stack + ")";
+ }
+ this.done();
+ if (debug && e.constructor !== AssertionError) {
+ throw e;
+ }
+ }
+ };
+
+ Test.prototype.step_func = function(func, this_obj)
+ {
+ var test_this = this;
+
+ if (arguments.length === 1)
+ {
+ this_obj = test_this;
+ }
+
+ return function()
+ {
+ test_this.step.apply(test_this, [func, this_obj].concat(
+ Array.prototype.slice.call(arguments)));
+ };
+ };
+
+ Test.prototype.step_func_done = function(func, this_obj)
+ {
+ var test_this = this;
+
+ if (arguments.length === 1)
+ {
+ this_obj = test_this;
+ }
+
+ return function()
+ {
+ test_this.step.apply(test_this, [func, this_obj].concat(
+ Array.prototype.slice.call(arguments)));
+ test_this.done();
+ };
+ };
+
+ Test.prototype.set_timeout = function()
+ {
+ var this_obj = this;
+ this.timeout_id = setTimeout(function()
+ {
+ this_obj.timeout();
+ }, this.timeout_length);
+ };
+
+ Test.prototype.timeout = function()
+ {
+ this.status = this.TIMEOUT;
+ this.timeout_id = null;
+ this.message = "Test timed out";
+ this.done();
+ };
+
+ Test.prototype.done = function()
+ {
+ if (this.is_done) {
+ return;
+ }
+ clearTimeout(this.timeout_id);
+ if (this.status === this.NOTRUN)
+ {
+ this.status = this.PASS;
+ }
+ this.is_done = true;
+ tests.result(this);
+ };
+
+
+ /*
+ * Harness
+ */
+
+ function TestsStatus()
+ {
+ this.status = null;
+ this.message = null;
+ }
+
+ TestsStatus.statuses = {
+ OK:0,
+ ERROR:1,
+ TIMEOUT:2
+ };
+
+ TestsStatus.prototype = merge({}, TestsStatus.statuses);
+
+ TestsStatus.prototype.structured_clone = function()
+ {
+ if(!this._structured_clone)
+ {
+ var msg = this.message;
+ msg = msg ? String(msg) : msg;
+ this._structured_clone = merge({
+ status:this.status,
+ message:msg
+ }, TestsStatus.statuses);
+ }
+ return this._structured_clone;
+ };
+
+ function Tests()
+ {
+ this.tests = [];
+ this.num_pending = 0;
+
+ this.phases = {
+ INITIAL:0,
+ SETUP:1,
+ HAVE_TESTS:2,
+ HAVE_RESULTS:3,
+ COMPLETE:4
+ };
+ this.phase = this.phases.INITIAL;
+
+ this.properties = {};
+
+ //All tests can't be done until the load event fires
+ this.all_loaded = false;
+ this.wait_for_finish = false;
+ this.processing_callbacks = false;
+
+ this.timeout_length = settings.timeout;
+ this.timeout_id = null;
+
+ this.start_callbacks = [];
+ this.test_done_callbacks = [];
+ this.all_done_callbacks = [];
+
+ this.status = new TestsStatus();
+
+ var this_obj = this;
+
+ on_event(window, "load",
+ function()
+ {
+ this_obj.all_loaded = true;
+ if (this_obj.all_done())
+ {
+ this_obj.complete();
+ }
+ });
+
+ this.set_timeout();
+ }
+
+ Tests.prototype.setup = function(func, properties)
+ {
+ if (this.phase >= this.phases.HAVE_RESULTS)
+ {
+ return;
+ }
+ if (this.phase < this.phases.SETUP)
+ {
+ this.phase = this.phases.SETUP;
+ }
+
+ for (var p in properties)
+ {
+ if (properties.hasOwnProperty(p))
+ {
+ this.properties[p] = properties[p];
+ }
+ }
+
+ if (properties.timeout)
+ {
+ this.timeout_length = properties.timeout;
+ }
+ if (properties.explicit_done)
+ {
+ this.wait_for_finish = true;
+ }
+ if (properties.explicit_timeout) {
+ this.timeout_length = null;
+ }
+
+ if (func)
+ {
+ try
+ {
+ func();
+ } catch(e)
+ {
+ this.status.status = this.status.ERROR;
+ this.status.message = e;
+ };
+ }
+ this.set_timeout();
+ };
+
+ Tests.prototype.set_timeout = function()
+ {
+ var this_obj = this;
+ clearTimeout(this.timeout_id);
+ if (this.timeout_length !== null)
+ {
+ this.timeout_id = setTimeout(function() {
+ this_obj.timeout();
+ }, this.timeout_length);
+ }
+ };
+
+ Tests.prototype.timeout = function() {
+ this.status.status = this.status.TIMEOUT;
+ this.complete();
+ };
+
+ Tests.prototype.end_wait = function()
+ {
+ this.wait_for_finish = false;
+ if (this.all_done()) {
+ this.complete();
+ }
+ };
+
+ Tests.prototype.push = function(test)
+ {
+ if (this.phase < this.phases.HAVE_TESTS) {
+ this.start();
+ }
+ this.num_pending++;
+ this.tests.push(test);
+ };
+
+ Tests.prototype.all_done = function() {
+ return (this.all_loaded && this.num_pending === 0 &&
+ !this.wait_for_finish && !this.processing_callbacks);
+ };
+
+ Tests.prototype.start = function() {
+ this.phase = this.phases.HAVE_TESTS;
+ this.notify_start();
+ };
+
+ Tests.prototype.notify_start = function() {
+ var this_obj = this;
+ forEach (this.start_callbacks,
+ function(callback)
+ {
+ callback(this_obj.properties);
+ });
+ forEach_windows(
+ function(w, is_same_origin)
+ {
+ if(is_same_origin && w.start_callback)
+ {
+ try
+ {
+ w.start_callback(this_obj.properties);
+ }
+ catch(e)
+ {
+ if (debug)
+ {
+ throw(e);
+ }
+ }
+ }
+ if (supports_post_message(w) && w !== self)
+ {
+ w.postMessage({
+ type: "start",
+ properties: this_obj.properties
+ }, "*");
+ }
+ });
+ };
+
+ Tests.prototype.result = function(test)
+ {
+ if (this.phase > this.phases.HAVE_RESULTS)
+ {
+ return;
+ }
+ this.phase = this.phases.HAVE_RESULTS;
+ this.num_pending--;
+ this.notify_result(test);
+ };
+
+ Tests.prototype.notify_result = function(test) {
+ var this_obj = this;
+ this.processing_callbacks = true;
+ forEach(this.test_done_callbacks,
+ function(callback)
+ {
+ callback(test, this_obj);
+ });
+
+ forEach_windows(
+ function(w, is_same_origin)
+ {
+ if(is_same_origin && w.result_callback)
+ {
+ try
+ {
+ w.result_callback(test);
+ }
+ catch(e)
+ {
+ if(debug) {
+ throw e;
+ }
+ }
+ }
+ if (supports_post_message(w) && w !== self)
+ {
+ w.postMessage({
+ type: "result",
+ test: test.structured_clone()
+ }, "*");
+ }
+ });
+ this.processing_callbacks = false;
+ if (this_obj.all_done())
+ {
+ this_obj.complete();
+ }
+ };
+
+ Tests.prototype.complete = function() {
+ if (this.phase === this.phases.COMPLETE) {
+ return;
+ }
+ this.phase = this.phases.COMPLETE;
+ var this_obj = this;
+ this.tests.forEach(
+ function(x)
+ {
+ if(x.status === x.NOTRUN)
+ {
+ this_obj.notify_result(x);
+ }
+ }
+ );
+ this.notify_complete();
+ };
+
+ Tests.prototype.notify_complete = function()
+ {
+ clearTimeout(this.timeout_id);
+ var this_obj = this;
+ var tests = map(this_obj.tests,
+ function(test)
+ {
+ return test.structured_clone();
+ });
+ if (this.status.status === null)
+ {
+ this.status.status = this.status.OK;
+ }
+
+ forEach (this.all_done_callbacks,
+ function(callback)
+ {
+ callback(this_obj.tests, this_obj.status);
+ });
+
+ forEach_windows(
+ function(w, is_same_origin)
+ {
+ if(is_same_origin && w.completion_callback)
+ {
+ try
+ {
+ w.completion_callback(this_obj.tests, this_obj.status);
+ }
+ catch(e)
+ {
+ if (debug)
+ {
+ throw e;
+ }
+ }
+ }
+ if (supports_post_message(w) && w !== self)
+ {
+ w.postMessage({
+ type: "complete",
+ tests: tests,
+ status: this_obj.status.structured_clone()
+ }, "*");
+ }
+ });
+ };
+
+ var tests = new Tests();
+
+ function timeout() {
+ if (tests.timeout_length === null)
+ {
+ tests.timeout();
+ }
+ }
+ expose(timeout, 'timeout');
+
+ function add_start_callback(callback) {
+ tests.start_callbacks.push(callback);
+ }
+
+ function add_result_callback(callback)
+ {
+ tests.test_done_callbacks.push(callback);
+ }
+
+ function add_completion_callback(callback)
+ {
+ tests.all_done_callbacks.push(callback);
+ }
+
+ expose(add_start_callback, 'add_start_callback');
+ expose(add_result_callback, 'add_result_callback');
+ expose(add_completion_callback, 'add_completion_callback');
+
+ /*
+ * Output listener
+ */
+
+ function Output() {
+ this.output_document = document;
+ this.output_node = null;
+ this.done_count = 0;
+ this.enabled = settings.output;
+ this.phase = this.INITIAL;
+ }
+
+ Output.prototype.INITIAL = 0;
+ Output.prototype.STARTED = 1;
+ Output.prototype.HAVE_RESULTS = 2;
+ Output.prototype.COMPLETE = 3;
+
+ Output.prototype.setup = function(properties) {
+ if (this.phase > this.INITIAL) {
+ return;
+ }
+
+ //If output is disabled in testharnessreport.js the test shouldn't be
+ //able to override that
+ this.enabled = this.enabled && (properties.hasOwnProperty("output") ?
+ properties.output : settings.output);
+ };
+
+ Output.prototype.init = function(properties)
+ {
+ if (this.phase >= this.STARTED) {
+ return;
+ }
+ if (properties.output_document) {
+ this.output_document = properties.output_document;
+ } else {
+ this.output_document = document;
+ }
+ this.phase = this.STARTED;
+ };
+
+ Output.prototype.resolve_log = function()
+ {
+ var output_document;
+ if (typeof this.output_document === "function")
+ {
+ output_document = this.output_document.apply(undefined);
+ } else
+ {
+ output_document = this.output_document;
+ }
+ if (!output_document)
+ {
+ return;
+ }
+ var node = output_document.getElementById("log");
+ if (node)
+ {
+ this.output_document = output_document;
+ this.output_node = node;
+ }
+ };
+
+ Output.prototype.show_status = function(test)
+ {
+ if (this.phase < this.STARTED)
+ {
+ this.init();
+ }
+ if (!this.enabled)
+ {
+ return;
+ }
+ if (this.phase < this.HAVE_RESULTS)
+ {
+ this.resolve_log();
+ this.phase = this.HAVE_RESULTS;
+ }
+ this.done_count++;
+ if (this.output_node)
+ {
+ if (this.done_count < 100
+ || (this.done_count < 1000 && this.done_count % 100 == 0)
+ || this.done_count % 1000 == 0) {
+ this.output_node.textContent = "Running, "
+ + this.done_count + " complete, "
+ + tests.num_pending + " remain";
+ }
+ }
+ };
+
+ Output.prototype.show_results = function (tests, harness_status)
+ {
+ if (this.phase >= this.COMPLETE) {
+ return;
+ }
+ if (!this.enabled)
+ {
+ return;
+ }
+ if (!this.output_node) {
+ this.resolve_log();
+ }
+ this.phase = this.COMPLETE;
+
+ var log = this.output_node;
+ if (!log)
+ {
+ return;
+ }
+ var output_document = this.output_document;
+
+ while (log.lastChild)
+ {
+ log.removeChild(log.lastChild);
+ }
+
+ if (script_prefix != null) {
+ var stylesheet = output_document.createElementNS(xhtml_ns, "link");
+ stylesheet.setAttribute("rel", "stylesheet");
+ stylesheet.setAttribute("href", script_prefix + "testharness.css");
+ var heads = output_document.getElementsByTagName("head");
+ if (heads.length) {
+ heads[0].appendChild(stylesheet);
+ }
+ }
+
+ var status_text = {};
+ status_text[Test.prototype.PASS] = "Pass";
+ status_text[Test.prototype.FAIL] = "Fail";
+ status_text[Test.prototype.TIMEOUT] = "Timeout";
+ status_text[Test.prototype.NOTRUN] = "Not Run";
+
+ var status_number = {};
+ forEach(tests, function(test) {
+ var status = status_text[test.status];
+ if (status_number.hasOwnProperty(status))
+ {
+ status_number[status] += 1;
+ } else {
+ status_number[status] = 1;
+ }
+ });
+
+ function status_class(status)
+ {
+ return status.replace(/\s/g, '').toLowerCase();
+ }
+
+ var summary_template = ["section", {"id":"summary"},
+ ["h2", {}, "Summary"],
+ ["p", {}, "Found ${num_tests} tests"],
+ function(vars) {
+ var rv = [["div", {}]];
+ var i=0;
+ while (status_text.hasOwnProperty(i)) {
+ if (status_number.hasOwnProperty(status_text[i])) {
+ var status = status_text[i];
+ rv[0].push(["div", {"class":status_class(status)},
+ ["label", {},
+ ["input", {type:"checkbox", checked:"checked"}],
+ status_number[status] + " " + status]]);
+ }
+ i++;
+ }
+ return rv;
+ }];
+
+ log.appendChild(render(summary_template, {num_tests:tests.length}, output_document));
+
+ forEach(output_document.querySelectorAll("section#summary label"),
+ function(element)
+ {
+ on_event(element, "click",
+ function(e)
+ {
+ if (output_document.getElementById("results") === null)
+ {
+ e.preventDefault();
+ return;
+ }
+ var result_class = element.parentNode.getAttribute("class");
+ var style_element = output_document.querySelector("style#hide-" + result_class);
+ var input_element = element.querySelector("input");
+ if (!style_element && !input_element.checked) {
+ style_element = output_document.createElementNS(xhtml_ns, "style");
+ style_element.id = "hide-" + result_class;
+ style_element.textContent = "table#results > tbody > tr."+result_class+"{display:none}";
+ output_document.body.appendChild(style_element);
+ } else if (style_element && input_element.checked) {
+ style_element.parentNode.removeChild(style_element);
+ }
+ });
+ });
+
+ // This use of innerHTML plus manual escaping is not recommended in
+ // general, but is necessary here for performance. Using textContent
+ // on each individual <td> adds tens of seconds of execution time for
+ // large test suites (tens of thousands of tests).
+ function escape_html(s)
+ {
+ return s.replace(/\&/g, "&")
+ .replace(/</g, "<")
+ .replace(/"/g, """)
+ .replace(/'/g, "'");
+ }
+
+ function has_assertions()
+ {
+ for (var i = 0; i < tests.length; i++) {
+ if (tests[i].properties.hasOwnProperty("assert")) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ function get_assertion(test)
+ {
+ if (test.properties.hasOwnProperty("assert")) {
+ if (Array.isArray(test.properties.assert)) {
+ return test.properties.assert.join(' ');
+ }
+ return test.properties.assert;
+ }
+ return '';
+ }
+
+ log.appendChild(document.createElementNS(xhtml_ns, "section"));
+ var assertions = has_assertions();
+ var html = "<h2>Details</h2><table id='results' " + (assertions ? "class='assertions'" : "" ) + ">"
+ + "<thead><tr><th>Result</th><th>Test Name</th>"
+ + (assertions ? "<th>Assertion</th>" : "")
+ + "<th>Message</th></tr></thead>"
+ + "<tbody>";
+ for (var i = 0; i < tests.length; i++) {
+ html += '<tr class="'
+ + escape_html(status_class(status_text[tests[i].status]))
+ + '"><td>'
+ + escape_html(status_text[tests[i].status])
+ + "</td><td>"
+ + escape_html(tests[i].name)
+ + "</td><td>"
+ + (assertions ? escape_html(get_assertion(tests[i])) + "</td><td>" : "")
+ + escape_html(tests[i].message ? tests[i].message : " ")
+ + "</td></tr>";
+ }
+ html += "</tbody></table>";
+ try {
+ log.lastChild.innerHTML = html;
+ } catch (e) {
+ log.appendChild(document.createElementNS(xhtml_ns, "p"))
+ .textContent = "Setting innerHTML for the log threw an exception.";
+ log.appendChild(document.createElementNS(xhtml_ns, "pre"))
+ .textContent = html;
+ }
+ };
+
+ var output = new Output();
+ add_start_callback(function (properties) {output.init(properties);});
+ add_result_callback(function (test) {output.show_status(tests);});
+ add_completion_callback(function (tests, harness_status) {output.show_results(tests, harness_status);});
+
+ /*
+ * Template code
+ *
+ * A template is just a javascript structure. An element is represented as:
+ *
+ * [tag_name, {attr_name:attr_value}, child1, child2]
+ *
+ * the children can either be strings (which act like text nodes), other templates or
+ * functions (see below)
+ *
+ * A text node is represented as
+ *
+ * ["{text}", value]
+ *
+ * String values have a simple substitution syntax; ${foo} represents a variable foo.
+ *
+ * It is possible to embed logic in templates by using a function in a place where a
+ * node would usually go. The function must either return part of a template or null.
+ *
+ * In cases where a set of nodes are required as output rather than a single node
+ * with children it is possible to just use a list
+ * [node1, node2, node3]
+ *
+ * Usage:
+ *
+ * render(template, substitutions) - take a template and an object mapping
+ * variable names to parameters and return either a DOM node or a list of DOM nodes
+ *
+ * substitute(template, substitutions) - take a template and variable mapping object,
+ * make the variable substitutions and return the substituted template
+ *
+ */
+
+ function is_single_node(template)
+ {
+ return typeof template[0] === "string";
+ }
+
+ function substitute(template, substitutions)
+ {
+ if (typeof template === "function") {
+ var replacement = template(substitutions);
+ if (replacement)
+ {
+ var rv = substitute(replacement, substitutions);
+ return rv;
+ }
+ else
+ {
+ return null;
+ }
+ }
+ else if (is_single_node(template))
+ {
+ return substitute_single(template, substitutions);
+ }
+ else
+ {
+ return filter(map(template, function(x) {
+ return substitute(x, substitutions);
+ }), function(x) {return x !== null;});
+ }
+ }
+
+ function substitute_single(template, substitutions)
+ {
+ var substitution_re = /\${([^ }]*)}/g;
+
+ function do_substitution(input) {
+ var components = input.split(substitution_re);
+ var rv = [];
+ for (var i=0; i<components.length; i+=2)
+ {
+ rv.push(components[i]);
+ if (components[i+1])
+ {
+ rv.push(String(substitutions[components[i+1]]));
+ }
+ }
+ return rv;
+ }
+
+ var rv = [];
+ rv.push(do_substitution(String(template[0])).join(""));
+
+ if (template[0] === "{text}") {
+ substitute_children(template.slice(1), rv);
+ } else {
+ substitute_attrs(template[1], rv);
+ substitute_children(template.slice(2), rv);
+ }
+
+ function substitute_attrs(attrs, rv)
+ {
+ rv[1] = {};
+ for (var name in template[1])
+ {
+ if (attrs.hasOwnProperty(name))
+ {
+ var new_name = do_substitution(name).join("");
+ var new_value = do_substitution(attrs[name]).join("");
+ rv[1][new_name] = new_value;
+ };
+ }
+ }
+
+ function substitute_children(children, rv)
+ {
+ for (var i=0; i<children.length; i++)
+ {
+ if (children[i] instanceof Object) {
+ var replacement = substitute(children[i], substitutions);
+ if (replacement !== null)
+ {
+ if (is_single_node(replacement))
+ {
+ rv.push(replacement);
+ }
+ else
+ {
+ extend(rv, replacement);
+ }
+ }
+ }
+ else
+ {
+ extend(rv, do_substitution(String(children[i])));
+ }
+ }
+ return rv;
+ }
+
+ return rv;
+ }
+
+ function make_dom_single(template, doc)
+ {
+ var output_document = doc || document;
+ if (template[0] === "{text}")
+ {
+ var element = output_document.createTextNode("");
+ for (var i=1; i<template.length; i++)
+ {
+ element.data += template[i];
+ }
+ }
+ else
+ {
+ var element = output_document.createElementNS(xhtml_ns, template[0]);
+ for (var name in template[1]) {
+ if (template[1].hasOwnProperty(name))
+ {
+ element.setAttribute(name, template[1][name]);
+ }
+ }
+ for (var i=2; i<template.length; i++)
+ {
+ if (template[i] instanceof Object)
+ {
+ var sub_element = make_dom(template[i]);
+ element.appendChild(sub_element);
+ }
+ else
+ {
+ var text_node = output_document.createTextNode(template[i]);
+ element.appendChild(text_node);
+ }
+ }
+ }
+
+ return element;
+ }
+
+
+
+ function make_dom(template, substitutions, output_document)
+ {
+ if (is_single_node(template))
+ {
+ return make_dom_single(template, output_document);
+ }
+ else
+ {
+ return map(template, function(x) {
+ return make_dom_single(x, output_document);
+ });
+ }
+ }
+
+ function render(template, substitutions, output_document)
+ {
+ return make_dom(substitute(template, substitutions), output_document);
+ }
+
+ /*
+ * Utility funcions
+ */
+ function assert(expected_true, function_name, description, error, substitutions)
+ {
+ if (expected_true !== true)
+ {
+ throw new AssertionError(make_message(function_name, description,
+ error, substitutions));
+ }
+ }
+
+ function AssertionError(message)
+ {
+ this.message = message;
+ }
+
+ function make_message(function_name, description, error, substitutions)
+ {
+ for (var p in substitutions) {
+ if (substitutions.hasOwnProperty(p)) {
+ substitutions[p] = format_value(substitutions[p]);
+ }
+ }
+ var node_form = substitute(["{text}", "${function_name}: ${description}" + error],
+ merge({function_name:function_name,
+ description:(description?description + " ":"")},
+ substitutions));
+ return node_form.slice(1).join("");
+ }
+
+ function filter(array, callable, thisObj) {
+ var rv = [];
+ for (var i=0; i<array.length; i++)
+ {
+ if (array.hasOwnProperty(i))
+ {
+ var pass = callable.call(thisObj, array[i], i, array);
+ if (pass) {
+ rv.push(array[i]);
+ }
+ }
+ }
+ return rv;
+ }
+
+ function map(array, callable, thisObj)
+ {
+ var rv = [];
+ rv.length = array.length;
+ for (var i=0; i<array.length; i++)
+ {
+ if (array.hasOwnProperty(i))
+ {
+ rv[i] = callable.call(thisObj, array[i], i, array);
+ }
+ }
+ return rv;
+ }
+
+ function extend(array, items)
+ {
+ Array.prototype.push.apply(array, items);
+ }
+
+ function forEach (array, callback, thisObj)
+ {
+ for (var i=0; i<array.length; i++)
+ {
+ if (array.hasOwnProperty(i))
+ {
+ callback.call(thisObj, array[i], i, array);
+ }
+ }
+ }
+
+ function merge(a,b)
+ {
+ var rv = {};
+ var p;
+ for (p in a)
+ {
+ rv[p] = a[p];
+ }
+ for (p in b) {
+ rv[p] = b[p];
+ }
+ return rv;
+ }
+
+ function expose(object, name)
+ {
+ var components = name.split(".");
+ var target = window;
+ for (var i=0; i<components.length - 1; i++)
+ {
+ if (!(components[i] in target))
+ {
+ target[components[i]] = {};
+ }
+ target = target[components[i]];
+ }
+ target[components[components.length - 1]] = object;
+ }
+
+ function forEach_windows(callback) {
+ // Iterate of the the windows [self ... top, opener]. The callback is passed
+ // two objects, the first one is the windows object itself, the second one
+ // is a boolean indicating whether or not its on the same origin as the
+ // current window.
+ var cache = forEach_windows.result_cache;
+ if (!cache) {
+ cache = [[self, true]];
+ var w = self;
+ var i = 0;
+ var so;
+ var origins = location.ancestorOrigins;
+ while (w != w.parent)
+ {
+ w = w.parent;
+ // In WebKit, calls to parent windows' properties that aren't on the same
+ // origin cause an error message to be displayed in the error console but
+ // don't throw an exception. This is a deviation from the current HTML5
+ // spec. See: https://bugs.webkit.org/show_bug.cgi?id=43504
+ // The problem with WebKit's behavior is that it pollutes the error console
+ // with error messages that can't be caught.
+ //
+ // This issue can be mitigated by relying on the (for now) proprietary
+ // `location.ancestorOrigins` property which returns an ordered list of
+ // the origins of enclosing windows. See:
+ // http://trac.webkit.org/changeset/113945.
+ if(origins) {
+ so = (location.origin == origins[i]);
+ }
+ else
+ {
+ so = is_same_origin(w);
+ }
+ cache.push([w, so]);
+ i++;
+ }
+ w = window.opener;
+ if(w)
+ {
+ // window.opener isn't included in the `location.ancestorOrigins` prop.
+ // We'll just have to deal with a simple check and an error msg on WebKit
+ // browsers in this case.
+ cache.push([w, is_same_origin(w)]);
+ }
+ forEach_windows.result_cache = cache;
+ }
+
+ forEach(cache,
+ function(a)
+ {
+ callback.apply(null, a);
+ });
+ }
+
+ function is_same_origin(w) {
+ try {
+ 'random_prop' in w;
+ return true;
+ } catch(e) {
+ return false;
+ }
+ }
+
+ function supports_post_message(w)
+ {
+ var supports;
+ var type;
+ // Given IE implements postMessage across nested iframes but not across
+ // windows or tabs, you can't infer cross-origin communication from the presence
+ // of postMessage on the current window object only.
+ //
+ // Touching the postMessage prop on a window can throw if the window is
+ // not from the same origin AND post message is not supported in that
+ // browser. So just doing an existence test here won't do, you also need
+ // to wrap it in a try..cacth block.
+ try
+ {
+ type = typeof w.postMessage;
+ if (type === "function")
+ {
+ supports = true;
+ }
+ // IE8 supports postMessage, but implements it as a host object which
+ // returns "object" as its `typeof`.
+ else if (type === "object")
+ {
+ supports = true;
+ }
+ // This is the case where postMessage isn't supported AND accessing a
+ // window property across origins does NOT throw (e.g. old Safari browser).
+ else
+ {
+ supports = false;
+ }
+ }
+ catch(e) {
+ // This is the case where postMessage isn't supported AND accessing a
+ // window property across origins throws (e.g. old Firefox browser).
+ supports = false;
+ }
+ return supports;
+ }
+})();
+
+// vim: set expandtab shiftwidth=4 tabstop=4:
--- /dev/null
+/*
+ * This file is intended for vendors to implement
+ * code needed to integrate testharness.js tests with their own test systems.
+ *
+ * The default implementation extracts metadata from the tests and validates
+ * it against the cached version that should be present in the test source
+ * file. If the cache is not found or is out of sync, source code suitable for
+ * caching the metadata is optionally generated.
+ *
+ * The cached metadata is present for extraction by test processing tools that
+ * are unable to execute javascript.
+ *
+ * Metadata is attached to tests via the properties parameter in the test
+ * constructor. See testharness.js for details.
+ *
+ * Typically test system integration will attach callbacks when each test has
+ * run, using add_result_callback(callback(test)), or when the whole test file
+ * has completed, using
+ * add_completion_callback(callback(tests, harness_status)).
+ *
+ * For more documentation about the callback functions and the
+ * parameters they are called with see testharness.js
+ */
+
+
+
+var metadata_generator = {
+
+ currentMetadata: {},
+ cachedMetadata: false,
+ metadataProperties: ['help', 'assert', 'author'],
+
+ error: function(message) {
+ var messageElement = document.createElement('p');
+ messageElement.setAttribute('class', 'error');
+ this.appendText(messageElement, message);
+
+ var summary = document.getElementById('summary');
+ if (summary) {
+ summary.parentNode.insertBefore(messageElement, summary);
+ }
+ else {
+ document.body.appendChild(messageElement);
+ }
+ },
+
+ /**
+ * Ensure property value has contact information
+ */
+ validateContact: function(test, propertyName) {
+ var result = true;
+ var value = test.properties[propertyName];
+ var values = Array.isArray(value) ? value : [value];
+ for (var index = 0; index < values.length; index++) {
+ value = values[index];
+ var re = /(\S+)(\s*)<(.*)>(.*)/;
+ if (! re.test(value)) {
+ re = /(\S+)(\s+)(http[s]?:\/\/)(.*)/
+ if (! re.test(value)) {
+ this.error('Metadata property "' + propertyName +
+ '" for test: "' + test.name +
+ '" must have name and contact information ' +
+ '("name <email>" or "name http(s)://")');
+ result = false;
+ }
+ }
+ }
+ return result;
+ },
+
+ /**
+ * Extract metadata from test object
+ */
+ extractFromTest: function(test) {
+ var testMetadata = {};
+ // filter out metadata from other properties in test
+ for (var metaIndex = 0; metaIndex < this.metadataProperties.length;
+ metaIndex++) {
+ var meta = this.metadataProperties[metaIndex];
+ if (test.properties.hasOwnProperty(meta)) {
+ if ('author' == meta) {
+ this.validateContact(test, meta);
+ }
+ testMetadata[meta] = test.properties[meta];
+ }
+ }
+ return testMetadata;
+ },
+
+ /**
+ * Compare cached metadata to extracted metadata
+ */
+ validateCache: function() {
+ for (var testName in this.currentMetadata) {
+ if (! this.cachedMetadata.hasOwnProperty(testName)) {
+ return false;
+ }
+ var testMetadata = this.currentMetadata[testName];
+ var cachedTestMetadata = this.cachedMetadata[testName];
+ delete this.cachedMetadata[testName];
+
+ for (var metaIndex = 0; metaIndex < this.metadataProperties.length;
+ metaIndex++) {
+ var meta = this.metadataProperties[metaIndex];
+ if (cachedTestMetadata.hasOwnProperty(meta) &&
+ testMetadata.hasOwnProperty(meta)) {
+ if (Array.isArray(cachedTestMetadata[meta])) {
+ if (! Array.isArray(testMetadata[meta])) {
+ return false;
+ }
+ if (cachedTestMetadata[meta].length ==
+ testMetadata[meta].length) {
+ for (var index = 0;
+ index < cachedTestMetadata[meta].length;
+ index++) {
+ if (cachedTestMetadata[meta][index] !=
+ testMetadata[meta][index]) {
+ return false;
+ }
+ }
+ }
+ else {
+ return false;
+ }
+ }
+ else {
+ if (Array.isArray(testMetadata[meta])) {
+ return false;
+ }
+ if (cachedTestMetadata[meta] != testMetadata[meta]) {
+ return false;
+ }
+ }
+ }
+ else if (cachedTestMetadata.hasOwnProperty(meta) ||
+ testMetadata.hasOwnProperty(meta)) {
+ return false;
+ }
+ }
+ }
+ for (var testName in this.cachedMetadata) {
+ return false;
+ }
+ return true;
+ },
+
+ appendText: function(elemement, text) {
+ elemement.appendChild(document.createTextNode(text));
+ },
+
+ jsonifyArray: function(arrayValue, indent) {
+ var output = '[';
+
+ if (1 == arrayValue.length) {
+ output += JSON.stringify(arrayValue[0]);
+ }
+ else {
+ for (var index = 0; index < arrayValue.length; index++) {
+ if (0 < index) {
+ output += ',\n ' + indent;
+ }
+ output += JSON.stringify(arrayValue[index]);
+ }
+ }
+ output += ']';
+ return output;
+ },
+
+ jsonifyObject: function(objectValue, indent) {
+ var output = '{';
+
+ var count = 0;
+ for (var property in objectValue) {
+ ++count;
+ if (Array.isArray(objectValue[property]) ||
+ ('object' == typeof(value))) {
+ ++count;
+ }
+ }
+ if (1 == count) {
+ for (var property in objectValue) {
+ output += ' "' + property + '": '
+ + JSON.stringify(objectValue[property])
+ + ' ';
+ }
+ }
+ else {
+ var first = true;
+ for (var property in objectValue) {
+ if (! first) {
+ output += ',';
+ }
+ first = false;
+ output += '\n ' + indent + '"' + property + '": ';
+ var value = objectValue[property];
+ if (Array.isArray(value)) {
+ output += this.jsonifyArray(value, indent +
+ ' '.substr(0, 5 + property.length));
+ }
+ else if ('object' == typeof(value)) {
+ output += this.jsonifyObject(value, indent + ' ');
+ }
+ else {
+ output += JSON.stringify(value);
+ }
+ }
+ if (1 < output.length) {
+ output += '\n' + indent;
+ }
+ }
+ output += '}';
+ return output;
+ },
+
+ /**
+ * Generate javascript source code for captured metadata
+ * Metadata is in pretty-printed JSON format
+ */
+ generateSource: function() {
+ var source =
+ '<script id="metadata_cache">/*\n' +
+ this.jsonifyObject(this.currentMetadata, '') + '\n' +
+ '*/</script>\n';
+ return source;
+ },
+
+ /**
+ * Add element containing metadata source code
+ */
+ addSourceElement: function(event) {
+ var sourceWrapper = document.createElement('div');
+ sourceWrapper.setAttribute('id', 'metadata_source');
+
+ var instructions = document.createElement('p');
+ if (this.cachedMetadata) {
+ this.appendText(instructions,
+ 'Replace the existing <script id="metadata_cache"> element ' +
+ 'in the test\'s <head> with the following:');
+ }
+ else {
+ this.appendText(instructions,
+ 'Copy the following into the <head> element of the test ' +
+ 'or the test\'s metadata sidecar file:');
+ }
+ sourceWrapper.appendChild(instructions);
+
+ var sourceElement = document.createElement('pre');
+ this.appendText(sourceElement, this.generateSource());
+
+ sourceWrapper.appendChild(sourceElement);
+
+ var messageElement = document.getElementById('metadata_issue');
+ messageElement.parentNode.insertBefore(sourceWrapper,
+ messageElement.nextSibling);
+ messageElement.parentNode.removeChild(messageElement);
+
+ (event.preventDefault) ? event.preventDefault() :
+ event.returnValue = false;
+ },
+
+ /**
+ * Extract the metadata cache from the cache element if present
+ */
+ getCachedMetadata: function() {
+ var cacheElement = document.getElementById('metadata_cache');
+
+ if (cacheElement) {
+ var cacheText = cacheElement.firstChild.nodeValue;
+ var openBrace = cacheText.indexOf('{');
+ var closeBrace = cacheText.lastIndexOf('}');
+ if ((-1 < openBrace) && (-1 < closeBrace)) {
+ cacheText = cacheText.slice(openBrace, closeBrace + 1);
+ try {
+ this.cachedMetadata = JSON.parse(cacheText);
+ }
+ catch (exc) {
+ this.cachedMetadata = 'Invalid JSON in Cached metadata. ';
+ }
+ }
+ else {
+ this.cachedMetadata = 'Metadata not found in cache element. ';
+ }
+ }
+ },
+
+ /**
+ * Main entry point, extract metadata from tests, compare to cached version
+ * if present.
+ * If cache not present or differs from extrated metadata, generate an error
+ */
+ process: function(tests, harness_status) {
+ for (var index = 0; index < tests.length; index++) {
+ var test = tests[index];
+ if (this.currentMetadata.hasOwnProperty(test.name)) {
+ this.error('Duplicate test name: ' + test.name);
+ }
+ else {
+ this.currentMetadata[test.name] = this.extractFromTest(test);
+ }
+ }
+
+ this.getCachedMetadata();
+
+ var message = null;
+ var messageClass = 'warning';
+ var showSource = false;
+
+ if (0 == tests.length) {
+ if (this.cachedMetadata) {
+ message = 'Cached metadata present but no tests. ';
+ }
+ }
+ else if (1 == tests.length) {
+ if (this.cachedMetadata) {
+ message = 'Single test files should not have cached metadata. ';
+ }
+ else {
+ var testMetadata = this.currentMetadata[tests[0].name];
+ var hasMetadata = false;
+ for (var meta in testMetadata) {
+ hasMetadata |= testMetadata.hasOwnProperty(meta);
+ }
+ if (hasMetadata) {
+ message = 'Single tests should not have metadata. ' +
+ 'Move metadata to <head>. ';
+ }
+ }
+ }
+ else {
+ if (this.cachedMetadata) {
+ messageClass = 'error';
+ if ('string' == typeof(this.cachedMetadata)) {
+ message = this.cachedMetadata;
+ showSource = true;
+ }
+ else if (! this.validateCache()) {
+ message = 'Cached metadata out of sync. ';
+ showSource = true;
+ }
+ }
+ }
+
+ if (message) {
+ var messageElement = document.createElement('p');
+ messageElement.setAttribute('id', 'metadata_issue');
+ messageElement.setAttribute('class', messageClass);
+ this.appendText(messageElement, message);
+
+ if (showSource) {
+ var link = document.createElement('a');
+ this.appendText(link, 'Click for source code.');
+ link.setAttribute('href', '#');
+ link.setAttribute('onclick',
+ 'metadata_generator.addSourceElement(event)');
+ messageElement.appendChild(link);
+ }
+
+ var summary = document.getElementById('summary');
+ if (summary) {
+ summary.parentNode.insertBefore(messageElement, summary);
+ }
+ else {
+ var log = document.getElementById('log');
+ if (log) {
+ log.appendChild(messageElement);
+ }
+ }
+ }
+ },
+
+ setup: function() {
+ add_completion_callback(
+ function (tests, harness_status) {
+ metadata_generator.process(tests, harness_status)
+ });
+ }
+}
+
+metadata_generator.setup();
+// vim: set expandtab shiftwidth=4 tabstop=4:
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "tests.css";
+ </STYLE>
+
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>Test Cases</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="suites">
+ <table>
+ <tr>
+ <th>Test Suite</th>
+ <th>Total</th>
+ <th>Auto</th>
+ <th>Manual</th>
+ </tr>
+ <tr>
+ <td>
+ Total
+ </td>
+ <td>
+ <xsl:value-of select="count(test_definition/suite/set//testcase)" />
+ </td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])" />
+ </td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])" />
+ </td>
+ </tr>
+ <xsl:for-each select="test_definition/suite">
+ <tr>
+ <td>
+ <xsl:value-of select="@name" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase)" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])" />
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Detailed Test Cases</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="cases">
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <p>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ </p>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Type</th>
+ <th>Component</th>
+ <th>Execution Type</th>
+ <th>Description</th>
+ <th>Specification</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name" />
+ <tr>
+ <td colspan="7">
+ Test Set:
+ <xsl:value-of select="@name" />
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <xsl:sort select="@id" />
+ <tr>
+ <td>
+ <xsl:value-of select="@id" />
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+ <td>
+ <xsl:value-of select="@type" />
+ </td>
+ <td>
+ <xsl:value-of select="@component" />
+ </td>
+ <td>
+ <xsl:value-of select="@execution_type" />
+ </td>
+ <td>
+ <p>
+ Pre_condition:
+ <xsl:value-of select=".//description/pre_condition" />
+ </p>
+ <p>
+ Post_condition:
+ <xsl:value-of select=".//description/post_condition" />
+ </p>
+ <p>
+ Test Script Entry:
+ <xsl:value-of select=".//description/test_script_entry" />
+ </p>
+ <p>
+ Steps:
+ <p />
+ <xsl:for-each select=".//description/steps/step">
+ <xsl:sort select="@order" />
+ Step
+ <xsl:value-of select="@order" />
+ :
+ <xsl:value-of select="./step_desc" />
+ ;
+ <p />
+ Expected Result:
+ <xsl:value-of select="./expected" />
+ <p />
+ </xsl:for-each>
+ </p>
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select=".//spec" />
+ </xsl:call-template>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word" />
+ <xsl:variable name="cr">
+ <xsl:text>
+</xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)" />
+ <br />
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
--- /dev/null
+testcase_SCRIPTS = *
+testcasedir = $(prefix)/opt/{TESTSUITE_NAME}/testcase
+EXTRA_DIST = $(testcase_SCRIPTS)
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "tests.css";
+ </STYLE>
+
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>Test Report</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="device">
+ <table>
+ <tr>
+ <th colspan="2">Device Information</th>
+ </tr>
+ <tr>
+ <td>Device Name</td>
+ <td>
+ <xsl:value-of select="test_definition/environment/@device_name" />
+ </td>
+ </tr>
+ <tr>
+ <td>Device Model</td>
+ <td>
+ <xsl:value-of select="test_definition/environment/@device_model" />
+ </td>
+ </tr>
+ <tr>
+ <td>OS Version</td>
+ <td>
+ <xsl:value-of select="test_definition/environment/@os_version" />
+ </td>
+ </tr>
+ <tr>
+ <td>Device ID</td>
+ <td>
+ <xsl:value-of select="test_definition/environment/@device_id" />
+ </td>
+ </tr>
+ <tr>
+ <td>Firmware Version</td>
+ <td>
+ <xsl:value-of select="test_definition/environment/@firmware_version" />
+ </td>
+ </tr>
+ <tr>
+ <td>Screen Size</td>
+ <td>
+ <xsl:value-of select="test_definition/environment/@screen_size" />
+ </td>
+ </tr>
+ <tr>
+ <td>Resolution</td>
+ <td>
+ <xsl:value-of select="test_definition/environment/@resolution" />
+ </td>
+ </tr>
+ <tr>
+ <td>Host Info</td>
+ <td>
+ <xsl:value-of select="test_definition/environment/@host" />
+ </td>
+ </tr>
+ <tr>
+ <td>Others</td>
+ <td>
+ <xsl:value-of select="test_definition/environment/other" />
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ <div id="summary">
+ <table>
+ <tr>
+ <th colspan="2">Test Summary</th>
+ </tr>
+ <tr>
+ <td>Test Plan Name</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/@test_plan_name" />
+ </td>
+ </tr>
+ <tr>
+ <td>Tests Total</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Passed</td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition//suite/set/testcase[@result = 'PASS'])" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Failed</td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition//suite/set/testcase[@result = 'FAIL'])" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test N/A</td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Not Run</td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
+ </td>
+ </tr>
+ <tr>
+ <td>Start time</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/start_at" />
+ </td>
+ </tr>
+ <tr>
+ <td>End time</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/end_at" />
+ </td>
+ </tr>
+ </table>
+ </div>
+
+
+ <div id="suite_summary">
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Test Summary by Suite</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>N/A</th>
+ <th>Not Run</th>
+ <th>Total</th>
+ </tr>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <tr>
+ <td>
+ <xsl:value-of select="@name" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'PASS'])" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'FAIL'])" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])" />
+ </td>
+ <td>
+ <xsl:value-of
+ select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase)" />
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+
+ <div id="cases">
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">Detailed Test Results</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <p>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ </p>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name" />
+ <tr>
+ <td colspan="4">
+ Test Set:
+ <xsl:value-of select="@name" />
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <xsl:sort select="@id" />
+ <tr>
+ <td>
+ <xsl:value-of select="@id" />
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+ <td class="red_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'PASS'">
+ <td class="green_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'BLOCK' ">
+ <td>
+ BLOCK
+ </td>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>
+
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:value-of select=".//result_info/stdout" />
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ </body>
+ </html>
+ </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
--- /dev/null
+@charset "UTF-8";
+/* CSS Document */
+#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td
+ {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-weight: inherit;
+ font-style: inherit;
+ font-size: 0.96em;
+ font-family: arial;
+ vertical-align: baseline;
+}
+
+#testcasepage p {
+ text-align: left;
+}
+
+#testcasepage table {
+ border-collapse: separate;
+ border-spacing: 0;
+ margin-bottom: 1.4em;
+ vertical-align: middle;
+}
+
+#testcasepage th,#testcasepage td {
+ text-align: left;
+ font-weight: normal;
+ padding: 4px 10px 4px 5px;
+ vertical-align: middle;
+}
+
+#cases table {
+ width: 101%;
+}
+
+#title table {
+ width: 101%;
+}
+
+#device table {
+ width: 50%;
+}
+
+#summary table {
+ width: 50%;
+}
+
+#testcasepage th {
+ border-bottom: 1px solid #000;
+ background-color: #AAAAAA;
+ border-left: 1px solid #000;
+ border-top: 1px solid #000;
+ color: #000;
+ font-weight: bold;
+ vertical-align: bottom;
+}
+
+#testcasepage th:last-child, #testcasepage td:last-child {
+ border-right: 1px solid #000;
+}
+
+#testcasepage td {
+ border-left: 1px solid;
+ font-weight: normal;
+ border-bottom: 1px solid;
+}
+
+#testcasepage td.yellow_rate {
+ background-color: #ffcc00;
+}
+
+#testcasepage td.green_rate {
+ background-color: #33cc33;
+}
+
+#testcasepage td.dgreen_rate {
+ background-color: #339933;
+}
+
+#testcasepage td.red_rate {
+ background-color: #FF3333;
+}
+
+#title table, #title tr, #title td {
+ border-left: none;
+ border-bottom: none;
+ text-align: center;
+}
+
+#title td:last-child {
+ border-right: none;
+}
+
+#testcasepage h1 {
+ font-size: 2em;
+ font-family: Arial, sans-serif; font-weight : bold;
+ line-height: 1;
+ color: #000;
+ margin-bottom: 0.75em;
+ padding-top: 0.25em;
+ font-weight: bold;
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
+<test_definition>
+ <suite name="{TESTSUITE_NAME}" launcher="WRTLauncher" category="undefined">
+ <set name="Default">
+ <testcase component="TizenAPI/Application/Default" execution_type="auto" id="testcase" priority="P1" purpose="" type="" status="approved">
+ <description>
+ <test_script_entry>/opt/{TESTSUITE_NAME}/testcase/{TESTCASE}.html</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion element_type="" element_name="" interface="" specification="" section="" category=""/>
+ <spec_url></spec_url>
+ <spec_statement/>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ </suite>
+</test_definition>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
+<test_definition>
+ <suite name="{TESTSUITE_NAME}" launcher="WRTLauncher" category="undefined">
+ <set name="Default">
+ <testcase component="TizenAPI/Application/Default" execution_type="auto" id="testcase" priority="P1" purpose="">
+ <description>
+ <test_script_entry>/opt/{TESTSUITE_NAME}/testcase/{TESTCASE}.html</test_script_entry>
+ </description>
+ </testcase>
+ </set>
+ </suite>
+</test_definition>
--- /dev/null
+webrunner_SCRIPTS = *
+webrunnerdir = $(prefix)/opt/{TESTSUITE_NAME}/webrunner
+EXTRA_DIST = $(webrunner_SCRIPTS)
--- /dev/null
+<!doctype html>
+<!--
+Copyright (c) 2015 Samsung Electronics Co.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+
+
+-->
+
+<head>
+<meta name="viewport" content="width=device-width">
+<script src="jquery-1.10.2.min.js"></script>
+<style type="text/css">
+html {
+ font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;
+}
+
+body {
+ background-color: white;
+}
+
+table#browse {
+ border-collapse:collapse;
+ table-layout:fixed;width:80%;
+}
+
+table#browse th:first-child,table#browse td:first-child {width:40%;}
+
+table#browse th:last-child,table#browse td:last-child {width:30%;}
+
+table#browse th {
+ padding:0;
+ padding-bottom:0.5em;
+ text-align:left;
+ border-bottom:medium solid black;
+}
+table#browse td {
+ padding:1em;
+ padding-bottom:0.5em;
+ border-bottom:thin solid black;
+}
+div#navbar{
+ box-sizing: border-box;
+ width: 99%;
+ border: 0px;
+ text-align: left;
+ background: slateblue;
+ color: white;
+}
+div#footbar{
+ width: 99%;
+ border: 0px;
+ text-align: left;
+}
+textarea#testinfo{
+ width: 99%;
+ font-size: 0.8em;
+}
+input{
+ font-size: 1.2em;
+ padding-top: 0.1em;
+ padding-bottom: 0.1em;
+}
+
+#btnPrev,#btnNext{
+ width: 8%;
+}
+#btnDone,#btnRun,#btnList,#btnPass,#btnFail,#btnBlock{
+ width: 12%;
+ font-weight: bold;
+}
+
+#btnPass { color: green;}
+#btnFail { color: red;}
+#btnBlock { color: orange;}
+#labBatch{
+ font-size: 0.5em;
+}
+#textTest {
+ width: 60%;
+}
+
+#frmTest {
+ border: none;
+}
+.singlemode { display: none;}
+.short{
+ padding-left: 1em;
+}
+</style>
+</head>
+
+<body>
+<div id="navbar" class="batchmode">
+ <span class="short singlemode"><input type="button" id="btnList" value="List"/></span>
+ <span class="singlemode short">
+ <input type="button" id="btnPrev" value="<"/>
+ <input type="text" id="textTest" readonly />
+ <input type="button" id="btnNext" value=">"/>
+ </span>
+ <span class="short listmode"> <input type="button" id="btnDone" value="Done"/></span>
+</div>
+<div id="divSum"> </div>
+<div width="99%" class="singlemode">
+ <textarea class="batchmode" id="testinfo" rows=4 disabled>
+ </textarea>
+</div>
+<div id="footbar" class="batchmode">
+ <span class="short"><input type="button" id="btnRun" value="Run"/></span>
+ <span class="short singlemode"><input type="button" id="btnPass" value="PASS"/></span>
+ <span class="short singlemode"><input type="button" id="btnFail" value="FAIL"/></span>
+ <span class="short singlemode"><input type="button" id="btnBlock" value="BLOCK"/></span>
+</div>
+<iframe width="100%" id="frmTest" allowFullScreen="true" mozAllowFullScreen="true" webkitAllowFullscreen="true" src="">
+</iframe>
+<script src="testrunner.js"> </script>
+</body>
+</html>
--- /dev/null
+/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
+//@ sourceMappingURL=jquery-1.10.2.min.map
+*/
+(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
+}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
+u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
--- /dev/null
+/*
+Copyright (c) 2015 Samsung Electronics Co.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+* Redistributions of works must retain the original copyright notice, this list
+ of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the original copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this work without
+ specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY INTEL CORPORATION "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL INTEL CORPORATION BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Authors:
+
+*/
+var STUB_PORT = "";
+var RESOURCE_DIR = "/opt/usr/media";
+$.ajax({
+ url:RESOURCE_DIR + "/tct/portconfigure.json",
+ dataType:"json",
+ data:{},
+ async:false,
+ success:function(data){
+ STUB_PORT = data[0]["STUB_PORT"];
+ }
+});
+
+$(function(){
+ try {
+ // Checks if a device supports bluetooth API or not
+ var shape = tizen.systeminfo.getCapability("http://tizen.org/feature/screen.shape");
+ console.log("Shape = " + shape);
+ //alert(" Shape = " + shape);
+ } catch (error) {
+ // alert("Error name: " + error.name + ", message: " + error.message);
+ console.log("Error name: " + error.name + ", message: " + error.message);
+ }
+
+ if(shape=="circle"){
+ $('body').css('max-width', '100%');
+ $('body').css('max-height', '100%');
+ $('body').css('background-color', 'white');
+ $('body').css('margin-top', '20%');
+ $('body').css('margin-bottom', '20%');
+ $('body').css('margin-left', '20%');
+ $('body').css('margin-right', '20%');
+ }
+});
+(function (window){
+ function TestRunner() {
+ this.start = null;
+ this.ui = null;
+ this.submitResult = null;
+ this.report = function (result, message) {};
+ this.doTest = function () {};
+ }
+
+ TestRunner.prototype = (function () {
+ var index = -1;
+ var Tests = [];
+ var Sets = {};
+ function newSummary() {
+ return {"TOTAL": 0,
+ "PASS" : 0,
+ "FAIL" : 0,
+ "BLOCK" : 0,
+ "NOTRUN" : 0};
+ }
+ function newTestContext() {
+ return {start_time: null,
+ prev_uri: "",
+ uri: "",
+ sub_index: 0,
+ onload_delay: 0
+ };
+ }
+ function getParms () {
+ var parms = {};
+ var items = location.search.substring(1).split('&');
+ for ( var i = 0, max = items.length; i < max; i++) {
+ var pos = items[i].indexOf('=');
+ if (pos > 0) {
+ var key = items[i].substring(0, pos);
+ var val = items[i].substring(pos + 1);
+ if (!parms[key]) {
+ var rawVal = decodeURI(val);
+ if (rawVal.indexOf(',') < 0)
+ parms[key] = rawVal;
+ else
+ parms[key] = rawVal.split(',');
+ }
+ } else
+ parms[items[i]] = 1;
+ }
+ if (!parms.testsuite)
+ parms.testsuite = 'tests.xml';
+ return parms;
+ }
+ var parms = getParms();
+ var sum = newSummary();
+ var testContext = newTestContext();
+ return {
+ constructor: TestRunner,
+ options: parms,
+ getTestContext: function (field) {
+ return testContext[field];
+ },
+
+ goNext: function () {
+ if (Tests.length === 0) return false;
+ if (index >= Tests.length) {
+ index = -1;
+ return false;
+ }
+ index++;
+ return true;
+ },
+
+ goPrev: function () {
+ if (Tests.length === 0) return false;
+ if (index < 0) {
+ index = Tests.length;
+ return false;
+ }
+ index--;
+ return true;
+ },
+
+ runAll: function () {
+ testContext = newTestContext();
+ this.ui.updateView(VIEWFLAGS.add("batch"));
+ this.ui.updateView(VIEWFLAGS.del("list"));
+ this.testIndex(-1);
+ this.doTest();
+ },
+
+ cleanTests: function () {
+ Tests = [];
+ },
+
+ testIndex: function (ind) {
+ if (typeof ind === "undefined")
+ return index;
+ index = ind;
+ },
+
+ getTest: function (ind) {
+ if (typeof ind === "undefined")
+ ind = index;
+ return Tests[ind];
+ },
+
+ addTest: function (test) {
+ if (test instanceof Array)
+ Tests = Tests.concat(test);
+ else
+ Tests.push(test);
+ },
+
+ sumInit: function (num) {
+ if (typeof num === "undefined")
+ num = Tests.length;
+ sum.TOTAL = sum.NOTRUN = num;
+ sum.PASS = sum.FAIL = sum.BLOCK = 0;
+ },
+
+ sumUpdate: function (oldRes, newRes, set) {
+ if (oldRes !== null) {
+ sum[oldRes]--;
+ if (set !== null) Sets[set][oldRes]--;
+ }
+ if (newRes !== null) {
+ sum[newRes]++;
+ if (set != null) Sets[set][newRes]++;
+ }
+ },
+
+ checkResult: function (oTestDoc) {
+ var message = "";
+ // Handle sub-index test
+ if (testContext.sub_index > 0) {
+ var oRes = $(oTestDoc).find("table#results");
+ if (oRes.length == 0)
+ return false;
+ var ind = testContext.sub_index - 1;
+ var $n = $(oRes).find('tbody > tr').eq(ind);
+ if ($n.length == 0)
+ return false
+ var result = $n.children("td:eq(0)").text();
+ message = $n.children("td:eq(2)").text();
+ this.report(result.toUpperCase(), message);
+ return true;
+ }
+
+ var oPass = $(oTestDoc).find(".pass");
+ var oFail = $(oTestDoc).find(".fail");
+ // All tests pass
+ if (oPass.length > 0 && oFail.length == 0) {
+ this.report('PASS', message);
+ return true;
+ }
+ // Handle failed tests
+ if (oFail.length > 0) {
+ var oRes = $(oTestDoc).find("table#results");
+ $(oRes).find('tr.fail').each(function() {
+ message += " *" + $(this).children("td:eq(1)").text() + ": ";
+ message += $(this).children("td:eq(2)").text();
+ });
+ this.report('FAIL', message);
+ return true;
+ }
+ return false;
+ },
+
+ testInfo: function (ind) {
+ var info = "";
+ var tc = this.getTest();
+ if (!tc) return info;
+ info += "Test : (" + (index + 1) + "/" + sum.TOTAL + ") ";
+ info += tc.test_script_entry;
+ info += "\nPurpose: " + tc.purpose;
+ if (tc.pre_condition)
+ info += "\nPrecondition: " + tc.pre_condition;
+ if (tc.steps)
+ info += "\n" + tc.steps;
+ return info;
+ },
+
+ getTestCaseUrl: function () {
+ function getUriField(uri, param) {
+ var querys = uri.split("?")
+ if (querys.length <= 1)
+ return "";
+ uri = querys[1];
+ var start = uri.indexOf(param);
+ if (start == -1)
+ return "";
+ start += param.length + 1;
+ var end = uri.indexOf("&", start);
+ if (end == -1)
+ return uri.substring(start);
+ return uri.substring(start, end);
+ }
+ var tc = this.getTest();
+ if (!tc) return null;
+ var delay = tc.onload_delay;
+ if (delay)
+ testContext.onload_delay = parseInt(delay) * 1000;
+ else
+ testContext.onload_delay = 5000;
+
+ var uri = tc.test_script_entry;
+ if (typeof this.options.testprefix !== "undefined") {
+ var pos = uri.indexOf('http://');
+ if (pos !== 0)
+ uri = this.options.testprefix + uri
+ }
+ var val = getUriField(uri, "value");
+ if (val && tc.execution_type == "auto" && VIEWFLAGS.has("batch")) { // Need sub index in TC
+ testContext.sub_index = parseInt(val);
+ testContext.uri = uri.split("?")[0];
+ if (testContext.uri == testContext.prev_uri)
+ return "";
+ } else {
+ testContext.uri = uri;
+ testContext.sub_index = 0;
+ }
+ testContext.prev_uri = testContext.uri;
+ testContext.start_time = new Date();
+ return testContext.uri;
+ },
+
+ loadReady: function () {
+ if (!VIEWFLAGS.has("batch"))
+ return;
+ if (!this.ui.testComplete()){
+ if (testContext.onload_delay > 0){
+ var tval = 500;
+ var self = this;
+ setTimeout(function() {self.loadReady();}, tval);
+ testContext.onload_delay -= tval;
+ return
+ }
+ this.report("BLOCK", "Timeout");
+ }
+ this.doTest();
+ },
+
+ getTestSum: function (include_set) {
+ var sumdata = "<section><h3>Total:" + sum.TOTAL
+ + " Pass:<span style='color:green;'>" + sum.PASS
+ + "</span> Fail:<span style='color:red;'>" + sum.FAIL
+ + "</span> Block:<span style='color:orange;'>" + sum.BLOCK
+ + "</span> NotRun:<span style='color:black;'>" + sum.NOTRUN
+ + "</span></h3></section>";
+ if (VIEWFLAGS.has("batch")) {
+ var tc = this.getTest();
+ if (tc) sumdata += "<h4><span style='background-color: wheat'>(#" + index + ") " + tc.id + "</span></h4>";
+ }
+
+ if (include_set) {
+ sumdata += "<p><table id='browse'><tr><th>TestSet</th>";
+ sumdata += "<th>Total</th><th>Pass</th><th>Fail</th><th>Block</th></tr>";
+ $.each(Sets, function (key, val){
+ sumdata += "<tr><td>" + key+ "</td>";
+ sumdata += "<td style='color:black;'>" + val.TOTAL + "</td>";
+ sumdata += "<td style='color:green;'>" + val.PASS + "</td>";
+ sumdata += "<td style='color:red;'>" + val.FAIL + "</td>";
+ sumdata += "<td style='color:orange;'>" + val.BLOCK + "</td></tr>";
+ });
+ sumdata += "</table>";
+ }
+ return sumdata;
+ },
+
+ getBrowseInfo: function () {
+ var failList = passList = blockList = notrunList = "";
+ function createTestList(tc, color, ind) {
+ var mtag = (tc.execution_type === "manual") ? "(M)" : "";
+ return "<li>" + mtag + "<a rel='" + ind + "' href='' style ='color:" + color + ";'>" + tc.id + "</a>" + "</li>";
+ }
+ Sets = {};
+ $.each(Tests, function (ind ,val) {
+ if (this.set === null)
+ this.set = "default";
+ if (typeof Sets[this.set] === "undefined")
+ Sets[this.set] = newSummary();
+ Sets[this.set][this.result]++;
+ Sets[this.set]["TOTAL"]++;
+ if (this.result == "FAIL")
+ failList += createTestList(this, "red", ind);
+ if (this.result == "PASS")
+ passList += createTestList(this, "green", ind);
+ if (this.result == "BLOCK")
+ blockList += createTestList(this, "orange", ind);
+ if (this.result == "NOTRUN")
+ notrunList += createTestList(this, "black", ind);
+ });
+ var data = "<html><head><style>ul li {padding-bottom:0.8em;font-size: 1.3em;}";
+ data += "html{font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;}</style></head><body>";
+ if (notrunList)
+ data += "<section><h3>Notruns</h3><ul>" + notrunList + "</ul></section>";
+ if (failList)
+ data += "<section><h3 style='color: red;'>Fails</h3><ul>" + failList + "</ul></section>";
+ if (blockList)
+ data += "<section><h3 style='color: orange;'>Blocks</h3><ul>" + blockList + "</ul></section>";
+ if (passList)
+ data += "<section><h3 style='color: green'>Passes</h3><ul>" + passList + "</ul></section>";
+ data += "</body></html>";
+ return data;
+ },
+
+ TestCase: function () {
+ return {
+ id: null,
+ test_script_entry: null,
+ execution_type: "manual",
+ result: "NOTRUN",
+ purpose: "",
+ set: null,
+ pre_condition: "",
+ onload_delay: 0,
+ steps: "",
+ data: null};
+ }
+ };
+ }());
+ // Standalone test runner
+ var master_runner = new TestRunner();
+ master_runner.start = function (ui) {
+ function filter(xml, self) {
+ var set_ind = 0;
+ var manuals = [];
+ $(xml).find("set").each(function () {
+ var setname = $(this).attr("name");
+ if (!setname)
+ setname = "set" + set_ind;
+ $(this).find("testcase").each(function () {
+ var v = $(this).attr('execution_type');
+ if (self.options.execution_type && v != self.options.execution_type
+ && $.inArray(v, self.options.execution_type) < 0) {
+ $(this).remove();
+ return;
+ }
+ v = $(this).attr('priority');
+ if (self.options.priority && v != self.options.priority
+ && $.inArray(v, self.options.priority) < 0){
+ $(this).remove();
+ return;
+ }
+ var test = self.TestCase();
+ test.id = $(this).attr("id");
+ test.execution_type = $(this).attr("execution_type");
+ test.test_script_entry = $(this).find("test_script_entry").text();
+ test.purpose = $(this).attr("purpose");
+ test.pre_condition = $(this).find("pre_condition").text();
+ test.onload_delay = $(this).attr("onload_delay");
+ test.result = "NOTRUN";
+ test.set = setname;
+ test.data = this;
+ if (test.execution_type === "auto")
+ self.addTest(test);
+ else
+ manuals.push(test);
+ });
+ set_ind++;
+ });
+ self.addTest(manuals);
+ }
+
+ var self = this;
+ ui.bind(self);
+ $.get(self.options.testsuite, null, function (xml) {
+ self.internal.xmldoc = xml;
+ filter(xml, self);
+ self.sumInit();
+ setTimeout(function () {
+ self.ui.browse();
+ setTimeout(function () {
+ if (self.options.autorun)
+ self.runAll();
+ }, 2000);
+ }, 100);
+ }, "xml");
+ };
+
+ master_runner.doTest = function () {
+ var self = this, tc = null;
+ while (self.goNext()) {
+ tc = self.getTest();
+ if (!tc || tc.execution_type === "manual")
+ break;
+ self.ui.updateTestInfo(self.testInfo(), null, null);
+ self.ui.runTest(self.getTestCaseUrl());
+ return;
+ }
+ if (self.options.autorun) {
+ self.submitResult();
+ close_window();
+ return;
+ }
+ this.ui.updateView(VIEWFLAGS.del("batch"));
+ if (!tc) {
+ setTimeout(function () {self.ui.browse();}, 500);
+ return;
+ }
+ this.ui.updateTest();
+ };
+
+ master_runner.report = function (result, log) {
+ var tc = this.getTest();
+ if (!tc) return;
+ var oldresult = tc.result;
+ this.sumUpdate(oldresult, result, tc.set);
+ tc.result = result;
+ $(tc.data).find('result_info').remove();
+ $(tc.data).attr('result', result);
+ var doc = $.parseXML("<result_info><actual_result>" + result +
+ "</actual_result><start>" + this.getTestContext("start_time") +
+ "</start><end>" + new Date() + "</end><stdout>" +
+ escape_html(log) + "</stdout></result_info>");
+ $(tc.data).append(doc.documentElement);
+ if (VIEWFLAGS.has("batch")) result = null;
+ this.ui.updateTestInfo(null, this.getTestSum(false), result);
+ };
+
+ master_runner.submitResult = function () {
+ var xmldoc = this.internal.xmldoc;
+ var contents = (new XMLSerializer()).serializeToString(xmldoc);
+ if (window.opener) window.opener.postMessage(contents, "*");
+ };
+
+ master_runner.internal = {xmldoc: null};
+
+ // Controlled test runner
+ var slave_runner = new TestRunner();
+ slave_runner.start = function (ui) {
+ function sync_session_id() {
+ $.get(SERVER + "/init_session_id?session_id="
+ + self.internal.session_id);
+ }
+ var self = this;
+ self.internal.session_id = Math.round(Math.random() * 10000);
+ sync_session_id();
+ var next_step = self.internal.get_json("ask_next_step");
+ if (!next_step || next_step.step != "continue")
+ return false;
+ ui.bind(self);
+ var f = function () {
+ var p = self.internal.get_json("check_execution_progress");
+ if (p) self.sumInit(parseInt(p.total));
+ self.doTest();
+ };
+ self.ui.updateView(VIEWFLAGS.add("batch"));
+ self.ui.updateView(VIEWFLAGS.del("list"));
+ setTimeout(f, 1000);
+ return true;
+ };
+
+ slave_runner.doTest = function () {
+ var self = this;
+ if (self.internal.stage > 0) {
+ self.ui.updateView(VIEWFLAGS.del("batch"));
+ self.goNext();
+ self.ui.updateTest();
+ return;
+ }
+ var next_step = self.internal.get_json("ask_next_step");
+ if (next_step && next_step.step == "continue") {
+ var task = self.internal.get_json("auto_test_task");
+ if (task === null) {
+ print_error("ask_test_task", "Fail get task");
+ } else if (task.invalid === 0) {
+ print_error("ask_test_task", "Invalid session");
+ } else if (task.stop === 0) {
+ print_error("ask_test_task", "close window");
+ } else if (task.none !== 0) { //handle auto test
+ var test = self.TestCase();
+ test.id = task.case_id;
+ test.onload_delay = task.onload_delay;
+ test.test_script_entry = task.entry;
+ test.execution_type = "auto";
+ test.purpose = task.purpose;
+ test.pre_condition = task.pre_condition;
+ self.addTest(test);
+ self.goNext();
+ self.ui.updateTestInfo(self.testInfo(), null, null);
+ self.ui.runTest(self.getTestCaseUrl());
+ return;
+ } else { //handle manual test
+ self.ui.updateView(VIEWFLAGS.del("batch"));
+ self.internal.stage = 1;
+ var mtask = self.internal.get_json("manual_cases");
+ if (mtask && mtask.none != 0) {
+ self.cleanTests();
+ for (var i = 0, max = mtask.length; i < max; i++) {
+ var test = self.TestCase();
+ test.id = mtask[i].case_id;
+ test.test_script_entry = mtask[i].entry;
+ test.purpose = mtask[i].purpose;
+ test.pre_condition = mtask[i].pre_condition;
+ test.result = "NOTRUN";
+ test.execution_type = "manual";
+ test.index = i;
+ var steps = "";
+ $(mtask[i].steps).each(function () {
+ steps += "Step-" + this.order + "\t: " + this.step_desc + "\n";
+ steps += "Expect\t: " + this.expected + "\n";
+ });
+ test.steps = steps;
+ self.addTest(test);
+ }
+ self.ui.updateTest(-1);
+ self.sumInit();
+ self.ui.browse();
+ } else
+ close_window();
+ return;
+ }
+ }
+ close_window();
+ };
+
+ slave_runner.report = function(result, log) {
+ var tc = this.getTest();
+ var oldresult;
+ if (this.internal.stage > 0) {
+ this.internal.post_json("commit_manual_result",
+ {"case_id": tc.id, "result": result});
+ oldresult = tc.result
+ tc.result = result;
+ } else {
+ this.internal.post_json("commit_result",
+ { "case_id" : tc.id,
+ "result" : result,
+ "msg" : "[Message]" + log,
+ "session_id" : this.internal.session_id});
+ oldresult = "NOTRUN";
+ }
+ this.sumUpdate(oldresult, result, null);
+ if (VIEWFLAGS.has("batch")) result = null;
+ this.ui.updateTestInfo(null, this.getTestSum(false), result);
+ };
+
+ slave_runner.submitResult = function () {
+ $.get(SERVER + "/generate_xml");
+ };
+
+ slave_runner.internal = {
+ session_id: null,
+ stage: 0,
+ get_json: function (name) {
+ var jsondata = null;
+ $.getJSON(SERVER + "/" + name + "?session_id="
+ + this.session_id, function(data) {
+ jsondata = data;});
+ return jsondata; },
+ post_json: function (name, d) {
+ $.post(SERVER + "/" + name, d, null, "json");
+ }
+ };
+
+ var i_ui = (function () {
+ var testinfo = $("#testinfo").get(0);
+ var frmTest = $("#frmTest").get(0);
+ var textTest = $("#textTest").get(0);
+ var btnPass = $("#btnPass").get(0);
+ var btnFail = $("#btnFail").get(0);
+ var btnBlock = $("#btnBlock").get(0);
+ var btnDone = $("#btnDone").get(0);
+ var btnNext = $("#btnNext").get(0);
+ var btnPrev = $("#btnPrev").get(0);
+ var btnRun = $("#btnRun").get(0);
+ var divSum = $("#divSum").get(0);
+ var btnList = $("#btnList").get(0);
+ var runner = null;
+ var listmode = null;
+ var nextTest = function () {
+ runner.goNext();
+ selectTest();
+ };
+
+ var prevTest = function() {
+ runner.goPrev();
+ selectTest();
+ };
+
+ var selectResult = function() {
+ runner.report(this.value, "");
+ };
+
+ var selectTest = function () {
+ frmTest.src = "";
+ var tc = runner.getTest();
+ if (!tc) {
+ if (runner.testIndex() === -1)
+ textTest.value = "---Begin---";
+ else
+ textTest.value = "---End---";
+ changeColor("NOTRUN");
+ return;
+ }
+ testinfo.value = runner.testInfo();
+ $(divSum).html(runner.getTestSum(false));
+ textTest.value = ((tc.execution_type === "manual") ? "(M)" : "") + tc.id;
+ changeColor(tc.result);
+ };
+
+ function changeColor(result) {
+ if (result === "PASS")
+ $(textTest).css("backgroundColor", "lightgreen");
+ else if (result === "FAIL")
+ $(textTest).css("backgroundColor", "tomato");
+ else if (result === "BLOCK")
+ $(textTest).css("backgroundColor", "yellow");
+ else
+ $(textTest).css("backgroundColor", "white");
+ }
+
+ return {
+ bind: function (r) {
+ var self = this;
+ r.ui = self;
+ runner = r;
+ $(btnPass).on("click", selectResult);
+ $(btnFail).on("click", selectResult);
+ $(btnBlock).on("click", selectResult);
+ $(btnNext).on("click", nextTest);
+ $(btnPrev).on("click", prevTest);
+ $(btnRun).on("click", function () {
+ if (VIEWFLAGS.has("list")) {
+ runner.runAll();
+ } else
+ self.runTest(runner.getTestCaseUrl());
+ });
+ $(frmTest).on("load", function () {runner.loadReady();});
+ $(btnDone).on("click", function () {
+ runner.submitResult();
+ close_window();
+ });
+ $(btnList).on("click", function () {
+ frmTest.src = "";
+ //self.updateTest(-1);
+ setTimeout(function () {self.browse();}, 300);
+ });
+ frmTest.height = $(window).height();
+ },
+
+ browse: function () {
+ var tdoc = frmTest.contentWindow.document;
+ tdoc.open("text/html", "replace");
+ tdoc.writeln(runner.getBrowseInfo());
+ var self = this;
+ $(tdoc).find("section ul li>a").on("click", function (e) {
+ var ind = parseInt($(this).attr("rel"));
+ self.updateView(VIEWFLAGS.del("list"));
+ self.updateTest(ind);
+ window.scrollTo(0, 0);
+ e.preventDefault();
+ });
+ $(divSum).html(runner.getTestSum(true));
+ self.updateView(VIEWFLAGS.add("list"));
+ },
+
+ updateTest: function (ind) {
+ if (typeof ind !== "undefined") runner.testIndex(ind);
+ selectTest();
+ },
+
+ updateView: function (flags) {
+ if (flags & VIEWFLAGS.flags.list) {
+ $(".listmode").show();
+ $(".singlemode").hide();
+ } else {
+ $(".listmode").hide();
+ $(".singlemode").show();
+ }
+ if (flags & VIEWFLAGS.flags.batch)
+ $(".batchmode").hide();
+ else
+ $(".batchmode").show();
+ },
+
+ testComplete: function () {
+ return runner.checkResult(frmTest.contentWindow.document);
+ },
+
+ runTest: function (uri) {
+ if (uri === null) return;
+ if (uri)
+ frmTest.src = uri;
+ else
+ runner.loadReady();
+
+ },
+
+ updateTestInfo: function (info, sum, result) {
+ if (info !== null)
+ testinfo.value = info;
+ if (sum !== null)
+ $(divSum).html(sum);
+ if (result !== null)
+ changeColor(result);
+ },
+ };
+ } ());
+
+ function escape_html(s) {
+ return s.replace(/\&/g, "&").replace(/</g, "<").replace(/"/g,
+ """).replace(/'/g, "'");
+ }
+
+ function print_error(command, message) {
+ console.warn("Command -" + command + ": " + message);
+ }
+
+ function close_window() {
+ setTimeout("window.open('','_self','');window.close()", 1000);
+ }
+
+ function pre_init() {
+ var runner_ok = false;
+ $.get(SERVER + "/check_server", function () {
+ runner_ok = slave_runner.start(i_ui);
+ });
+ if (!runner_ok)
+ master_runner.start(i_ui);
+ }
+ var SERVER = "http://127.0.0.1:"+STUB_PORT;
+ var VIEWFLAGS = { val: 0,
+ flags: {list: 1, batch: 2},
+ add: function (f) { this.val |= this.flags[f]; return this.val},
+ del: function (f) { this.val &= ~this.flags[f]; return this.val},
+ has: function (f) { return this.val & this.flags[f];},
+ };
+ $.ajaxSetup({ async: false});
+ $(window).on("ready", pre_init);
+})(window);
--- /dev/null
+name=$(basename $(pwd))
+main_version="2.4"
+release=""
+version="$main_version"
+appname=$(echo $name|sed 's/-/_/g')
+
+# set value "1" if this suite need to sign,otherwise set "0" #
+sign="1"
+
+# set value "1" if this suite need to keep src_file,otherwise set "0" #
+src_file="0"
+
+# specified files to be kept in whitelist #
+whitelist="
+inst.sh
+tests.xml
+tests.full.xml
+COPYING
+LICENSE.Apache-2.0
+LICENSE.CC-BY-3.0
+NOTICE
+mediasrc"
--- /dev/null
+[TCTSHELL]
+WRT_LAUNCHR_CMD = WRTLauncher
+TCT_SHELL_HOME = /opt/tools/shell/
+TCT_PLAN_FOLDER = /opt/tools/shell/plan/
+
+[DISTRIBUTE_MODE]
+DEVICE_EXCEPTIONS =
+#Devices to ignore for distribute mode.
+#example:
+# example_device1
+# example_device2
+ DEVICE1
+ DEVICE2
+# 0000d81400006200
+
+[Device]
+DEVICE_TMP_FOLDER = /tmp/
+DEVICE_TESTS_FILE = /opt/usr/media/tct/opt/%s/tests.xml
+DEVICE_CAPABILITY_PATH = /opt/usr/media/Documents/tct/capability.xml
+DEVICE_BUILD_INFO_PATH = /opt/usr/media/Documents/tct/buildinfo.xml
+DEVICE_DEFAULT_CONF_PATH = /opt/usr/media/tct/opt/tct-testconfig/tct-testconfig.ini
+DEVICE_DEFAULT_ISON_CONF_PATH = /opt/usr/media/tct/preconfigure.json
+DEVICE_PORT_JSON_CONF_PATH = /opt/usr/media/tct/portconfigure.json
+DEVICE_PRECONFIGURE_FILE_PATH = /opt/usr/media/Documents/tct/pre_configure.conf
+
+
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+[public_version]
+version=TCT_2.4
+[internal_version]
+version=TCT_2.4
+[public_shell_version]
+version=TCTSHELL_3.1.0-20160418
--- /dev/null
+tct-shell (1.0.16) unstable; urgency=low
+
+ * Packaged for Ubuntu
+
+ -- Ed Bartosh <eduard.bartosh@intel.com> Mon, 06 May 2013 14:37:15 +0300
--- /dev/null
+Source: tct-shell
+Section: utils
+Priority: standard
+Maintainer: Lei Yang <lei.a.yang@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools
+Standards-Version: 3.9.4
+
+Package: tct-shell
+Architecture: all
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}
+Description: Console tool for Tizen Compliance Test
+ This tool provides an alternative way to execute TCT with testkit-lite
+ when testkit-manager is not available
--- /dev/null
+Format: http://dep.debian.net/deps/dep5
+Source: https://github.com/testkit/testkit-manager
+
+Files: *
+Copyright: 2012-2013 Intel Corp.
+License: GPL-2.0
+
+Files: debian/*
+Copyright: 2012-2013 Intel Corp.
+License: GPL-2.0
+
+License: GPL-2.0
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License
+ .
+ This package is distributed in the hope that 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, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
--- /dev/null
+README
+CONFIG
--- /dev/null
+tct-shell_1.0.16_all.deb utils standard
--- /dev/null
+#!/bin/sh
+
+# Set permissions
+chmod -R ugo+rwx /opt/tools/shell
+
+#DEBHELPER#
--- /dev/null
+#!/usr/bin/make -f
+
+%:
+ dh $@
--- /dev/null
+PKG_NAME := tct-shell
+SPECFILE = $(addsuffix .spec, $(PKG_NAME))
+PKG_VERSION := $(shell grep '^Version: ' $(SPECFILE)|awk '{print $$2}')
+
+TARBALL := $(PKG_NAME)_$(PKG_VERSION).tar.gz
+
+dsc: tarball
+ $(eval MD5=$(shell md5sum $(TARBALL) | sed "s/ / $(shell stat -c '%s' $(TARBALL)) /"))
+ @sed -i 's/^Version:.*/Version: $(PKG_VERSION)/' $(PKG_NAME).dsc
+ @sed -i 's/ [a-f0-9]\+ [0-9]\+ $(PKG_NAME).*tar.*/ $(MD5)/' $(PKG_NAME).dsc
+
+tarball:
+ @cd "$$(git rev-parse --show-toplevel)" \
+ && git archive --prefix $(PKG_NAME)-$(PKG_VERSION)/ HEAD \
+ | gzip > "$(CURDIR)/$(TARBALL)"
+
+clean:
+ @rm -f $(PKG_NAME)*.tar.gz
+
+all: clean tarball dsc
--- /dev/null
+Source: tct-shell
+Section: utils
+Priority: standard
+Maintainer: Shaofeng <shaofeng.tang@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support, tree
+Standards-Version: 3.9.2
+Homepage: https://github.com/testkit/
+Version: 1.0.1
+Files:
+ f64f26693160cf59cdae21e8961cf986 15593 tct-shell_1.0.1.tar.gz
+
--- /dev/null
+Summary: TCT-Shell
+Name: tct-shell
+Version: 1.0.15
+Release: 1
+License: GPLv2
+Group: Applications/System
+Source: %name-%version.tar.gz
+BuildRoot: %_tmppath/%name-%version-buildroot
+Requires: python
+
+
+%description
+TCT-Shell is a wrapper pf testkit-lite. provide an alternative way to execute TCT with testkit-lite when testkit-manager is not available
+Provide the following functions:
+1. List available test packages.
+2. Install/remove test packages on target device according to user's option
+3. Trigger testing in 3 ways: through test plan, through package, rerun failed test cases.
+4. Show test result summary in visual way.
+
+%prep
+%setup -q
+
+%build
+./autogen
+./configure
+make
+
+%install
+[ "\$RPM_BUILD_ROOT" != "/" ] && rm -rf "\$RPM_BUILD_ROOT"
+make install DESTDIR=$RPM_BUILD_ROOT
+
+%clean
+
+%post
+# Set permissions
+chmod ugo+rwx /opt/tools/shell
+
+%files
+/usr/lib/python2.7/dist-packages/tctshell/*
+/opt/tools/shell
+/opt/tools/shell/plan
+/opt/tools/shell/style
+/opt/tools/tct-shell
+/opt/tools/tct-plan-generator
+
+%post
+chmod -R 777 /opt/tools/shell
+
+%changelog
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="CSharp_Full_mobile_3.0" profile="mobile">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="Tizen.Applications.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>24</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/Tizen.Applications.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Applications.Tests" category="C# Device APIs">\r
+ <auto_tcn>129</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>129</total_tcn>\r
+ <pkg_name>mobile/Tizen.Applications.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Badge.Tests" category="C# Device APIs">\r
+ <auto_tcn>21</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>21</total_tcn>\r
+ <pkg_name>mobile/Tizen.Badge.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Bluetooth.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>120</manual_tcn>\r
+ <total_tcn>120</total_tcn>\r
+ <pkg_name>mobile/Tizen.Bluetooth.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Bluetooth.Tests" category="C# Device APIs">\r
+ <auto_tcn>120</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>120</total_tcn>\r
+ <pkg_name>mobile/Tizen.Bluetooth.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Device.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>16</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>mobile/Tizen.Device.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Device.Tests" category="C# Device APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>mobile/Tizen.Device.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Download.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/Tizen.Download.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Download.Tests" category="C# Device APIs">\r
+ <auto_tcn>53</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>mobile/Tizen.Download.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Feedback.Tests" category="C# Device APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/Tizen.Feedback.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Location.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/Tizen.Location.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Location.Tests" category="C# Device APIs">\r
+ <auto_tcn>102</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>102</total_tcn>\r
+ <pkg_name>mobile/Tizen.Location.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Mediacontent.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/Tizen.Mediacontent.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Mediacontent.Tests" category="C# Device APIs">\r
+ <auto_tcn>228</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>228</total_tcn>\r
+ <pkg_name>mobile/Tizen.Mediacontent.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Mime.Tests" category="C# Device APIs">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/Tizen.Mime.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Multimedia.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>50</manual_tcn>\r
+ <total_tcn>50</total_tcn>\r
+ <pkg_name>mobile/Tizen.Multimedia.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Multimedia.Tests" category="C# Device APIs">\r
+ <auto_tcn>257</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>257</total_tcn>\r
+ <pkg_name>mobile/Tizen.Multimedia.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Network.Tests" category="C# Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>mobile/Tizen.Network.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Nfc.Tests" category="C# Device APIs">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>50</total_tcn>\r
+ <pkg_name>mobile/Tizen.Nfc.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Notifications.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>32</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>mobile/Tizen.Notifications.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Notifications.Tests" category="C# Device APIs">\r
+ <auto_tcn>74</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>74</total_tcn>\r
+ <pkg_name>mobile/Tizen.Notifications.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Packagemanager.Tests" category="C# Device APIs">\r
+ <auto_tcn>59</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>59</total_tcn>\r
+ <pkg_name>mobile/Tizen.Packagemanager.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Privilege.Tests" category="C# Device APIs">\r
+ <auto_tcn>19</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>mobile/Tizen.Privilege.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Push.Tests" category="C# Device APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>mobile/Tizen.Push.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Runtimeinformation.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>33</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/Tizen.Runtimeinformation.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Runtimeinformation.Tests" category="C# Device APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/Tizen.Runtimeinformation.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Sample.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/Tizen.Sample.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Sensor.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>90</manual_tcn>\r
+ <total_tcn>90</total_tcn>\r
+ <pkg_name>mobile/Tizen.Sensor.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Sensor.Tests" category="C# Device APIs">\r
+ <auto_tcn>276</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>276</total_tcn>\r
+ <pkg_name>mobile/Tizen.Sensor.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Smartcard.Tests" category="C# Device APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>mobile/Tizen.Smartcard.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.System.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/Tizen.System.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.System.Tests" category="C# Device APIs">\r
+ <auto_tcn>29</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>29</total_tcn>\r
+ <pkg_name>mobile/Tizen.System.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Systemsettings.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>26</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>mobile/Tizen.Systemsettings.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Systemsettings.Tests" category="C# Device APIs">\r
+ <auto_tcn>114</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>114</total_tcn>\r
+ <pkg_name>mobile/Tizen.Systemsettings.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Tizen.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/Tizen.Tizen.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Tizen.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>0</total_tcn>\r
+ <pkg_name>mobile/Tizen.Tizen.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.Tracer.Tests" category="C# Device APIs">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/Tizen.Tracer.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.UI.Manual.Tests" category="C# Device APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>324</manual_tcn>\r
+ <total_tcn>324</total_tcn>\r
+ <pkg_name>mobile/Tizen.UI.Manual.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.UI.Tests" category="C# Device APIs">\r
+ <auto_tcn>1019</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1019</total_tcn>\r
+ <pkg_name>mobile/Tizen.UI.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="Tizen.WidgetControl.Tests" category="C# Device APIs">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/Tizen.WidgetControl.Tests-3.0.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_mobile_2.4" profile="mobile">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>172</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>172</total_tcn>\r
+ <pkg_name>mobile/tct-connection-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>255</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>255</total_tcn>\r
+ <pkg_name>mobile/tct-webkit2-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-privilege-info-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-adaptor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>98</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>98</total_tcn>\r
+ <pkg_name>mobile/tct-dali-adaptor-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-wav-player-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-native-common-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_viewer_evas-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>mobile/tct-widget_viewer_evas-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>mobile/tct-capi-ui-inputmethod-manager-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-permission-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>mobile/tct-filesystem-permission-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messages-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-messages-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>mobile/tct-badge-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <!--\r
+ <suite name="tct-wifi-direct-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>140</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>140</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-direct-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ -->\r
+ <suite name="tct-widget_viewer_evas-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-widget_viewer_evas-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-capi-message-port-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-settings-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-system-settings-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messages-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>mobile/tct-messages-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-tool-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>109</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>109</total_tcn>\r
+ <pkg_name>mobile/tct-capi-media-tool-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>mobile/tct-push-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-appcore-agent-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-radio-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>mobile/tct-radio-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>129</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>129</total_tcn>\r
+ <pkg_name>mobile/tct-location-manager-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>348</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>348</total_tcn>\r
+ <pkg_name>mobile/tct-camera-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-thumbnail-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-thumbnail-util-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cairo-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/tct-cairo-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-tbm-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-libstorage-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-accounts-svc-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>mobile/tct-accounts-svc-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>159</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>159</total_tcn>\r
+ <pkg_name>mobile/tct-telephony-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-phonenumber-utils-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-phonenumber-utils-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-native-common-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-vision-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>mobile/tct-capi-media-vision-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-base-utils-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>288</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>288</total_tcn>\r
+ <pkg_name>mobile/tct-base-utils-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-widget-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-appcore-widget-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-editor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-metadata-editor-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>mobile/tct-mediacodec-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-service2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>58</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>58</total_tcn>\r
+ <pkg_name>mobile/tct-calendar-service2-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-maps-service-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>296</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>296</total_tcn>\r
+ <pkg_name>mobile/tct-capi-maps-service-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-mediacodec-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>103</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>103</total_tcn>\r
+ <pkg_name>mobile/tct-key-manager-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>475</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>475</total_tcn>\r
+ <pkg_name>mobile/tct-media-content-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-opengl-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>21</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>21</total_tcn>\r
+ <pkg_name>mobile/tct-sound-manager-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tone-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-tone-player-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-controller-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>mobile/tct-media-controller-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-service-adaptor-client-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>127</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>127</total_tcn>\r
+ <pkg_name>mobile/tct-service-adaptor-client-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-widget-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-appcore-widget-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-elm-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>mobile/tct-voice-control-elm-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-efl-ext-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-metadata-extractor-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>mobile/tct-camera-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-motion-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/tct-motion-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screen-mirroring-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-screen-mirroring-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-video-util-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>mobile/tct-push-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-dlog-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geofence-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>mobile/tct-geofence-manager-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>mobile/tct-app-manager-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>72</total_tcn>\r
+ <pkg_name>mobile/tct-audio-io-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>96</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>96</total_tcn>\r
+ <pkg_name>mobile/tct-package-manager-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-maps-service-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>57</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>57</total_tcn>\r
+ <pkg_name>mobile/tct-capi-maps-service-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-player-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-core-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>864</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>864</total_tcn>\r
+ <pkg_name>mobile/tct-dali-core-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sync-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>mobile/tct-sync-manager-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-efl-util-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/tct-efl-ext-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>202</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>202</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>60</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-util-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-video-util-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>53</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>mobile/tct-bundle-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-bundle-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>31</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>mobile/tct-libstorage-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_service-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>46</total_tcn>\r
+ <pkg_name>mobile/tct-widget_service-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>mobile/tct-mime-type-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-url-download-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>27</total_tcn>\r
+ <pkg_name>mobile/tct-url-download-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>99</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>99</total_tcn>\r
+ <pkg_name>mobile/tct-capi-ui-inputmethod-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-eom-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>mobile/tct-eom-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contacts-service2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>198</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>198</total_tcn>\r
+ <pkg_name>mobile/tct-contacts-service2-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>mobile/tct-application-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-camera-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>191</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>191</total_tcn>\r
+ <pkg_name>mobile/tct-player-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-minicontrol-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>mobile/tct-minicontrol-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-elm-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>mobile/tct-voice-control-elm-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>mobile/tct-appcore-agent-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>mobile/tct-system-info-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-device-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-context-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>mobile/tct-context-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>269</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>269</total_tcn>\r
+ <pkg_name>mobile/tct-application-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-radio-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>mobile/tct-radio-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>mobile/tct-data-control-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-email-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/tct-email-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <!--\r
+ <suite name="tct-wifi-direct-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-direct-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ -->\r
+ <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>104</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>104</total_tcn>\r
+ <pkg_name>mobile/tct-tts-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-settings-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>mobile/tct-system-settings-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/tct-metadata-extractor-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>59</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>59</total_tcn>\r
+ <pkg_name>mobile/tct-device-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>52</total_tcn>\r
+ <pkg_name>mobile/tct-capi-message-port-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>43</total_tcn>\r
+ <pkg_name>mobile/tct-video-util-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-service-adaptor-client-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/tct-service-adaptor-client-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-sound-manager-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cairo-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-cairo-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>95</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>95</total_tcn>\r
+ <pkg_name>mobile/tct-image-util-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-service2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>149</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>149</total_tcn>\r
+ <pkg_name>mobile/tct-calendar-service2-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-capi-ui-inputmethod-manager-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-shortcut-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-shortcut-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geofence-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>134</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>134</total_tcn>\r
+ <pkg_name>mobile/tct-geofence-manager-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-media-key-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-trace-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-trace-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>157</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>157</total_tcn>\r
+ <pkg_name>mobile/tct-nfc-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-dlog-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-platform-permission-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>mobile/tct-platform-permission-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-editor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>mobile/tct-metadata-editor-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>mobile/tct-runtime-info-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage64-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>31</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>mobile/tct-libstorage64-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/tct-efl-util-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-toolkit-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>231</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>231</total_tcn>\r
+ <pkg_name>mobile/tct-dali-toolkit-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-minicontrol-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-minicontrol-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-audio-io-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>mobile/tct-device-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-base-utils-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>885</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>885</total_tcn>\r
+ <pkg_name>mobile/tct-base-utils-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-oauth2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-oauth2-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-toolkit-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>414</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>414</total_tcn>\r
+ <pkg_name>mobile/tct-dali-toolkit-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-recorder-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-mediacodec-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>54</total_tcn>\r
+ <pkg_name>mobile/tct-player-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-controller-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>mobile/tct-media-controller-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-mime-type-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-system-info-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-thumbnail-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-thumbnail-util-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>mobile/tct-key-manager-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-connection-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>mobile/tct-runtime-info-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-smartcard-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-smartcard-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-tts-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-badge-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-smartcard-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/tct-smartcard-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>60</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-oauth2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>mobile/tct-oauth2-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sync-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-sync-manager-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-accounts-svc-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>147</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>147</total_tcn>\r
+ <pkg_name>mobile/tct-accounts-svc-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <!--\r
+ <suite name="tct-wifi-direct-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-direct-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ -->\r
+ <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>mobile/tct-libstorage-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-url-download-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>121</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>121</total_tcn>\r
+ <pkg_name>mobile/tct-url-download-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>88</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>88</total_tcn>\r
+ <pkg_name>mobile/tct-stt-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-stt-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>151</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>151</total_tcn>\r
+ <pkg_name>mobile/tct-recorder-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-attach-panel-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/tct-attach-panel-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>mobile/tct-voice-control-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-context-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>29</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>29</total_tcn>\r
+ <pkg_name>mobile/tct-context-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>126</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>126</total_tcn>\r
+ <pkg_name>mobile/tct-runtime-info-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>338</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>338</total_tcn>\r
+ <pkg_name>mobile/tct-bluetooth-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-core-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>1600</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1600</total_tcn>\r
+ <pkg_name>mobile/tct-dali-core-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-email-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-email-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>44</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>44</total_tcn>\r
+ <pkg_name>mobile/tct-capi-media-tool-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-location-manager-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>mobile/tct-package-manager-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-telephony-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-adaptor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>mobile/tct-dali-adaptor-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>181</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>181</total_tcn>\r
+ <pkg_name>mobile/tct-media-content-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>mobile/tct-tbm-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libfeedback-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>mobile/tct-libfeedback-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>103</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>103</total_tcn>\r
+ <pkg_name>mobile/tct-webkit2-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>229</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>229</total_tcn>\r
+ <pkg_name>mobile/tct-notification-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>mobile/tct-sound-manager-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-notification-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>97</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>97</total_tcn>\r
+ <pkg_name>mobile/tct-voice-control-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-eom-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>42</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>mobile/tct-eom-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_service-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-widget_service-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contacts-service2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>77</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>77</total_tcn>\r
+ <pkg_name>mobile/tct-contacts-service2-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>mobile/tct-telephony-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-shortcut-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/tct-shortcut-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>mobile/tct-audio-io-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>41</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>mobile/tct-location-manager-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tone-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-tone-player-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>121</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>121</total_tcn>\r
+ <pkg_name>mobile/tct-app-manager-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screen-mirroring-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>mobile/tct-screen-mirroring-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-image-util-native-ctc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-vision-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-media-vision-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-privilege-info-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-image-util-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>mobile/tct-connection-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>mobile/tct-nfc-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ttrace-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-ttrace-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-media-key-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-wav-player-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libfeedback-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-libfeedback-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-phonenumber-utils-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-phonenumber-utils-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-motion-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-motion-native-utc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/tct-bluetooth-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-system-info-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-data-control-native-itc-2.4.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_mobile_3.0" profile="mobile">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-dali-adaptor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>96</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>96</total_tcn>\r
+ <pkg_name>mobile/tct-dali-adaptor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mtp-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-mtp-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-wav-player-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messages-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-messages-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>mobile/tct-badge-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediademuxer-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>mobile/tct-mediademuxer-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-settings-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-system-settings-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-thumbnail-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-thumbnail-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-tbm-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-accounts-svc-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>mobile/tct-accounts-svc-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>159</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>159</total_tcn>\r
+ <pkg_name>mobile/tct-telephony-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-vision-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>mobile/tct-capi-media-vision-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-phonenumber-utils-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>mobile/tct-phonenumber-utils-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fido-client-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/tct-fido-client-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-widget-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-appcore-widget-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-base-utils-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>288</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>288</total_tcn>\r
+ <pkg_name>mobile/tct-base-utils-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>mobile/tct-mediacodec-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-service2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>58</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>58</total_tcn>\r
+ <pkg_name>mobile/tct-calendar-service2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-streamer-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>mobile/tct-capi-media-streamer-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>526</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>526</total_tcn>\r
+ <pkg_name>mobile/tct-media-content-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>mobile/tct-sound-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-opengl-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-controller-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>mobile/tct-media-controller-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tone-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-tone-player-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-elm-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>mobile/tct-voice-control-elm-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-widget-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-appcore-widget-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screen-mirroring-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-screen-mirroring-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-motion-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/tct-motion-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>mobile/tct-camera-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-video-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>mobile/tct-push-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geofence-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>mobile/tct-geofence-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>42</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>mobile/tct-app-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>94</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>94</total_tcn>\r
+ <pkg_name>mobile/tct-audio-io-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-player-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-core-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>864</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>864</total_tcn>\r
+ <pkg_name>mobile/tct-dali-core-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediatool-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>133</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>133</total_tcn>\r
+ <pkg_name>mobile/tct-mediatool-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sync-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>mobile/tct-sync-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-efl-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>mobile/tct-efl-ext-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>208</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-bundle-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>53</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>mobile/tct-bundle-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>31</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>mobile/tct-libstorage-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-url-download-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>27</total_tcn>\r
+ <pkg_name>mobile/tct-url-download-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>99</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>99</total_tcn>\r
+ <pkg_name>mobile/tct-capi-ui-inputmethod-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>mobile/tct-application-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contacts-service2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>200</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>200</total_tcn>\r
+ <pkg_name>mobile/tct-contacts-service2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-minicontrol-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>mobile/tct-minicontrol-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>191</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>191</total_tcn>\r
+ <pkg_name>mobile/tct-player-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-elm-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>mobile/tct-voice-control-elm-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>mobile/tct-appcore-agent-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-device-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>mobile/tct-system-info-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>268</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>268</total_tcn>\r
+ <pkg_name>mobile/tct-application-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>mobile/tct-data-control-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-direct-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-direct-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-email-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/tct-email-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>104</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>104</total_tcn>\r
+ <pkg_name>mobile/tct-tts-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>59</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>59</total_tcn>\r
+ <pkg_name>mobile/tct-device-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-sound-manager-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>215</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>215</total_tcn>\r
+ <pkg_name>mobile/tct-image-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>157</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>157</total_tcn>\r
+ <pkg_name>mobile/tct-nfc-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/tct-runtime-info-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-editor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>mobile/tct-metadata-editor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-toolkit-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>238</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>238</total_tcn>\r
+ <pkg_name>mobile/tct-dali-toolkit-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/tct-efl-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage64-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>31</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>mobile/tct-libstorage64-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>mobile/tct-device-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-recorder-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-toolkit-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>435</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>435</total_tcn>\r
+ <pkg_name>mobile/tct-dali-toolkit-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-mediacodec-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>mobile/tct-player-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-mime-type-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-tts-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-badge-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>60</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-iotcon-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>346</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>346</total_tcn>\r
+ <pkg_name>mobile/tct-iotcon-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sync-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-sync-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>mobile/tct-libstorage-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-url-download-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>121</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>121</total_tcn>\r
+ <pkg_name>mobile/tct-url-download-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-stt-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>88</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>88</total_tcn>\r
+ <pkg_name>mobile/tct-stt-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>151</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>151</total_tcn>\r
+ <pkg_name>mobile/tct-recorder-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-context-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>29</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>29</total_tcn>\r
+ <pkg_name>mobile/tct-context-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediastreamrecorder-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>29</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>29</total_tcn>\r
+ <pkg_name>mobile/tct-mediastreamrecorder-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>126</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>126</total_tcn>\r
+ <pkg_name>mobile/tct-runtime-info-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>346</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>346</total_tcn>\r
+ <pkg_name>mobile/tct-bluetooth-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-location-manager-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-telephony-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-adaptor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>mobile/tct-dali-adaptor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>mobile/tct-tbm-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>200</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>200</total_tcn>\r
+ <pkg_name>mobile/tct-media-content-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libfeedback-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>mobile/tct-libfeedback-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-streamer-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-capi-media-streamer-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-notification-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contacts-service2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>mobile/tct-contacts-service2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_service-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-widget_service-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>43</total_tcn>\r
+ <pkg_name>mobile/tct-location-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-image-util-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-service-adaptor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/tct-service-adaptor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-privilege-info-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-vision-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>mobile/tct-media-vision-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vpn-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-vpn-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-image-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>mobile/tct-connection-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>mobile/tct-nfc-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ttrace-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-ttrace-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-phonenumber-utils-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-phonenumber-utils-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/tct-bluetooth-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-motion-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-motion-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-system-info-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>172</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>172</total_tcn>\r
+ <pkg_name>mobile/tct-connection-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>249</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>249</total_tcn>\r
+ <pkg_name>mobile/tct-webkit2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-privilege-info-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-native-common-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_viewer_evas-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>mobile/tct-widget_viewer_evas-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-permission-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>mobile/tct-filesystem-permission-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>mobile/tct-capi-ui-inputmethod-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-direct-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>140</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>140</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-direct-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_viewer_evas-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-widget_viewer_evas-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-capi-message-port-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messages-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>mobile/tct-messages-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>mobile/tct-push-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-appcore-agent-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>143</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>143</total_tcn>\r
+ <pkg_name>mobile/tct-location-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>351</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>351</total_tcn>\r
+ <pkg_name>mobile/tct-camera-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cairo-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-cairo-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-streamrecorder-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>125</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>125</total_tcn>\r
+ <pkg_name>mobile/tct-streamrecorder-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-libstorage-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-native-common-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-editor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-metadata-editor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-maps-service-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>339</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>339</total_tcn>\r
+ <pkg_name>mobile/tct-capi-maps-service-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-mediacodec-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>127</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>127</total_tcn>\r
+ <pkg_name>mobile/tct-key-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-efl-ext-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-service-adaptor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>125</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>125</total_tcn>\r
+ <pkg_name>mobile/tct-service-adaptor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-metadata-extractor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-dlog-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-maps-service-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>70</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>70</total_tcn>\r
+ <pkg_name>mobile/tct-capi-maps-service-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>92</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>92</total_tcn>\r
+ <pkg_name>mobile/tct-package-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-mediamuxer-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-capi-mediamuxer-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-util-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-video-util-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_service-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>46</total_tcn>\r
+ <pkg_name>mobile/tct-widget_service-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>mobile/tct-mime-type-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-eom-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>mobile/tct-eom-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-camera-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-context-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>mobile/tct-context-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-radio-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>mobile/tct-radio-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-settings-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>mobile/tct-system-settings-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/tct-metadata-extractor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>53</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>mobile/tct-capi-message-port-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>43</total_tcn>\r
+ <pkg_name>mobile/tct-video-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cairo-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-cairo-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-service2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>149</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>149</total_tcn>\r
+ <pkg_name>mobile/tct-calendar-service2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-capi-ui-inputmethod-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-shortcut-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-shortcut-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-media-key-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geofence-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>139</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>139</total_tcn>\r
+ <pkg_name>mobile/tct-geofence-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-trace-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-trace-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-platform-permission-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>54</total_tcn>\r
+ <pkg_name>mobile/tct-platform-permission-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-dlog-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-minicontrol-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-minicontrol-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-audio-io-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-oauth2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-oauth2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-base-utils-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>884</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>884</total_tcn>\r
+ <pkg_name>mobile/tct-base-utils-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-controller-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>mobile/tct-media-controller-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-system-info-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>mobile/tct-key-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-thumbnail-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>mobile/tct-thumbnail-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-connection-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>mobile/tct-runtime-info-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-smartcard-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-smartcard-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-smartcard-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/tct-smartcard-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mtp-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>mobile/tct-mtp-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fido-client-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-fido-client-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-oauth2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>mobile/tct-oauth2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-direct-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>mobile/tct-wifi-direct-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-accounts-svc-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>147</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>147</total_tcn>\r
+ <pkg_name>mobile/tct-accounts-svc-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-attach-panel-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>mobile/tct-attach-panel-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>mobile/tct-voice-control-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-mediademuxer-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>mobile/tct-capi-mediademuxer-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-core-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>1645</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1645</total_tcn>\r
+ <pkg_name>mobile/tct-dali-core-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>mobile/tct-package-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-email-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>mobile/tct-email-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>51</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>51</total_tcn>\r
+ <pkg_name>mobile/tct-capi-media-tool-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>103</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>103</total_tcn>\r
+ <pkg_name>mobile/tct-webkit2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>229</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>229</total_tcn>\r
+ <pkg_name>mobile/tct-notification-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>101</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>101</total_tcn>\r
+ <pkg_name>mobile/tct-sound-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>97</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>97</total_tcn>\r
+ <pkg_name>mobile/tct-voice-control-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>mobile/tct-telephony-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-eom-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>42</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>mobile/tct-eom-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>mobile/tct-audio-io-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-shortcut-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>mobile/tct-shortcut-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tone-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-tone-player-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>130</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>130</total_tcn>\r
+ <pkg_name>mobile/tct-app-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screen-mirroring-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>mobile/tct-screen-mirroring-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediamuxer-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-mediamuxer-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-media-key-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>mobile/tct-wav-player-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libfeedback-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>mobile/tct-libfeedback-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-data-control-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<ns3:testplan name="Native_Full_tv_2.4" profile="tv" xmlns="" xmlns:ns3="http://www.example.org/plan/">
+ <execute_type>All</execute_type>
+ <suite launcher="WRTLauncher" name="tct-capi-media-tool-native-utc">
+ <auto_tcn>110</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>110</total_tcn>
+ <pkg_name>tv/tct-capi-media-tool-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-appcore-agent-native-itc">
+ <auto_tcn>2</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>tv/tct-appcore-agent-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-libstorage-native-ctc">
+ <auto_tcn>2</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>tv/tct-libstorage-native-ctc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-metadata-extractor-native-itc">
+ <auto_tcn>8</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>8</total_tcn>
+ <pkg_name>tv/tct-metadata-extractor-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-thumbnail-util-native-itc">
+ <auto_tcn>6</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>6</total_tcn>
+ <pkg_name>tv/tct-thumbnail-util-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-media-content-native-itc">
+ <auto_tcn>181</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>181</total_tcn>
+ <pkg_name>tv/tct-media-content-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-package-manager-native-itc">
+ <auto_tcn>38</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>38</total_tcn>
+ <pkg_name>tv/tct-package-manager-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-bundle-native-itc">
+ <auto_tcn>9</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>9</total_tcn>
+ <pkg_name>tv/tct-bundle-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-system-info-native-ctc">
+ <auto_tcn>4</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>tv/tct-system-info-native-ctc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-mime-type-native-utc">
+ <auto_tcn>15</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>15</total_tcn>
+ <pkg_name>tv/tct-mime-type-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-dlog-native-utc">
+ <auto_tcn>4</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>tv/tct-dlog-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-media-content-native-utc">
+ <auto_tcn>475</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>475</total_tcn>
+ <pkg_name>tv/tct-media-content-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-metadata-editor-native-utc">
+ <auto_tcn>18</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>18</total_tcn>
+ <pkg_name>tv/tct-metadata-editor-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-audio-io-native-utc">
+ <auto_tcn>72</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>72</total_tcn>
+ <pkg_name>tv/tct-audio-io-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-media-controller-native-utc">
+ <auto_tcn>85</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>85</total_tcn>
+ <pkg_name>tv/tct-media-controller-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-opengl-native-ctc">
+ <auto_tcn>3</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>tv/tct-opengl-native-ctc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-capi-message-port-native-utc">
+ <auto_tcn>52</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>52</total_tcn>
+ <pkg_name>tv/tct-capi-message-port-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-wav-player-native-itc">
+ <auto_tcn>1</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>tv/tct-wav-player-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-package-manager-native-utc">
+ <auto_tcn>102</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>102</total_tcn>
+ <pkg_name>tv/tct-package-manager-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-key-manager-native-utc">
+ <auto_tcn>103</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>103</total_tcn>
+ <pkg_name>tv/tct-key-manager-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tone-player-native-utc">
+ <auto_tcn>4</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>tv/tct-tone-player-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-bluetooth-native-utc">
+ <auto_tcn>169</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>169</total_tcn>
+ <pkg_name>tv/tct-bluetooth-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-media-key-native-itc">
+ <auto_tcn>1</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>tv/tct-media-key-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-app-manager-native-utc">
+ <auto_tcn>121</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>121</total_tcn>
+ <pkg_name>tv/tct-app-manager-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-bundle-native-utc">
+ <auto_tcn>53</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>53</total_tcn>
+ <pkg_name>tv/tct-bundle-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-mime-type-native-itc">
+ <auto_tcn>2</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>tv/tct-mime-type-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-webkit2-native-utc">
+ <auto_tcn>184</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>184</total_tcn>
+ <pkg_name>tv/tct-webkit2-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-image-util-native-ctc">
+ <auto_tcn>2</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>tv/tct-image-util-native-ctc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-libstorage64-native-utc">
+ <auto_tcn>31</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>31</total_tcn>
+ <pkg_name>tv/tct-libstorage64-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tts-native-itc">
+ <auto_tcn>14</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>14</total_tcn>
+ <pkg_name>tv/tct-tts-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-wav-player-native-utc">
+ <auto_tcn>9</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>9</total_tcn>
+ <pkg_name>tv/tct-wav-player-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tts-native-utc">
+ <auto_tcn>104</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>104</total_tcn>
+ <pkg_name>tv/tct-tts-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-screen-mirroring-native-itc">
+ <auto_tcn>5</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>5</total_tcn>
+ <pkg_name>tv/tct-screen-mirroring-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-screen-mirroring-native-utc">
+ <auto_tcn>33</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>33</total_tcn>
+ <pkg_name>tv/tct-screen-mirroring-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tbm-native-utc">
+ <auto_tcn>17</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>17</total_tcn>
+ <pkg_name>tv/tct-tbm-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tone-player-native-itc">
+ <auto_tcn>1</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>tv/tct-tone-player-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-system-info-native-utc">
+ <auto_tcn>12</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>12</total_tcn>
+ <pkg_name>tv/tct-system-info-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-thumbnail-util-native-utc">
+ <auto_tcn>14</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>14</total_tcn>
+ <pkg_name>tv/tct-thumbnail-util-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-dlog-native-itc">
+ <auto_tcn>2</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>tv/tct-dlog-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-voice-control-native-utc">
+ <auto_tcn>74</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>74</total_tcn>
+ <pkg_name>tv/tct-voice-control-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-bluetooth-native-itc">
+ <auto_tcn>23</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>23</total_tcn>
+ <pkg_name>tv/tct-bluetooth-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-native-common-native-utc">
+ <auto_tcn>5</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>5</total_tcn>
+ <pkg_name>tv/tct-native-common-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-application-native-utc">
+ <auto_tcn>269</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>269</total_tcn>
+ <pkg_name>tv/tct-application-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-wifi-native-utc">
+ <auto_tcn>154</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>154</total_tcn>
+ <pkg_name>tv/tct-wifi-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-metadata-extractor-native-utc">
+ <auto_tcn>23</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>23</total_tcn>
+ <pkg_name>tv/tct-metadata-extractor-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-sound-manager-native-itc">
+ <auto_tcn>21</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>21</total_tcn>
+ <pkg_name>tv/tct-sound-manager-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-runtime-info-native-ctc">
+ <auto_tcn>15</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>15</total_tcn>
+ <pkg_name>tv/tct-runtime-info-native-ctc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-camera-native-utc">
+ <auto_tcn>323</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>323</total_tcn>
+ <pkg_name>tv/tct-camera-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-voice-control-elm-native-utc">
+ <auto_tcn>72</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>72</total_tcn>
+ <pkg_name>tv/tct-voice-control-elm-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-url-download-native-utc">
+ <auto_tcn>121</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>121</total_tcn>
+ <pkg_name>tv/tct-url-download-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-camera-native-itc">
+ <auto_tcn>78</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>78</total_tcn>
+ <pkg_name>tv/tct-camera-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-runtime-info-native-utc">
+ <auto_tcn>126</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>126</total_tcn>
+ <pkg_name>tv/tct-runtime-info-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-app-manager-native-itc">
+ <auto_tcn>38</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>38</total_tcn>
+ <pkg_name>tv/tct-app-manager-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-appcore-agent-native-utc">
+ <auto_tcn>11</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>11</total_tcn>
+ <pkg_name>tv/tct-appcore-agent-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-runtime-info-native-itc">
+ <auto_tcn>7</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>7</total_tcn>
+ <pkg_name>tv/tct-runtime-info-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-connection-native-utc">
+ <auto_tcn>172</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>172</total_tcn>
+ <pkg_name>tv/tct-connection-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-image-util-native-utc">
+ <auto_tcn>95</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>95</total_tcn>
+ <pkg_name>tv/tct-image-util-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-application-native-itc">
+ <auto_tcn>55</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>55</total_tcn>
+ <pkg_name>tv/tct-application-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-recorder-native-utc">
+ <auto_tcn>114</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>114</total_tcn>
+ <pkg_name>tv/tct-recorder-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-native-common-native-itc">
+ <auto_tcn>2</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>tv/tct-native-common-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-media-key-native-utc">
+ <auto_tcn>3</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>tv/tct-media-key-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-data-control-native-utc">
+ <auto_tcn>89</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>89</total_tcn>
+ <pkg_name>tv/tct-data-control-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-audio-io-native-itc">
+ <auto_tcn>26</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>26</total_tcn>
+ <pkg_name>tv/tct-audio-io-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-metadata-editor-native-itc">
+ <auto_tcn>7</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>7</total_tcn>
+ <pkg_name>tv/tct-metadata-editor-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-sound-manager-native-ctc">
+ <auto_tcn>1</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>tv/tct-sound-manager-native-ctc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-connection-native-ctc">
+ <auto_tcn>1</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>tv/tct-connection-native-ctc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-libstorage-native-itc">
+ <auto_tcn>10</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>10</total_tcn>
+ <pkg_name>tv/tct-libstorage-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-webkit2-native-itc">
+ <auto_tcn>82</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>82</total_tcn>
+ <pkg_name>tv/tct-webkit2-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-key-manager-native-itc">
+ <auto_tcn>34</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>34</total_tcn>
+ <pkg_name>tv/tct-key-manager-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-voice-control-native-itc">
+ <auto_tcn>22</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>22</total_tcn>
+ <pkg_name>tv/tct-voice-control-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-system-info-native-itc">
+ <auto_tcn>4</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>tv/tct-system-info-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-capi-media-tool-native-itc">
+ <auto_tcn>44</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>44</total_tcn>
+ <pkg_name>tv/tct-capi-media-tool-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-libstorage-native-utc">
+ <auto_tcn>31</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>31</total_tcn>
+ <pkg_name>tv/tct-libstorage-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-libfeedback-native-utc">
+ <auto_tcn>13</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>13</total_tcn>
+ <pkg_name>tv/tct-libfeedback-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-efl-util-native-utc">
+ <auto_tcn>27</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>27</total_tcn>
+ <pkg_name>tv/tct-efl-util-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-trace-native-utc">
+ <auto_tcn>5</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>5</total_tcn>
+ <pkg_name>tv/tct-trace-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-libfeedback-native-itc">
+ <auto_tcn>4</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>tv/tct-libfeedback-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-service-adaptor-client-native-itc">
+ <auto_tcn>24</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>24</total_tcn>
+ <pkg_name>tv/tct-service-adaptor-client-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-connection-native-itc">
+ <auto_tcn>61</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>61</total_tcn>
+ <pkg_name>tv/tct-connection-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-capi-message-port-native-itc">
+ <auto_tcn>6</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>6</total_tcn>
+ <pkg_name>tv/tct-capi-message-port-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-image-util-native-itc">
+ <auto_tcn>14</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>14</total_tcn>
+ <pkg_name>tv/tct-image-util-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-audio-io-native-ctc">
+ <auto_tcn>1</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>tv/tct-audio-io-native-ctc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-media-controller-native-itc">
+ <auto_tcn>28</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>28</total_tcn>
+ <pkg_name>tv/tct-media-controller-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tbm-native-itc">
+ <auto_tcn>7</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>7</total_tcn>
+ <pkg_name>tv/tct-tbm-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-recorder-native-itc">
+ <auto_tcn>33</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>33</total_tcn>
+ <pkg_name>tv/tct-recorder-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-sound-manager-native-utc">
+ <auto_tcn>71</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>71</total_tcn>
+ <pkg_name>tv/tct-sound-manager-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-service-adaptor-client-native-utc">
+ <auto_tcn>127</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>127</total_tcn>
+ <pkg_name>tv/tct-service-adaptor-client-native-utc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-efl-util-native-itc">
+ <auto_tcn>3</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>tv/tct-efl-util-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-url-download-native-itc">
+ <auto_tcn>27</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>27</total_tcn>
+ <pkg_name>tv/tct-url-download-native-itc-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-data-control-native-itc">
+ <auto_tcn>33</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>33</total_tcn>
+ <pkg_name>tv/tct-data-control-native-itc-2.4.zip</pkg_name>
+ </suite>
+</ns3:testplan>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_tv_3.0" profile="tv">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>172</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>172</total_tcn>\r
+ <pkg_name>tv/tct-connection-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>206</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>206</total_tcn>\r
+ <pkg_name>tv/tct-webkit2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>tv/tct-privilege-info-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-adaptor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>96</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>96</total_tcn>\r
+ <pkg_name>tv/tct-dali-adaptor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mtp-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>tv/tct-mtp-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-native-common-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-wav-player-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>tv/tct-capi-ui-inputmethod-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-direct-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>140</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>140</total_tcn>\r
+ <pkg_name>tv/tct-wifi-direct-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediademuxer-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>tv/tct-mediademuxer-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>tv/tct-capi-message-port-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>tv/tct-push-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-appcore-agent-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>348</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>348</total_tcn>\r
+ <pkg_name>tv/tct-camera-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-thumbnail-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>tv/tct-thumbnail-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>tv/tct-tbm-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-libstorage-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-accounts-svc-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>tv/tct-accounts-svc-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-phonenumber-utils-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>tv/tct-phonenumber-utils-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>tv/tct-native-common-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-editor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>tv/tct-metadata-editor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>tv/tct-mediacodec-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-service2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>58</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>58</total_tcn>\r
+ <pkg_name>tv/tct-calendar-service2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>tv/tct-mediacodec-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-streamer-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>tv/tct-capi-media-streamer-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>127</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>127</total_tcn>\r
+ <pkg_name>tv/tct-key-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>526</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>526</total_tcn>\r
+ <pkg_name>tv/tct-media-content-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>tv/tct-opengl-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>tv/tct-sound-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-controller-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>tv/tct-media-controller-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>tv/tct-efl-ext-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-elm-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>tv/tct-voice-control-elm-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>tv/tct-metadata-extractor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>tv/tct-camera-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screen-mirroring-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>tv/tct-screen-mirroring-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>tv/tct-video-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>tv/tct-push-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>tv/tct-dlog-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>42</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>tv/tct-app-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>94</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>94</total_tcn>\r
+ <pkg_name>tv/tct-audio-io-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>92</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>92</total_tcn>\r
+ <pkg_name>tv/tct-package-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>tv/tct-player-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediatool-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>133</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>133</total_tcn>\r
+ <pkg_name>tv/tct-mediatool-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-core-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>864</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>864</total_tcn>\r
+ <pkg_name>tv/tct-dali-core-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sync-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>tv/tct-sync-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>tv/tct-efl-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>tv/tct-efl-ext-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>208</total_tcn>\r
+ <pkg_name>tv/tct-wifi-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-mediamuxer-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>tv/tct-capi-mediamuxer-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-util-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>tv/tct-video-util-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>tv/tct-bundle-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>53</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>tv/tct-bundle-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>31</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>tv/tct-libstorage-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>tv/tct-mime-type-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-url-download-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>27</total_tcn>\r
+ <pkg_name>tv/tct-url-download-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>99</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>99</total_tcn>\r
+ <pkg_name>tv/tct-capi-ui-inputmethod-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>tv/tct-application-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contacts-service2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>198</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>198</total_tcn>\r
+ <pkg_name>tv/tct-contacts-service2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>191</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>191</total_tcn>\r
+ <pkg_name>tv/tct-player-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-elm-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>tv/tct-voice-control-elm-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>tv/tct-appcore-agent-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>tv/tct-system-info-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-context-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>tv/tct-context-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>268</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>268</total_tcn>\r
+ <pkg_name>tv/tct-application-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>tv/tct-data-control-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-direct-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>tv/tct-wifi-direct-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>104</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>104</total_tcn>\r
+ <pkg_name>tv/tct-tts-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>tv/tct-metadata-extractor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>52</total_tcn>\r
+ <pkg_name>tv/tct-capi-message-port-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>43</total_tcn>\r
+ <pkg_name>tv/tct-video-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>tv/tct-sound-manager-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-service2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>149</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>149</total_tcn>\r
+ <pkg_name>tv/tct-calendar-service2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>206</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>206</total_tcn>\r
+ <pkg_name>tv/tct-image-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-capi-ui-inputmethod-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>tv/tct-media-key-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-editor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>tv/tct-metadata-editor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-dlog-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>tv/tct-runtime-info-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-toolkit-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>238</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>238</total_tcn>\r
+ <pkg_name>tv/tct-dali-toolkit-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>tv/tct-efl-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>tv/tct-audio-io-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-oauth2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>tv/tct-oauth2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>tv/tct-recorder-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-toolkit-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>435</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>435</total_tcn>\r
+ <pkg_name>tv/tct-dali-toolkit-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>tv/tct-mediacodec-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>47</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>47</total_tcn>\r
+ <pkg_name>tv/tct-player-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-mime-type-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-controller-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>tv/tct-media-controller-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>tv/tct-system-info-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-thumbnail-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>tv/tct-thumbnail-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>tv/tct-key-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>tv/tct-connection-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>tv/tct-runtime-info-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>tv/tct-tts-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>tv/tct-wifi-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-oauth2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>tv/tct-oauth2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sync-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>tv/tct-sync-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>tv/tct-libstorage-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-direct-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>tv/tct-wifi-direct-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-accounts-svc-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>144</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>144</total_tcn>\r
+ <pkg_name>tv/tct-accounts-svc-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-url-download-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>121</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>121</total_tcn>\r
+ <pkg_name>tv/tct-url-download-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>88</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>88</total_tcn>\r
+ <pkg_name>tv/tct-stt-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>tv/tct-stt-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>151</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>151</total_tcn>\r
+ <pkg_name>tv/tct-recorder-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>tv/tct-voice-control-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-context-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>29</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>29</total_tcn>\r
+ <pkg_name>tv/tct-context-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>126</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>126</total_tcn>\r
+ <pkg_name>tv/tct-runtime-info-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-mediademuxer-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>tv/tct-capi-mediademuxer-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>169</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>169</total_tcn>\r
+ <pkg_name>tv/tct-bluetooth-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-core-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>1645</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1645</total_tcn>\r
+ <pkg_name>tv/tct-dali-core-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>51</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>51</total_tcn>\r
+ <pkg_name>tv/tct-capi-media-tool-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>tv/tct-package-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-adaptor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>tv/tct-dali-adaptor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>200</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>200</total_tcn>\r
+ <pkg_name>tv/tct-media-content-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>tv/tct-tbm-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>86</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>86</total_tcn>\r
+ <pkg_name>tv/tct-webkit2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-streamer-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>tv/tct-capi-media-streamer-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>101</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>101</total_tcn>\r
+ <pkg_name>tv/tct-sound-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>97</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>97</total_tcn>\r
+ <pkg_name>tv/tct-voice-control-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contacts-service2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>tv/tct-contacts-service2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>tv/tct-audio-io-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>121</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>121</total_tcn>\r
+ <pkg_name>tv/tct-app-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screen-mirroring-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>tv/tct-screen-mirroring-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-image-util-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>tv/tct-privilege-info-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>tv/tct-image-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediamuxer-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>tv/tct-mediamuxer-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>tv/tct-media-key-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>tv/tct-wav-player-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-phonenumber-utils-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>tv/tct-phonenumber-utils-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>tv/tct-bluetooth-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>tv/tct-system-info-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>tv/tct-data-control-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_wearable_2.3.2" profile="wearable">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>162</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>162</total_tcn>\r
+ <pkg_name>wearable/tct-connection-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>175</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>175</total_tcn>\r
+ <pkg_name>wearable/tct-webkit2-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-privilege-info-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-native-common-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-wav-player-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messages-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>wearable/tct-messages-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-permission-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>wearable/tct-filesystem-permission-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-badge-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-capi-message-port-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-settings-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-system-settings-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messages-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>wearable/tct-messages-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>wearable/tct-push-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-tool-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>94</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>94</total_tcn>\r
+ <pkg_name>wearable/tct-capi-media-tool-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget-viewer-evas-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>50</total_tcn>\r
+ <pkg_name>wearable/tct-widget-viewer-evas-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>wearable/tct-sensor-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-agent-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-watch-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-watch-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-radio-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>wearable/tct-radio-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>194</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>194</total_tcn>\r
+ <pkg_name>wearable/tct-location-manager-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>320</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>320</total_tcn>\r
+ <pkg_name>wearable/tct-camera-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cairo-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>wearable/tct-cairo-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>wearable/tct-tbm-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-libstorage-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>67</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>67</total_tcn>\r
+ <pkg_name>wearable/tct-telephony-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>wearable/tct-native-common-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-widget-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-widget-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-base-utils-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>284</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>284</total_tcn>\r
+ <pkg_name>wearable/tct-base-utils-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-context-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-context-manager-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>39</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>39</total_tcn>\r
+ <pkg_name>wearable/tct-mediacodec-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>wearable/tct-mediacodec-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>47</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>47</total_tcn>\r
+ <pkg_name>wearable/tct-key-manager-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>418</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>418</total_tcn>\r
+ <pkg_name>wearable/tct-media-content-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>wearable/tct-opengl-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>wearable/tct-sound-manager-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tone-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-tone-player-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>wearable/tct-efl-ext-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-widget-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-widget-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>wearable/tct-metadata-extractor-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>wearable/tct-camera-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>27</total_tcn>\r
+ <pkg_name>wearable/tct-push-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-dlog-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>wearable/tct-app-manager-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>66</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>wearable/tct-audio-io-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>72</total_tcn>\r
+ <pkg_name>wearable/tct-package-manager-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-player-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-efl-util-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>192</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>192</total_tcn>\r
+ <pkg_name>wearable/tct-efl-ext-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>148</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>148</total_tcn>\r
+ <pkg_name>wearable/tct-wifi-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>96</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>96</total_tcn>\r
+ <pkg_name>wearable/tct-sensor-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-bundle-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>50</total_tcn>\r
+ <pkg_name>wearable/tct-bundle-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>31</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>wearable/tct-libstorage-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>wearable/tct-mime-type-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>47</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>47</total_tcn>\r
+ <pkg_name>wearable/tct-application-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-camera-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>136</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>136</total_tcn>\r
+ <pkg_name>wearable/tct-player-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-agent-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>wearable/tct-system-info-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-device-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-radio-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>wearable/tct-radio-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>186</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>186</total_tcn>\r
+ <pkg_name>wearable/tct-application-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-context-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>wearable/tct-context-manager-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>60</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>wearable/tct-data-control-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>50</total_tcn>\r
+ <pkg_name>wearable/tct-tts-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-settings-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>wearable/tct-system-settings-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-metadata-extractor-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>wearable/tct-capi-message-port-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>59</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>59</total_tcn>\r
+ <pkg_name>wearable/tct-device-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-sound-manager-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget-viewer-evas-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>wearable/tct-widget-viewer-evas-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cairo-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-cairo-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>57</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>57</total_tcn>\r
+ <pkg_name>wearable/tct-image-util-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-media-key-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>157</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>157</total_tcn>\r
+ <pkg_name>wearable/tct-nfc-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-dlog-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-platform-permission-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>141</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>141</total_tcn>\r
+ <pkg_name>wearable/tct-platform-permission-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-runtime-info-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>wearable/tct-efl-util-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-audio-io-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>wearable/tct-device-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-base-utils-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>645</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>645</total_tcn>\r
+ <pkg_name>wearable/tct-base-utils-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>wearable/tct-recorder-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>43</total_tcn>\r
+ <pkg_name>wearable/tct-player-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-mime-type-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>wearable/tct-system-info-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>wearable/tct-key-manager-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-connection-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget-service-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>wearable/tct-widget-service-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>wearable/tct-runtime-info-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-smartcard-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>wearable/tct-smartcard-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-tts-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>wearable/tct-badge-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-watch-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-watch-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-smartcard-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-smartcard-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>46</total_tcn>\r
+ <pkg_name>wearable/tct-wifi-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>wearable/tct-libstorage-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>58</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>58</total_tcn>\r
+ <pkg_name>wearable/tct-stt-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>wearable/tct-stt-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>114</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>114</total_tcn>\r
+ <pkg_name>wearable/tct-recorder-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>114</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>114</total_tcn>\r
+ <pkg_name>wearable/tct-runtime-info-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>263</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>263</total_tcn>\r
+ <pkg_name>wearable/tct-bluetooth-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>wearable/tct-capi-media-tool-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-location-manager-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>wearable/tct-package-manager-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-telephony-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>142</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>142</total_tcn>\r
+ <pkg_name>wearable/tct-media-content-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>wearable/tct-tbm-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>72</total_tcn>\r
+ <pkg_name>wearable/tct-webkit2-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>98</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>98</total_tcn>\r
+ <pkg_name>wearable/tct-notification-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>64</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>64</total_tcn>\r
+ <pkg_name>wearable/tct-sound-manager-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>41</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>wearable/tct-notification-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>21</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>21</total_tcn>\r
+ <pkg_name>wearable/tct-telephony-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>21</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>21</total_tcn>\r
+ <pkg_name>wearable/tct-audio-io-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>35</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>35</total_tcn>\r
+ <pkg_name>wearable/tct-location-manager-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tone-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-tone-player-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>108</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>108</total_tcn>\r
+ <pkg_name>wearable/tct-app-manager-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-image-util-native-ctc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-privilege-info-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>wearable/tct-image-util-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>57</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>57</total_tcn>\r
+ <pkg_name>wearable/tct-connection-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>39</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>39</total_tcn>\r
+ <pkg_name>wearable/tct-nfc-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>wearable/tct-media-key-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget-service-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>46</total_tcn>\r
+ <pkg_name>wearable/tct-widget-service-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>wearable/tct-wav-player-native-utc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>43</total_tcn>\r
+ <pkg_name>wearable/tct-bluetooth-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-system-info-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>wearable/tct-sensor-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>wearable/tct-data-control-native-itc-2.3.2.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Native_Full_wearable_3.0" profile="wearable">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-connection-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>172</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>172</total_tcn>\r
+ <pkg_name>wearable/tct-connection-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>183</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>183</total_tcn>\r
+ <pkg_name>wearable/tct-webkit2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vpn-service-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>wearable/tct-vpn-service-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-privilege-info-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-adaptor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>96</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>96</total_tcn>\r
+ <pkg_name>wearable/tct-dali-adaptor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mtp-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-mtp-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-wav-player-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-native-common-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_viewer_evas-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>wearable/tct-widget_viewer_evas-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-capi-ui-inputmethod-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-permission-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>wearable/tct-filesystem-permission-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messages-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>wearable/tct-messages-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>wearable/tct-badge-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_viewer_evas-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>wearable/tct-widget_viewer_evas-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediademuxer-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>wearable/tct-mediademuxer-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>wearable/tct-capi-message-port-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-settings-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-system-settings-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messages-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>wearable/tct-messages-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>wearable/tct-push-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>wearable/tct-sensor-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-agent-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-watch-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-watch-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-radio-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>wearable/tct-radio-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>143</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>143</total_tcn>\r
+ <pkg_name>wearable/tct-location-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>362</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>362</total_tcn>\r
+ <pkg_name>wearable/tct-camera-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-thumbnail-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>wearable/tct-thumbnail-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cairo-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>wearable/tct-cairo-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>wearable/tct-tbm-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-streamrecorder-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>125</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>125</total_tcn>\r
+ <pkg_name>wearable/tct-streamrecorder-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-libstorage-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-accounts-svc-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>wearable/tct-accounts-svc-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>208</total_tcn>\r
+ <pkg_name>wearable/tct-telephony-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-phonenumber-utils-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>wearable/tct-phonenumber-utils-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-native-common-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>wearable/tct-native-common-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-vision-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>wearable/tct-capi-media-vision-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fido-client-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>wearable/tct-fido-client-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-base-utils-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>287</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>287</total_tcn>\r
+ <pkg_name>wearable/tct-base-utils-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-widget-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-widget-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-editor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>wearable/tct-metadata-editor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>wearable/tct-mediacodec-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-maps-service-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>337</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>337</total_tcn>\r
+ <pkg_name>wearable/tct-capi-maps-service-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nsd-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>wearable/tct-nsd-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-streamer-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>102</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>102</total_tcn>\r
+ <pkg_name>wearable/tct-capi-media-streamer-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>wearable/tct-mediacodec-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>127</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>127</total_tcn>\r
+ <pkg_name>wearable/tct-key-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>504</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>504</total_tcn>\r
+ <pkg_name>wearable/tct-media-content-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-opengl-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>wearable/tct-opengl-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>wearable/tct-sound-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tone-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>wearable/tct-tone-player-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-controller-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>wearable/tct-media-controller-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-widget-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-widget-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>59</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>59</total_tcn>\r
+ <pkg_name>wearable/tct-efl-ext-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-elm-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>wearable/tct-voice-control-elm-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>wearable/tct-metadata-extractor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>wearable/tct-camera-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-motion-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-motion-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>wearable/tct-push-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-dlog-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>42</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>wearable/tct-app-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>94</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>94</total_tcn>\r
+ <pkg_name>wearable/tct-audio-io-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>92</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>92</total_tcn>\r
+ <pkg_name>wearable/tct-package-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-maps-service-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>72</total_tcn>\r
+ <pkg_name>wearable/tct-capi-maps-service-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-player-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediatool-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>133</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>133</total_tcn>\r
+ <pkg_name>wearable/tct-mediatool-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-core-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>801</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>801</total_tcn>\r
+ <pkg_name>wearable/tct-dali-core-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sync-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>wearable/tct-sync-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>wearable/tct-efl-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-ext-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>151</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>151</total_tcn>\r
+ <pkg_name>wearable/tct-efl-ext-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>208</total_tcn>\r
+ <pkg_name>wearable/tct-wifi-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>66</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>wearable/tct-sensor-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-mediamuxer-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>wearable/tct-capi-mediamuxer-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>53</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>wearable/tct-bundle-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bundle-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>wearable/tct-bundle-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>31</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>wearable/tct-libstorage-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_service-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>46</total_tcn>\r
+ <pkg_name>wearable/tct-widget_service-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>wearable/tct-mime-type-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-url-download-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>27</total_tcn>\r
+ <pkg_name>wearable/tct-url-download-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>99</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>99</total_tcn>\r
+ <pkg_name>wearable/tct-capi-ui-inputmethod-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-eom-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>wearable/tct-eom-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contacts-service2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>206</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>206</total_tcn>\r
+ <pkg_name>wearable/tct-contacts-service2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>wearable/tct-application-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-camera-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>191</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>191</total_tcn>\r
+ <pkg_name>wearable/tct-player-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-elm-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>wearable/tct-voice-control-elm-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-agent-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-agent-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>wearable/tct-system-info-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-device-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>268</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>268</total_tcn>\r
+ <pkg_name>wearable/tct-application-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-radio-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>wearable/tct-radio-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>wearable/tct-data-control-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nsd-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>wearable/tct-nsd-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tts-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>104</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>104</total_tcn>\r
+ <pkg_name>wearable/tct-tts-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-settings-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>wearable/tct-system-settings-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-extractor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-metadata-extractor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>64</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>64</total_tcn>\r
+ <pkg_name>wearable/tct-device-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-message-port-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>53</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>wearable/tct-capi-message-port-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-sound-manager-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cairo-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>9</total_tcn>\r
+ <pkg_name>wearable/tct-cairo-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>214</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>214</total_tcn>\r
+ <pkg_name>wearable/tct-image-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-ui-inputmethod-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-capi-ui-inputmethod-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-media-key-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-trace-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>wearable/tct-trace-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>160</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>160</total_tcn>\r
+ <pkg_name>wearable/tct-nfc-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dlog-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-dlog-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-platform-permission-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>46</total_tcn>\r
+ <pkg_name>wearable/tct-platform-permission-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-metadata-editor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>wearable/tct-metadata-editor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>wearable/tct-runtime-info-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage64-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>31</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>wearable/tct-libstorage64-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-efl-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>wearable/tct-efl-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-toolkit-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>234</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>234</total_tcn>\r
+ <pkg_name>wearable/tct-dali-toolkit-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-audio-io-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>wearable/tct-device-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-base-utils-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>877</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>877</total_tcn>\r
+ <pkg_name>wearable/tct-base-utils-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-oauth2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>wearable/tct-oauth2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-toolkit-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>435</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>435</total_tcn>\r
+ <pkg_name>wearable/tct-dali-toolkit-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>wearable/tct-recorder-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacodec-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-mediacodec-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>55</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>55</total_tcn>\r
+ <pkg_name>wearable/tct-player-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-controller-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>28</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>wearable/tct-media-controller-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mime-type-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-mime-type-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-system-info-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-thumbnail-util-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-thumbnail-util-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-key-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>wearable/tct-key-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-connection-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>wearable/tct-runtime-info-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-smartcard-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>wearable/tct-smartcard-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tts-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-tts-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>wearable/tct-badge-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mtp-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>wearable/tct-mtp-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcore-watch-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-appcore-watch-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-smartcard-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>wearable/tct-smartcard-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-iotcon-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>346</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>346</total_tcn>\r
+ <pkg_name>wearable/tct-iotcon-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wifi-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>60</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>wearable/tct-wifi-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fido-client-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>19</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>wearable/tct-fido-client-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-oauth2-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>wearable/tct-oauth2-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sync-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>wearable/tct-sync-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-accounts-svc-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>144</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>144</total_tcn>\r
+ <pkg_name>wearable/tct-accounts-svc-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libstorage-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>wearable/tct-libstorage-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-url-download-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>121</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>121</total_tcn>\r
+ <pkg_name>wearable/tct-url-download-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>88</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>88</total_tcn>\r
+ <pkg_name>wearable/tct-stt-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stt-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>wearable/tct-stt-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-recorder-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>143</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>143</total_tcn>\r
+ <pkg_name>wearable/tct-recorder-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>wearable/tct-voice-control-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediastreamrecorder-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>29</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>29</total_tcn>\r
+ <pkg_name>wearable/tct-mediastreamrecorder-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-runtime-info-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>134</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>134</total_tcn>\r
+ <pkg_name>wearable/tct-runtime-info-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>302</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>302</total_tcn>\r
+ <pkg_name>wearable/tct-bluetooth-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-mediademuxer-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>wearable/tct-capi-mediademuxer-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-core-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>1645</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1645</total_tcn>\r
+ <pkg_name>wearable/tct-dali-core-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-tool-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>51</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>51</total_tcn>\r
+ <pkg_name>wearable/tct-capi-media-tool-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-location-manager-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>38</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>wearable/tct-package-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>wearable/tct-telephony-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dali-adaptor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>wearable/tct-dali-adaptor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-content-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>189</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>189</total_tcn>\r
+ <pkg_name>wearable/tct-media-content-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tbm-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>wearable/tct-tbm-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libfeedback-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>13</total_tcn>\r
+ <pkg_name>wearable/tct-libfeedback-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webkit2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>75</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>wearable/tct-webkit2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capi-media-streamer-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-capi-media-streamer-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>229</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>229</total_tcn>\r
+ <pkg_name>wearable/tct-notification-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>101</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>101</total_tcn>\r
+ <pkg_name>wearable/tct-sound-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>wearable/tct-notification-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-voice-control-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>97</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>97</total_tcn>\r
+ <pkg_name>wearable/tct-voice-control-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-eom-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>42</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>wearable/tct-eom-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget_service-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>wearable/tct-widget_service-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contacts-service2-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>wearable/tct-contacts-service2-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-telephony-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>wearable/tct-telephony-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-io-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>wearable/tct-audio-io-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-location-manager-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>43</total_tcn>\r
+ <pkg_name>wearable/tct-location-manager-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tone-player-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-tone-player-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-app-manager-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>130</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>130</total_tcn>\r
+ <pkg_name>wearable/tct-app-manager-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-ctc" category=" CompatibilityTestCases ">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-image-util-native-ctc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-vision-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>wearable/tct-media-vision-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-privilege-info-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vpn-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>wearable/tct-vpn-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-image-util-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>wearable/tct-image-util-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-connection-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>wearable/tct-connection-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>wearable/tct-nfc-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ttrace-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>wearable/tct-ttrace-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediamuxer-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>wearable/tct-mediamuxer-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-key-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>wearable/tct-media-key-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wav-player-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>wearable/tct-wav-player-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-libfeedback-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-libfeedback-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-phonenumber-utils-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-phonenumber-utils-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-motion-native-utc" category=" UnitTestCases ">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>wearable/tct-motion-native-utc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>wearable/tct-bluetooth-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-system-info-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>wearable/tct-system-info-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>wearable/tct-sensor-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-data-control-native-itc" category=" IntegrationTestCases ">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>wearable/tct-data-control-native-itc-3.0.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_mobile_2.4" profile="mobile">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-webdatabase-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>247</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>247</total_tcn>\r
+ <pkg_name>mobile/tct-webdatabase-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-mms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>123</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>123</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-mms-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-multicolumn-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>141</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>159</total_tcn>\r
+ <pkg_name>mobile/tct-multicolumn-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>86</total_tcn>\r
+ <pkg_name>mobile/tct-workers-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-email-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>308</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>309</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-email-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>470</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>470</total_tcn>\r
+ <pkg_name>mobile/tct-time-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>151</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>151</total_tcn>\r
+ <pkg_name>mobile/tct-forms-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>98</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>101</total_tcn>\r
+ <pkg_name>mobile/tct-fileapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-ext01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>64</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>64</total_tcn>\r
+ <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>133</auto_tcn>\r
+ <manual_tcn>78</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>mobile/tct-csp-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>mobile/tct-privilege-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>mobile/tct-mediakey-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>mobile/tct-deviceorientation-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>176</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>176</total_tcn>\r
+ <pkg_name>mobile/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>12</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>93</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>94</total_tcn>\r
+ <pkg_name>mobile/tct-notification-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fmradio-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>67</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>74</total_tcn>\r
+ <pkg_name>mobile/tct-fmradio-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcache-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>mobile/tct-appcache-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystemapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>208</total_tcn>\r
+ <pkg_name>mobile/tct-filesystemapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>9</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>270</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>270</total_tcn>\r
+ <pkg_name>mobile/tct-websocket-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>28</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>mobile/tct-dnd-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>548</auto_tcn>\r
+ <manual_tcn>25</manual_tcn>\r
+ <total_tcn>573</total_tcn>\r
+ <pkg_name>mobile/tct-extra-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fullscreen-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>16</total_tcn>\r
+ <pkg_name>mobile/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>29</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>400</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>400</total_tcn>\r
+ <pkg_name>mobile/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>73</total_tcn>\r
+ <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-networkbearerselection-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>mobile/tct-networkbearerselection-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>41</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-push-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-browserstate-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-browserstate-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>262</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>262</total_tcn>\r
+ <pkg_name>mobile/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-navigationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>80</total_tcn>\r
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>mobile/tct-badge-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>195</auto_tcn>\r
+ <manual_tcn>35</manual_tcn>\r
+ <total_tcn>230</total_tcn>\r
+ <pkg_name>mobile/tct-nfc-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>mobile/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contact-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>441</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>441</total_tcn>\r
+ <pkg_name>mobile/tct-contact-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>245</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>245</total_tcn>\r
+ <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-notification-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>82</manual_tcn>\r
+ <total_tcn>150</total_tcn>\r
+ <pkg_name>mobile/tct-widget02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>mobile/tct-websetting-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>333</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>334</total_tcn>\r
+ <pkg_name>mobile/tct-audio-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screenorientation-w3c-tests" launcher="xwalk" category="W3C/HTML5 APIs">\r
+ <auto_tcn>17</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>17</total_tcn>\r
+ <pkg_name>mobile/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>mobile/tct-sound-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>184</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>192</total_tcn>\r
+ <pkg_name>mobile/tct-application-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>257</auto_tcn>\r
+ <manual_tcn>142</manual_tcn>\r
+ <total_tcn>399</total_tcn>\r
+ <pkg_name>mobile/tct-bluetooth-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>mobile/tct-humanactivitymonitor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>131</manual_tcn>\r
+ <total_tcn>142</total_tcn>\r
+ <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-speech-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-ui01-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-inputdevice-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webaudio-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>422</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>422</total_tcn>\r
+ <pkg_name>mobile/tct-webaudio-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filewriterapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>mobile/tct-filewriterapi-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>119</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>119</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>mobile/tct-secureelement-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>56</total_tcn>\r
+ <pkg_name>mobile/tct-power-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>65</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>65</total_tcn>\r
+ <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>60</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-touchevent-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <!--\r
+ <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ -->\r
+ <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-account-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>89</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>89</total_tcn>\r
+ <pkg_name>mobile/tct-account-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>mobile/tct-widget01-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bookmark-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>mobile/tct-bookmark-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>354</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>354</total_tcn>\r
+ <pkg_name>mobile/tct-calendar-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <!--\r
+ <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>mobile/tct-geoallow-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ -->\r
+ <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>148</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>149</total_tcn>\r
+ <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>113</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>113</total_tcn>\r
+ <pkg_name>mobile/tct-datacontrol-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-appcontrol-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-callhistory-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>27</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>mobile/tct-callhistory-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <!--\r
+ <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-geodeny-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ -->\r
+ <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>845</auto_tcn>\r
+ <manual_tcn>19</manual_tcn>\r
+ <total_tcn>864</total_tcn>\r
+ <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>44</total_tcn>\r
+ <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sse-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>68</total_tcn>\r
+ <pkg_name>mobile/tct-sse-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <!--\r
+ <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>33</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ -->\r
+ <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>mobile/tct-batterystatus-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacontroller-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>162</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>165</total_tcn>\r
+ <pkg_name>mobile/tct-mediacontroller-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>304</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>304</total_tcn>\r
+ <pkg_name>mobile/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>289</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>292</total_tcn>\r
+ <pkg_name>mobile/tct-filesystem-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-sms-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>184</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>184</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-sms-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>mobile/tct-vibration-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>177</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>181</total_tcn>\r
+ <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>mobile/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-systemsetting-tizen-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>541</auto_tcn>\r
+ <manual_tcn>74</manual_tcn>\r
+ <total_tcn>615</total_tcn>\r
+ <pkg_name>mobile/tct-backgrounds-css3-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>361</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>365</total_tcn>\r
+ <pkg_name>mobile/tct-video-html5-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>889</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>889</total_tcn>\r
+ <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_mobile_3.0" profile="mobile">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-jsenhance-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-jsenhance-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-multicolumn-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>136</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>154</total_tcn>\r
+ <pkg_name>common/tct-multicolumn-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-mms-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>123</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>123</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-mms-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-devicemotion-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>common/tct-devicemotion-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-workers-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>77</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-workers-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-transitions-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-transitions-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-namespace-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-namespace-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-email-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>307</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>308</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-email-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-network-information-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-network-information-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-crypto-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-crypto-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-2dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>common/tct-2dtransforms-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dialogs-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>9</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-dialogs-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-time-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>470</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>470</total_tcn>\r
+ <pkg_name>mobile/tct-time-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-forms-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>common/tct-forms-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capability-tests" category="Compliance">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-capability-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fileapi-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>38</total_tcn>\r
+ <pkg_name>common/tct-fileapi-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacapture-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-mediacapture-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>mobile/tct-ext01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-exif-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>64</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>64</total_tcn>\r
+ <pkg_name>common/tct-exif-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-csp-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>137</auto_tcn>\r
+ <manual_tcn>83</manual_tcn>\r
+ <total_tcn>220</total_tcn>\r
+ <pkg_name>common/tct-csp-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>209</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>209</total_tcn>\r
+ <pkg_name>mobile/tct-privilege-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediakey-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>mobile/tct-mediakey-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>52</total_tcn>\r
+ <pkg_name>common/tct-media-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>mobile/tct-deviceorientation-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webmessaging-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>175</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>175</total_tcn>\r
+ <pkg_name>common/tct-webmessaging-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-file-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>172</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>172</total_tcn>\r
+ <pkg_name>common/tct-file-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>12</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-package-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-template-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-template-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>96</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>96</total_tcn>\r
+ <pkg_name>common/tct-notification-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fmradio-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>mobile/tct-fmradio-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-rt01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcache-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>common/tct-appcache-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-svg-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>14</manual_tcn>\r
+ <total_tcn>57</total_tcn>\r
+ <pkg_name>common/tct-svg-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websocket-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>266</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>266</total_tcn>\r
+ <pkg_name>common/tct-websocket-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-flexiblebox-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>14</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>common/tct-flexiblebox-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dnd-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-dnd-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-extra-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>548</auto_tcn>\r
+ <manual_tcn>25</manual_tcn>\r
+ <total_tcn>573</total_tcn>\r
+ <pkg_name>common/tct-extra-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fullscreen-nonw3c-tests" category="Supplementary APIs">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>common/tct-fullscreen-nonw3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-colors-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>29</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>common/tct-colors-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-indexeddb-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>343</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>343</total_tcn>\r
+ <pkg_name>common/tct-indexeddb-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sandbox-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>46</total_tcn>\r
+ <pkg_name>common/tct-sandbox-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-networkbearerselection-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>mobile/tct-networkbearerselection-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messageport-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>51</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>51</total_tcn>\r
+ <pkg_name>common/tct-messageport-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/tct-push-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-browserstate-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-browserstate-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cors-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-cors-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-xmlhttprequest-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>212</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>212</total_tcn>\r
+ <pkg_name>common/tct-xmlhttprequest-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-navigationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>common/tct-navigationtiming-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-typedarrays-nonw3c-tests" category="Supplementary APIs">\r
+ <auto_tcn>446</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>446</total_tcn>\r
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animations-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>common/tct-animations-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>mobile/tct-badge-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>218</auto_tcn>\r
+ <manual_tcn>37</manual_tcn>\r
+ <total_tcn>255</total_tcn>\r
+ <pkg_name>mobile/tct-nfc-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pagevisibility-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>common/tct-pagevisibility-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ResponsiveImage-w3c-tests" category="Tizen W3C APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-ResponsiveImage-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-content-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>245</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>245</total_tcn>\r
+ <pkg_name>common/tct-content-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-contact-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>479</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>479</total_tcn>\r
+ <pkg_name>mobile/tct-contact-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-gumallow-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-gumallow-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>39</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>mobile/tct-notification-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-serviceworkers-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-serviceworkers-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-preference-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>mobile/tct-preference-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-globalization-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-globalization-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-sp01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>75</manual_tcn>\r
+ <total_tcn>143</total_tcn>\r
+ <pkg_name>mobile/tct-widget02-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websetting-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>mobile/tct-websetting-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>152</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>152</total_tcn>\r
+ <pkg_name>common/tct-audio-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-import-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-import-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screenorientation-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-screenorientation-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt02-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-rt02-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp02-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-sp02-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>mobile/tct-sound-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext02-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>common/tct-ext02-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>193</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>199</total_tcn>\r
+ <pkg_name>mobile/tct-application-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-humanactivitymonitor-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>87</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>102</total_tcn>\r
+ <pkg_name>common/tct-humanactivitymonitor-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>255</auto_tcn>\r
+ <manual_tcn>147</manual_tcn>\r
+ <total_tcn>402</total_tcn>\r
+ <pkg_name>mobile/tct-bluetooth-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fonts-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>131</manual_tcn>\r
+ <total_tcn>143</total_tcn>\r
+ <pkg_name>common/tct-fonts-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-speech-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>87</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>91</total_tcn>\r
+ <pkg_name>common/tct-speech-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-security-tcs-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>mobile/tct-ui01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>common/tct-animationtiming-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel2-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi01-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-wgtapi01-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webaudio-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>257</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>257</total_tcn>\r
+ <pkg_name>common/tct-webaudio-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-inputdevice-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>39</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>mobile/tct-inputdevice-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-secureelement-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>102</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>102</total_tcn>\r
+ <pkg_name>mobile/tct-secureelement-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>166</auto_tcn>\r
+ <manual_tcn>21</manual_tcn>\r
+ <total_tcn>187</total_tcn>\r
+ <pkg_name>mobile/tct-sensor-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-power-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>56</total_tcn>\r
+ <pkg_name>mobile/tct-power-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>common/tct-privilege-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-alarm-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>60</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>common/tct-alarm-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-touchevent-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>common/tct-touchevent-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-woff-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>22</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-woff-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-wgtapi02-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-archive-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-archive-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-account-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>90</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>90</total_tcn>\r
+ <pkg_name>mobile/tct-account-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tizen-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>common/tct-tizen-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget01-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>common/tct-widget01-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bookmark-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>mobile/tct-bookmark-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-3dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-3dtransforms-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-calendar-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>355</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>355</total_tcn>\r
+ <pkg_name>mobile/tct-calendar-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geoallow-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>209</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>212</total_tcn>\r
+ <pkg_name>common/tct-geoallow-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sessionhistory-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>117</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>119</total_tcn>\r
+ <pkg_name>common/tct-sessionhistory-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-datacontrol-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>115</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>115</total_tcn>\r
+ <pkg_name>common/tct-datacontrol-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-callhistory-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>27</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>mobile/tct-callhistory-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcontrol-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>5</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>5</total_tcn>\r
+ <pkg_name>mobile/tct-appcontrol-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-events-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-events-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geodeny-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-geodeny-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-ui-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-canvas-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>848</auto_tcn>\r
+ <manual_tcn>20</manual_tcn>\r
+ <total_tcn>868</total_tcn>\r
+ <pkg_name>common/tct-canvas-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-keymanager-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>39</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>39</total_tcn>\r
+ <pkg_name>common/tct-keymanager-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel1-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sse-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>66</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-sse-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widgetpolicy-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>22</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-batterystatus-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>common/tct-batterystatus-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacontroller-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>162</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>165</total_tcn>\r
+ <pkg_name>common/tct-mediacontroller-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>289</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>292</total_tcn>\r
+ <pkg_name>mobile/tct-filesystem-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systeminfo-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>382</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>382</total_tcn>\r
+ <pkg_name>mobile/tct-systeminfo-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-feedback-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>mobile/tct-feedback-tizen-tests-3.0.zip</pkg_name>\r
+ </suite> \r
+ <suite name="tct-file-transfer-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-file-transfer-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-customelement-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-customelement-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-device-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-beacon-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-beacon-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vibration-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>common/tct-vibration-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messaging-sms-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>184</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>184</total_tcn>\r
+ <pkg_name>mobile/tct-messaging-sms-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-text-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>common/tct-text-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stab-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-stab-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webstorage-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>195</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>200</total_tcn>\r
+ <pkg_name>common/tct-webstorage-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-download-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>common/tct-download-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediaqueries-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>63</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>63</total_tcn>\r
+ <pkg_name>common/tct-mediaqueries-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systemsetting-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>mobile/tct-systemsetting-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>197</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>200</total_tcn>\r
+ <pkg_name>common/tct-video-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>541</auto_tcn>\r
+ <manual_tcn>74</manual_tcn>\r
+ <total_tcn>615</total_tcn>\r
+ <pkg_name>common/tct-backgrounds-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pm-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-pm-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webgl-nonw3c-tests" category="Supplementary APIs">\r
+ <auto_tcn>910</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>911</total_tcn>\r
+ <pkg_name>common/tct-webgl-nonw3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<ns3:testplan name="Web_Full_tv_2.4" profile="tv" xmlns="" xmlns:ns3="http://www.example.org/plan/">
+ <execute_type>Auto</execute_type>
+ <suite launcher="WRTLauncher" name="tct-animationtiming-w3c-tests">
+ <auto_tcn>11</auto_tcn>
+ <manual_tcn>7</manual_tcn>
+ <total_tcn>18</total_tcn>
+ <pkg_name>common/tct-animationtiming-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-indexeddb-w3c-tests">
+ <auto_tcn>391</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>391</total_tcn>
+ <pkg_name>tv/tct-indexeddb-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-ext02-wrt-tests">
+ <auto_tcn>8</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>8</total_tcn>
+ <pkg_name>common/tct-ext02-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-pagevisibility-w3c-tests">
+ <auto_tcn>18</auto_tcn>
+ <manual_tcn>2</manual_tcn>
+ <total_tcn>20</total_tcn>
+ <pkg_name>tv/tct-pagevisibility-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-ext01-wrt-tests">
+ <auto_tcn>2</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>2</total_tcn>
+ <pkg_name>tv/tct-ext01-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-websocket-w3c-tests">
+ <auto_tcn>268</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>268</total_tcn>
+ <pkg_name>tv/tct-websocket-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-content-tizen-tests">
+ <auto_tcn>245</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>245</total_tcn>
+ <pkg_name>common/tct-content-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-flexiblebox-css3-tests">
+ <auto_tcn>25</auto_tcn>
+ <manual_tcn>28</manual_tcn>
+ <total_tcn>53</total_tcn>
+ <pkg_name>common/tct-flexiblebox-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tv-channel-tizen-tests">
+ <auto_tcn>166</auto_tcn>
+ <manual_tcn>3</manual_tcn>
+ <total_tcn>169</total_tcn>
+ <pkg_name>tv/tct-tv-channel-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-rt01-wrt-tests">
+ <auto_tcn>12</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>12</total_tcn>
+ <pkg_name>common/tct-rt01-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-multicolumn-css3-tests">
+ <auto_tcn>141</auto_tcn>
+ <manual_tcn>18</manual_tcn>
+ <total_tcn>159</total_tcn>
+ <pkg_name>tv/tct-multicolumn-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-appwgt-wrt-tests">
+ <auto_tcn>7</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>7</total_tcn>
+ <pkg_name>common/tct-appwgt-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-archive-tizen-tests">
+ <auto_tcn>106</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>106</total_tcn>
+ <pkg_name>common/tct-archive-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-gumallow-w3c-tests">
+ <auto_tcn>6</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>6</total_tcn>
+ <pkg_name>common/tct-gumallow-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-fullscreen-nonw3c-tests">
+ <auto_tcn>16</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>16</total_tcn>
+ <pkg_name>tv/tct-fullscreen-nonw3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-mediacapture-w3c-tests">
+ <auto_tcn>7</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>7</total_tcn>
+ <pkg_name>common/tct-mediacapture-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-jsenhance-html5-tests">
+ <auto_tcn>49</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>49</total_tcn>
+ <pkg_name>common/tct-jsenhance-html5-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-pm-wrt-tests">
+ <auto_tcn>24</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>24</total_tcn>
+ <pkg_name>common/tct-pm-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-wgtapi02-w3c-tests">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>34</manual_tcn>
+ <total_tcn>34</total_tcn>
+ <pkg_name>common/tct-wgtapi02-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-widgetpolicy-w3c-tests">
+ <auto_tcn>0</auto_tcn>
+ <manual_tcn>33</manual_tcn>
+ <total_tcn>33</total_tcn>
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-mediaqueries-css3-tests">
+ <auto_tcn>52</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>52</total_tcn>
+ <pkg_name>tv/tct-mediaqueries-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-typedarrays-nonw3c-tests">
+ <auto_tcn>80</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>80</total_tcn>
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-webaudio-w3c-tests">
+ <auto_tcn>422</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>422</total_tcn>
+ <pkg_name>tv/tct-webaudio-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-widget02-w3c-tests">
+ <auto_tcn>68</auto_tcn>
+ <manual_tcn>49</manual_tcn>
+ <total_tcn>117</total_tcn>
+ <pkg_name>tv/tct-widget02-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-filesystem-tizen-tests">
+ <auto_tcn>291</auto_tcn>
+ <manual_tcn>3</manual_tcn>
+ <total_tcn>294</total_tcn>
+ <pkg_name>tv/tct-filesystem-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-keymanager-tizen-tests">
+ <auto_tcn>39</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>39</total_tcn>
+ <pkg_name>tv/tct-keymanager-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-webgl-nonw3c-tests">
+ <auto_tcn>889</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>889</total_tcn>
+ <pkg_name>common/tct-webgl-nonw3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-download-tizen-tests">
+ <auto_tcn>62</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>62</total_tcn>
+ <pkg_name>common/tct-download-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-selectorslevel2-w3c-tests">
+ <auto_tcn>30</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>30</total_tcn>
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tv-displaycontrol-tizen-tests">
+ <auto_tcn>20</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>20</total_tcn>
+ <pkg_name>tv/tct-tv-displaycontrol-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-alarm-tizen-tests">
+ <auto_tcn>60</auto_tcn>
+ <manual_tcn>1</manual_tcn>
+ <total_tcn>61</total_tcn>
+ <pkg_name>common/tct-alarm-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-inputdevice-tizen-tests">
+ <auto_tcn>30</auto_tcn>
+ <manual_tcn>3</manual_tcn>
+ <total_tcn>33</total_tcn>
+ <pkg_name>tv/tct-inputdevice-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-websetting-tizen-tests">
+ <auto_tcn>22</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>22</total_tcn>
+ <pkg_name>tv/tct-websetting-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-messageport-tizen-tests">
+ <auto_tcn>48</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>48</total_tcn>
+ <pkg_name>common/tct-messageport-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-privilege-tizen-tests">
+ <auto_tcn>65</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>65</total_tcn>
+ <pkg_name>common/tct-privilege-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-sse-w3c-tests">
+ <auto_tcn>68</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>68</total_tcn>
+ <pkg_name>tv/tct-sse-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-namespace-tizen-tests">
+ <auto_tcn>23</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>23</total_tcn>
+ <pkg_name>common/tct-namespace-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tv-window-tizen-tests">
+ <auto_tcn>81</auto_tcn>
+ <manual_tcn>4</manual_tcn>
+ <total_tcn>85</total_tcn>
+ <pkg_name>tv/tct-tv-window-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-maxLength-wrt-tests">
+ <auto_tcn>14</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>14</total_tcn>
+ <pkg_name>common/tct-maxLength-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tv-audiocontrol-tizen-tests">
+ <auto_tcn>61</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>61</total_tcn>
+ <pkg_name>tv/tct-tv-audiocontrol-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-xmlhttprequest-w3c-tests">
+ <auto_tcn>202</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>202</total_tcn>
+ <pkg_name>tv/tct-xmlhttprequest-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-security-tcs-tests">
+ <auto_tcn>3</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>common/tct-security-tcs-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-backgrounds-css3-tests">
+ <auto_tcn>541</auto_tcn>
+ <manual_tcn>74</manual_tcn>
+ <total_tcn>615</total_tcn>
+ <pkg_name>tv/tct-backgrounds-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-webstorage-w3c-tests">
+ <auto_tcn>177</auto_tcn>
+ <manual_tcn>4</manual_tcn>
+ <total_tcn>181</total_tcn>
+ <pkg_name>common/tct-webstorage-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-package-tizen-tests">
+ <auto_tcn>54</auto_tcn>
+ <manual_tcn>12</manual_tcn>
+ <total_tcn>66</total_tcn>
+ <pkg_name>common/tct-package-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-text-css3-tests">
+ <auto_tcn>27</auto_tcn>
+ <manual_tcn>15</manual_tcn>
+ <total_tcn>42</total_tcn>
+ <pkg_name>common/tct-text-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-systeminfo-tizen-tests">
+ <auto_tcn>296</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>296</total_tcn>
+ <pkg_name>tv/tct-systeminfo-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-sandbox-html5-tests">
+ <auto_tcn>72</auto_tcn>
+ <manual_tcn>1</manual_tcn>
+ <total_tcn>73</total_tcn>
+ <pkg_name>common/tct-sandbox-html5-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-sp02-wrt-tests">
+ <auto_tcn>1</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>common/tct-sp02-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-selectorslevel1-w3c-tests">
+ <auto_tcn>78</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>78</total_tcn>
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-csp-w3c-tests">
+ <auto_tcn>133</auto_tcn>
+ <manual_tcn>78</manual_tcn>
+ <total_tcn>211</total_tcn>
+ <pkg_name>tv/tct-csp-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-colors-css3-tests">
+ <auto_tcn>46</auto_tcn>
+ <manual_tcn>29</manual_tcn>
+ <total_tcn>75</total_tcn>
+ <pkg_name>common/tct-colors-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tv-info-tizen-tests">
+ <auto_tcn>23</auto_tcn>
+ <manual_tcn>3</manual_tcn>
+ <total_tcn>26</total_tcn>
+ <pkg_name>tv/tct-tv-info-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-2dtransforms-css3-tests">
+ <auto_tcn>34</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>34</total_tcn>
+ <pkg_name>common/tct-2dtransforms-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-application-tizen-tests">
+ <auto_tcn>183</auto_tcn>
+ <manual_tcn>6</manual_tcn>
+ <total_tcn>189</total_tcn>
+ <pkg_name>tv/tct-application-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-forms-html5-tests">
+ <auto_tcn>146</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>146</total_tcn>
+ <pkg_name>tv/tct-forms-html5-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-tizen-tizen-tests">
+ <auto_tcn>81</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>81</total_tcn>
+ <pkg_name>common/tct-tizen-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-cors-w3c-tests">
+ <auto_tcn>10</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>10</total_tcn>
+ <pkg_name>common/tct-cors-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-exif-tizen-tests">
+ <auto_tcn>64</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>64</total_tcn>
+ <pkg_name>common/tct-exif-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-capability-tests">
+ <auto_tcn>15</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>15</total_tcn>
+ <pkg_name>common/tct-capability-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-fileapi-w3c-tests">
+ <auto_tcn>97</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>97</total_tcn>
+ <pkg_name>tv/tct-fileapi-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-browserstate-html5-tests">
+ <auto_tcn>3</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>tv/tct-browserstate-html5-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-canvas-html5-tests">
+ <auto_tcn>846</auto_tcn>
+ <manual_tcn>18</manual_tcn>
+ <total_tcn>864</total_tcn>
+ <pkg_name>common/tct-canvas-html5-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-widget01-w3c-tests">
+ <auto_tcn>73</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>73</total_tcn>
+ <pkg_name>tv/tct-widget01-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-time-tizen-tests">
+ <auto_tcn>459</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>459</total_tcn>
+ <pkg_name>tv/tct-time-tizen-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-ui01-wrt-tests">
+ <auto_tcn>11</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>11</total_tcn>
+ <pkg_name>tv/tct-ui01-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-appcache-html5-tests">
+ <auto_tcn>36</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>36</total_tcn>
+ <pkg_name>tv/tct-appcache-html5-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-screenorientation-w3c-tests">
+ <auto_tcn>17</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>17</total_tcn>
+ <pkg_name>tv/tct-screenorientation-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-rt02-wrt-tests">
+ <auto_tcn>3</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>3</total_tcn>
+ <pkg_name>common/tct-rt02-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-sp01-wrt-tests">
+ <auto_tcn>4</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>4</total_tcn>
+ <pkg_name>common/tct-sp01-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-svg-html5-tests">
+ <auto_tcn>3</auto_tcn>
+ <manual_tcn>9</manual_tcn>
+ <total_tcn>12</total_tcn>
+ <pkg_name>common/tct-svg-html5-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-sessionhistory-html5-tests">
+ <auto_tcn>148</auto_tcn>
+ <manual_tcn>1</manual_tcn>
+ <total_tcn>149</total_tcn>
+ <pkg_name>common/tct-sessionhistory-html5-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-workers-w3c-tests">
+ <auto_tcn>84</auto_tcn>
+ <manual_tcn>1</manual_tcn>
+ <total_tcn>85</total_tcn>
+ <pkg_name>tv/tct-workers-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-wgtapi01-w3c-tests">
+ <auto_tcn>107</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>107</total_tcn>
+ <pkg_name>common/tct-wgtapi01-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-3dtransforms-css3-tests">
+ <auto_tcn>32</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>32</total_tcn>
+ <pkg_name>common/tct-3dtransforms-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-transitions-css3-tests">
+ <auto_tcn>26</auto_tcn>
+ <manual_tcn>5</manual_tcn>
+ <total_tcn>31</total_tcn>
+ <pkg_name>common/tct-transitions-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-stab-wrt-tests">
+ <auto_tcn>1</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>1</total_tcn>
+ <pkg_name>common/tct-stab-wrt-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-animations-css3-tests">
+ <auto_tcn>24</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>24</total_tcn>
+ <pkg_name>common/tct-animations-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-fonts-css3-tests">
+ <auto_tcn>11</auto_tcn>
+ <manual_tcn>131</manual_tcn>
+ <total_tcn>142</total_tcn>
+ <pkg_name>common/tct-fonts-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-navigationtiming-w3c-tests">
+ <auto_tcn>45</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>45</total_tcn>
+ <pkg_name>tv/tct-navigationtiming-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-ui-css3-tests">
+ <auto_tcn>43</auto_tcn>
+ <manual_tcn>1</manual_tcn>
+ <total_tcn>44</total_tcn>
+ <pkg_name>common/tct-ui-css3-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-extra-html5-tests">
+ <auto_tcn>544</auto_tcn>
+ <manual_tcn>25</manual_tcn>
+ <total_tcn>569</total_tcn>
+ <pkg_name>tv/tct-extra-html5-tests-2.4.zip</pkg_name>
+ </suite>
+ <suite launcher="WRTLauncher" name="tct-webmessaging-w3c-tests">
+ <auto_tcn>175</auto_tcn>
+ <manual_tcn>0</manual_tcn>
+ <total_tcn>175</total_tcn>
+ <pkg_name>tv/tct-webmessaging-w3c-tests-2.4.zip</pkg_name>
+ </suite>
+</ns3:testplan>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_tv_3.0" profile="tv">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-jsenhance-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-jsenhance-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-multicolumn-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>136</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>154</total_tcn>\r
+ <pkg_name>common/tct-multicolumn-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-devicemotion-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>common/tct-devicemotion-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-workers-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>77</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-workers-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-namespace-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>tv/tct-namespace-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-transitions-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-transitions-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-network-information-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-network-information-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-crypto-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-crypto-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-2dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>common/tct-2dtransforms-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dialogs-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>9</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-dialogs-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-time-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>454</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>454</total_tcn>\r
+ <pkg_name>tv/tct-time-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-forms-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>common/tct-forms-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capability-tests" category="Compliance">\r
+ <auto_tcn>35</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>35</total_tcn>\r
+ <pkg_name>common/tct-capability-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fileapi-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>common/tct-fileapi-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>tv/tct-ext01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacapture-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-mediacapture-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-exif-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>64</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>64</total_tcn>\r
+ <pkg_name>common/tct-exif-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-csp-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>137</auto_tcn>\r
+ <manual_tcn>83</manual_tcn>\r
+ <total_tcn>220</total_tcn>\r
+ <pkg_name>common/tct-csp-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>95</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>95</total_tcn>\r
+ <pkg_name>tv/tct-privilege-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mse-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>95</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>95</total_tcn>\r
+ <pkg_name>tv/tct-mse-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>57</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>57</total_tcn>\r
+ <pkg_name>common/tct-media-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webmessaging-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>175</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>175</total_tcn>\r
+ <pkg_name>common/tct-webmessaging-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>12</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-package-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-file-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>172</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>172</total_tcn>\r
+ <pkg_name>common/tct-file-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>96</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>96</total_tcn>\r
+ <pkg_name>common/tct-notification-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-template-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-template-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-rt01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcache-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>common/tct-appcache-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-svg-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>14</manual_tcn>\r
+ <total_tcn>57</total_tcn>\r
+ <pkg_name>common/tct-svg-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websocket-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>266</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>266</total_tcn>\r
+ <pkg_name>common/tct-websocket-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-flexiblebox-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>14</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>common/tct-flexiblebox-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dnd-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-dnd-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-extra-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>548</auto_tcn>\r
+ <manual_tcn>25</manual_tcn>\r
+ <total_tcn>573</total_tcn>\r
+ <pkg_name>common/tct-extra-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fullscreen-nonw3c-tests" category="Supplementary APIs">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>common/tct-fullscreen-nonw3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-colors-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>29</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>common/tct-colors-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-indexeddb-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>343</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>343</total_tcn>\r
+ <pkg_name>common/tct-indexeddb-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sandbox-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>46</total_tcn>\r
+ <pkg_name>common/tct-sandbox-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messageport-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>51</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>51</total_tcn>\r
+ <pkg_name>common/tct-messageport-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-browserstate-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-browserstate-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cors-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-cors-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-xmlhttprequest-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>212</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>212</total_tcn>\r
+ <pkg_name>common/tct-xmlhttprequest-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-navigationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>common/tct-navigationtiming-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-typedarrays-nonw3c-tests" category="Supplementary APIs">\r
+ <auto_tcn>446</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>446</total_tcn>\r
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animations-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>common/tct-animations-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pagevisibility-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>common/tct-pagevisibility-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ResponsiveImage-w3c-tests" category="Tizen W3C APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-ResponsiveImage-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-content-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>245</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>245</total_tcn>\r
+ <pkg_name>common/tct-content-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-gumallow-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-gumallow-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-serviceworkers-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-serviceworkers-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-globalization-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>116</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>116</total_tcn>\r
+ <pkg_name>common/tct-globalization-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-sp01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>45</manual_tcn>\r
+ <total_tcn>113</total_tcn>\r
+ <pkg_name>tv/tct-widget02-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websetting-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>tv/tct-websetting-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>152</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>152</total_tcn>\r
+ <pkg_name>common/tct-audio-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-import-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-import-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screenorientation-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-screenorientation-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt02-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-rt02-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp02-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-sp02-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext02-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>common/tct-ext02-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>159</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>165</total_tcn>\r
+ <pkg_name>tv/tct-application-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-humanactivitymonitor-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>87</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>102</total_tcn>\r
+ <pkg_name>common/tct-humanactivitymonitor-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fonts-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>131</manual_tcn>\r
+ <total_tcn>143</total_tcn>\r
+ <pkg_name>common/tct-fonts-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-security-tcs-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-speech-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>86</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>91</total_tcn>\r
+ <pkg_name>common/tct-speech-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>tv/tct-ui01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>common/tct-animationtiming-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel2-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi01-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-wgtapi01-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webaudio-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>257</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>257</total_tcn>\r
+ <pkg_name>common/tct-webaudio-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tv-inputdevice-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>tv/tct-tv-inputdevice-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>common/tct-privilege-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-alarm-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>60</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>common/tct-alarm-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-touchevent-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>common/tct-touchevent-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-woff-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>22</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-woff-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-wgtapi02-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-archive-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-archive-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tizen-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>common/tct-tizen-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget01-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>common/tct-widget01-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-3dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-3dtransforms-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geoallow-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>209</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>212</total_tcn>\r
+ <pkg_name>common/tct-geoallow-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sessionhistory-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>117</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>119</total_tcn>\r
+ <pkg_name>common/tct-sessionhistory-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-datacontrol-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>115</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>115</total_tcn>\r
+ <pkg_name>common/tct-datacontrol-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-events-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-events-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geodeny-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-geodeny-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-canvas-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>848</auto_tcn>\r
+ <manual_tcn>20</manual_tcn>\r
+ <total_tcn>868</total_tcn>\r
+ <pkg_name>common/tct-canvas-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-ui-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-keymanager-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>39</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>39</total_tcn>\r
+ <pkg_name>common/tct-keymanager-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel1-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sse-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>66</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-sse-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widgetpolicy-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>22</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-batterystatus-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>common/tct-batterystatus-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systeminfo-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>279</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>279</total_tcn>\r
+ <pkg_name>tv/tct-systeminfo-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>287</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>290</total_tcn>\r
+ <pkg_name>tv/tct-filesystem-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-file-transfer-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-file-transfer-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-customelement-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-customelement-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-device-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-beacon-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-beacon-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vibration-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>common/tct-vibration-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stab-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-stab-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-text-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>common/tct-text-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webstorage-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>195</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>200</total_tcn>\r
+ <pkg_name>common/tct-webstorage-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-download-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>common/tct-download-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediaqueries-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>63</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>63</total_tcn>\r
+ <pkg_name>common/tct-mediaqueries-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>541</auto_tcn>\r
+ <manual_tcn>74</manual_tcn>\r
+ <total_tcn>615</total_tcn>\r
+ <pkg_name>common/tct-backgrounds-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>197</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>200</total_tcn>\r
+ <pkg_name>common/tct-video-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pm-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-pm-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webgl-nonw3c-tests" category="Supplementary APIs">\r
+ <auto_tcn>910</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>911</total_tcn>\r
+ <pkg_name>common/tct-webgl-nonw3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_wearable_2.3.2" profile="wearable">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-preference-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>43</total_tcn>\r
+ <pkg_name>wearable/tct-preference-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-sp01-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>63</manual_tcn>\r
+ <total_tcn>131</total_tcn>\r
+ <pkg_name>wearable/tct-widget02-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-jsenhance-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>common/tct-jsenhance-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>333</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>334</total_tcn>\r
+ <pkg_name>common/tct-audio-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-sp02-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-rt02-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>common/tct-sound-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-workers-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>86</total_tcn>\r
+ <pkg_name>wearable/tct-workers-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext02-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>common/tct-ext02-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-transitions-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>31</total_tcn>\r
+ <pkg_name>common/tct-transitions-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-namespace-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>wearable/tct-namespace-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>162</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>168</total_tcn>\r
+ <pkg_name>common/tct-application-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-humanactivitymonitor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>87</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>102</total_tcn>\r
+ <pkg_name>common/tct-humanactivitymonitor-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>257</auto_tcn>\r
+ <manual_tcn>142</manual_tcn>\r
+ <total_tcn>399</total_tcn>\r
+ <pkg_name>common/tct-bluetooth-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fonts-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>131</manual_tcn>\r
+ <total_tcn>142</total_tcn>\r
+ <pkg_name>common/tct-fonts-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-speech-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-speech-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-security-tcs-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>wearable/tct-ui01-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animationtiming-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>common/tct-animationtiming-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel2-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-2dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-2dtransforms-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-forms-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>146</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>146</total_tcn>\r
+ <pkg_name>wearable/tct-forms-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-time-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>470</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>470</total_tcn>\r
+ <pkg_name>common/tct-time-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-wgtapi01-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capability-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>40</total_tcn>\r
+ <pkg_name>common/tct-capability-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fileapi-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>97</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>97</total_tcn>\r
+ <pkg_name>wearable/tct-fileapi-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>wearable/tct-ext01-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacapture-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-mediacapture-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-exif-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>64</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>64</total_tcn>\r
+ <pkg_name>common/tct-exif-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-csp-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>133</auto_tcn>\r
+ <manual_tcn>78</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>common/tct-csp-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-secureelement-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>common/tct-secureelement-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>146</auto_tcn>\r
+ <manual_tcn>21</manual_tcn>\r
+ <total_tcn>167</total_tcn>\r
+ <pkg_name>common/tct-sensor-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>190</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>190</total_tcn>\r
+ <pkg_name>wearable/tct-privilege-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-power-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>56</total_tcn>\r
+ <pkg_name>common/tct-power-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appwgt-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-appwgt-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>51</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>51</total_tcn>\r
+ <pkg_name>wearable/tct-privilege-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediakey-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-mediakey-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-alarm-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>61</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>common/tct-alarm-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-touchevent-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>16</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-touchevent-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi02-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-wgtapi02-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>common/tct-deviceorientation-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-archive-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-archive-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webmessaging-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>175</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>175</total_tcn>\r
+ <pkg_name>wearable/tct-webmessaging-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>12</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-package-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>85</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>85</total_tcn>\r
+ <pkg_name>common/tct-notification-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tizen-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>common/tct-tizen-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt01-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-rt01-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget01-w3c-tests" launcher="WRTLauncher -iu" category="W3C/HTML5 APIs">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>wearable/tct-widget01-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-svg-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>9</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-svg-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-3dtransforms-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-3dtransforms-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geoallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>208</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>211</total_tcn>\r
+ <pkg_name>common/tct-geoallow-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sessionhistory-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>148</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>149</total_tcn>\r
+ <pkg_name>common/tct-sessionhistory-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websocket-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>268</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>268</total_tcn>\r
+ <pkg_name>wearable/tct-websocket-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-flexiblebox-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>28</manual_tcn>\r
+ <total_tcn>53</total_tcn>\r
+ <pkg_name>common/tct-flexiblebox-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-datacontrol-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>113</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>113</total_tcn>\r
+ <pkg_name>common/tct-datacontrol-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dnd-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-dnd-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-extra-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>544</auto_tcn>\r
+ <manual_tcn>25</manual_tcn>\r
+ <total_tcn>569</total_tcn>\r
+ <pkg_name>wearable/tct-extra-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geodeny-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-geodeny-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-colors-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>29</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>common/tct-colors-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-indexeddb-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>391</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>391</total_tcn>\r
+ <pkg_name>wearable/tct-indexeddb-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sandbox-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>72</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>73</total_tcn>\r
+ <pkg_name>common/tct-sandbox-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-camera-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>83</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>83</total_tcn>\r
+ <pkg_name>wearable/tct-camera-nonw3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>44</total_tcn>\r
+ <pkg_name>common/tct-ui-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-canvas-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>846</auto_tcn>\r
+ <manual_tcn>19</manual_tcn>\r
+ <total_tcn>865</total_tcn>\r
+ <pkg_name>common/tct-canvas-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messageport-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>48</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>48</total_tcn>\r
+ <pkg_name>common/tct-messageport-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>41</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-push-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel1-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widgetpolicy-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-batterystatus-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-batterystatus-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cors-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-cors-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-xmlhttprequest-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>202</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>202</total_tcn>\r
+ <pkg_name>wearable/tct-xmlhttprequest-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-maxLength-wrt-tests" launcher="WRTLauncher -iu" category="Web Runtime">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-maxLength-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>301</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>301</total_tcn>\r
+ <pkg_name>wearable/tct-filesystem-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systeminfo-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>289</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>289</total_tcn>\r
+ <pkg_name>wearable/tct-systeminfo-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-typedarrays-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>80</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>80</total_tcn>\r
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animations-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-animations-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>common/tct-badge-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>194</auto_tcn>\r
+ <manual_tcn>36</manual_tcn>\r
+ <total_tcn>230</total_tcn>\r
+ <pkg_name>common/tct-nfc-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vibration-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>2</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>common/tct-vibration-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pagevisibility-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>wearable/tct-pagevisibility-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stab-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-stab-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-text-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>27</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>common/tct-text-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webstorage-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>177</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>181</total_tcn>\r
+ <pkg_name>common/tct-webstorage-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webuifw-tests" category="Web UI Framework">\r
+ <auto_tcn>524</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>524</total_tcn>\r
+ <pkg_name>wearable/tct-webuifw-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-download-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>common/tct-download-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediaqueries-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>52</total_tcn>\r
+ <pkg_name>wearable/tct-mediaqueries-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-content-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>230</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>230</total_tcn>\r
+ <pkg_name>common/tct-content-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-gumallow-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-gumallow-w3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systemsetting-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>common/tct-systemsetting-tizen-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-html5-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>361</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>365</total_tcn>\r
+ <pkg_name>wearable/tct-video-html5-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>541</auto_tcn>\r
+ <manual_tcn>74</manual_tcn>\r
+ <total_tcn>615</total_tcn>\r
+ <pkg_name>wearable/tct-backgrounds-css3-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pm-wrt-tests" category="Web Runtime">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-pm-wrt-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webgl-nonw3c-tests" launcher="WRTLauncher" category="Supplementary APIs">\r
+ <auto_tcn>889</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>889</total_tcn>\r
+ <pkg_name>common/tct-webgl-nonw3c-tests-2.3.1.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<ns3:testplan xmlns:ns3="http://www.example.org/plan/" xmlns="" name="Web_Full_wearable_3.0" profile="wearable">\r
+ <execute_type>Auto</execute_type>\r
+ <suite name="tct-jsenhance-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-jsenhance-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-multicolumn-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>136</auto_tcn>\r
+ <manual_tcn>18</manual_tcn>\r
+ <total_tcn>154</total_tcn>\r
+ <pkg_name>common/tct-multicolumn-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-devicemotion-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>common/tct-devicemotion-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-workers-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>77</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-workers-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-transitions-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>9</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-transitions-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-namespace-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>wearable/tct-namespace-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-network-information-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-network-information-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-crypto-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>78</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>78</total_tcn>\r
+ <pkg_name>common/tct-crypto-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-2dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>36</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>36</total_tcn>\r
+ <pkg_name>common/tct-2dtransforms-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dialogs-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>13</auto_tcn>\r
+ <manual_tcn>9</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-dialogs-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-time-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>470</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>470</total_tcn>\r
+ <pkg_name>wearable/tct-time-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-forms-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>49</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>49</total_tcn>\r
+ <pkg_name>common/tct-forms-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-capability-tests" category="Compliance">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>common/tct-capability-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fileapi-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>common/tct-fileapi-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>wearable/tct-ext01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacapture-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-mediacapture-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-exif-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>64</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>64</total_tcn>\r
+ <pkg_name>common/tct-exif-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-csp-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>137</auto_tcn>\r
+ <manual_tcn>83</manual_tcn>\r
+ <total_tcn>220</total_tcn>\r
+ <pkg_name>common/tct-csp-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>188</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>188</total_tcn>\r
+ <pkg_name>wearable/tct-privilege-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediakey-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>15</total_tcn>\r
+ <pkg_name>wearable/tct-mediakey-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-media-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>52</total_tcn>\r
+ <pkg_name>common/tct-media-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-deviceorientation-w3c-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>37</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>wearable/tct-deviceorientation-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webmessaging-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>175</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>175</total_tcn>\r
+ <pkg_name>common/tct-webmessaging-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-package-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>54</auto_tcn>\r
+ <manual_tcn>12</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-package-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-file-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>172</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>172</total_tcn>\r
+ <pkg_name>common/tct-file-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-template-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-template-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>96</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>96</total_tcn>\r
+ <pkg_name>common/tct-notification-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>12</total_tcn>\r
+ <pkg_name>common/tct-rt01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-appcache-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>common/tct-appcache-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-svg-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>43</auto_tcn>\r
+ <manual_tcn>14</manual_tcn>\r
+ <total_tcn>57</total_tcn>\r
+ <pkg_name>common/tct-svg-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-websocket-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>266</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>266</total_tcn>\r
+ <pkg_name>common/tct-websocket-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-flexiblebox-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>14</manual_tcn>\r
+ <total_tcn>28</total_tcn>\r
+ <pkg_name>common/tct-flexiblebox-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-dnd-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-dnd-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-extra-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>548</auto_tcn>\r
+ <manual_tcn>25</manual_tcn>\r
+ <total_tcn>573</total_tcn>\r
+ <pkg_name>common/tct-extra-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fullscreen-nonw3c-tests" category="Supplementary APIs">\r
+ <auto_tcn>20</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>common/tct-fullscreen-nonw3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-colors-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>46</auto_tcn>\r
+ <manual_tcn>29</manual_tcn>\r
+ <total_tcn>75</total_tcn>\r
+ <pkg_name>common/tct-colors-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-indexeddb-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>343</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>343</total_tcn>\r
+ <pkg_name>common/tct-indexeddb-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sandbox-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>46</total_tcn>\r
+ <pkg_name>common/tct-sandbox-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-messageport-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>51</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>51</total_tcn>\r
+ <pkg_name>common/tct-messageport-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-push-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>wearable/tct-push-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-browserstate-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-browserstate-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-cors-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-cors-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-xmlhttprequest-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>212</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>212</total_tcn>\r
+ <pkg_name>common/tct-xmlhttprequest-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-navigationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>82</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>82</total_tcn>\r
+ <pkg_name>common/tct-navigationtiming-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-typedarrays-nonw3c-tests" category="Supplementary APIs">\r
+ <auto_tcn>446</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>446</total_tcn>\r
+ <pkg_name>common/tct-typedarrays-nonw3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animations-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>common/tct-animations-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-badge-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>26</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>26</total_tcn>\r
+ <pkg_name>wearable/tct-badge-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-nfc-tizen-tests" launcher="WRTLauncher" category="Tizen Web Device APIs">\r
+ <auto_tcn>195</auto_tcn>\r
+ <manual_tcn>35</manual_tcn>\r
+ <total_tcn>230</total_tcn>\r
+ <pkg_name>wearable/tct-nfc-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pagevisibility-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>18</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>20</total_tcn>\r
+ <pkg_name>common/tct-pagevisibility-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ResponsiveImage-w3c-tests" category="Tizen W3C APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-ResponsiveImage-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-content-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>245</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>245</total_tcn>\r
+ <pkg_name>common/tct-content-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-gumallow-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>6</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>6</total_tcn>\r
+ <pkg_name>common/tct-gumallow-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-notification-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>39</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>42</total_tcn>\r
+ <pkg_name>wearable/tct-notification-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-serviceworkers-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-serviceworkers-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-preference-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>45</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>45</total_tcn>\r
+ <pkg_name>wearable/tct-preference-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-globalization-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-globalization-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-sp01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>68</auto_tcn>\r
+ <manual_tcn>75</manual_tcn>\r
+ <total_tcn>143</total_tcn>\r
+ <pkg_name>wearable/tct-widget02-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-audio-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>152</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>152</total_tcn>\r
+ <pkg_name>common/tct-audio-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-import-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-import-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-screenorientation-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>14</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>14</total_tcn>\r
+ <pkg_name>common/tct-screenorientation-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-rt02-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-rt02-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sp02-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-sp02-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sound-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>52</auto_tcn>\r
+ <manual_tcn>8</manual_tcn>\r
+ <total_tcn>60</total_tcn>\r
+ <pkg_name>wearable/tct-sound-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ext02-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>8</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>8</total_tcn>\r
+ <pkg_name>common/tct-ext02-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-application-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>159</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>165</total_tcn>\r
+ <pkg_name>wearable/tct-application-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-humanactivitymonitor-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>87</auto_tcn>\r
+ <manual_tcn>15</manual_tcn>\r
+ <total_tcn>102</total_tcn>\r
+ <pkg_name>common/tct-humanactivitymonitor-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-bluetooth-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>255</auto_tcn>\r
+ <manual_tcn>145</manual_tcn>\r
+ <total_tcn>400</total_tcn>\r
+ <pkg_name>wearable/tct-bluetooth-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-fonts-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>131</manual_tcn>\r
+ <total_tcn>143</total_tcn>\r
+ <pkg_name>common/tct-fonts-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-speech-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>87</auto_tcn>\r
+ <manual_tcn>4</manual_tcn>\r
+ <total_tcn>91</total_tcn>\r
+ <pkg_name>common/tct-speech-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-security-tcs-tests" launcher="WRTLauncher" category="Compliance">\r
+ <auto_tcn>3</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-security-tcs-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui01-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>11</total_tcn>\r
+ <pkg_name>wearable/tct-ui01-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-animationtiming-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>11</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>common/tct-animationtiming-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel2-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>22</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel2-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi01-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>107</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>107</total_tcn>\r
+ <pkg_name>common/tct-wgtapi01-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webaudio-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>257</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>257</total_tcn>\r
+ <pkg_name>common/tct-webaudio-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-inputdevice-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>30</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>30</total_tcn>\r
+ <pkg_name>wearable/tct-inputdevice-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-secureelement-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>101</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>102</total_tcn>\r
+ <pkg_name>wearable/tct-secureelement-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sensor-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>166</auto_tcn>\r
+ <manual_tcn>21</manual_tcn>\r
+ <total_tcn>187</total_tcn>\r
+ <pkg_name>wearable/tct-sensor-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-power-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>50</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>56</total_tcn>\r
+ <pkg_name>wearable/tct-power-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-privilege-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>71</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>71</total_tcn>\r
+ <pkg_name>common/tct-privilege-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-alarm-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>60</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>61</total_tcn>\r
+ <pkg_name>common/tct-alarm-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-touchevent-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>12</auto_tcn>\r
+ <manual_tcn>7</manual_tcn>\r
+ <total_tcn>19</total_tcn>\r
+ <pkg_name>common/tct-touchevent-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-woff-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>22</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-woff-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-wgtapi02-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>34</manual_tcn>\r
+ <total_tcn>34</total_tcn>\r
+ <pkg_name>common/tct-wgtapi02-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-archive-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>106</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>106</total_tcn>\r
+ <pkg_name>common/tct-archive-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-tizen-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>81</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>81</total_tcn>\r
+ <pkg_name>common/tct-tizen-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widget01-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>155</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>155</total_tcn>\r
+ <pkg_name>common/tct-widget01-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-3dtransforms-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>32</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>32</total_tcn>\r
+ <pkg_name>common/tct-3dtransforms-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geoallow-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>209</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>212</total_tcn>\r
+ <pkg_name>common/tct-geoallow-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sessionhistory-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>117</auto_tcn>\r
+ <manual_tcn>2</manual_tcn>\r
+ <total_tcn>119</total_tcn>\r
+ <pkg_name>common/tct-sessionhistory-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-datacontrol-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>115</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>115</total_tcn>\r
+ <pkg_name>common/tct-datacontrol-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-events-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>6</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-events-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-geodeny-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>3</total_tcn>\r
+ <pkg_name>common/tct-geodeny-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-ui-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>40</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>41</total_tcn>\r
+ <pkg_name>common/tct-ui-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-canvas-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>848</auto_tcn>\r
+ <manual_tcn>20</manual_tcn>\r
+ <total_tcn>868</total_tcn>\r
+ <pkg_name>common/tct-canvas-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-keymanager-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>39</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>39</total_tcn>\r
+ <pkg_name>common/tct-keymanager-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-selectorslevel1-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-selectorslevel1-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-sse-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>66</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>66</total_tcn>\r
+ <pkg_name>common/tct-sse-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-widgetpolicy-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>0</auto_tcn>\r
+ <manual_tcn>22</manual_tcn>\r
+ <total_tcn>22</total_tcn>\r
+ <pkg_name>common/tct-widgetpolicy-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-batterystatus-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>25</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>25</total_tcn>\r
+ <pkg_name>common/tct-batterystatus-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediacontroller-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>162</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>165</total_tcn>\r
+ <pkg_name>wearable/tct-mediacontroller-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-filesystem-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>289</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>289</total_tcn>\r
+ <pkg_name>wearable/tct-filesystem-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systeminfo-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>293</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>293</total_tcn>\r
+ <pkg_name>wearable/tct-systeminfo-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-feedback-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>15</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>18</total_tcn>\r
+ <pkg_name>wearable/tct-feedback-tizen-tests-3.0.zip</pkg_name>\r
+ </suite> <suite name="tct-file-transfer-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>23</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>23</total_tcn>\r
+ <pkg_name>common/tct-file-transfer-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-customelement-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>10</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>10</total_tcn>\r
+ <pkg_name>common/tct-customelement-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-device-cordova-tests" category="Cordova Plugin APIs">\r
+ <auto_tcn>7</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>7</total_tcn>\r
+ <pkg_name>common/tct-device-cordova-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-beacon-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>4</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>4</total_tcn>\r
+ <pkg_name>common/tct-beacon-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-vibration-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>2</total_tcn>\r
+ <pkg_name>common/tct-vibration-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-text-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>34</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>37</total_tcn>\r
+ <pkg_name>common/tct-text-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-stab-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>1</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>1</total_tcn>\r
+ <pkg_name>common/tct-stab-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webstorage-w3c-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>195</auto_tcn>\r
+ <manual_tcn>5</manual_tcn>\r
+ <total_tcn>200</total_tcn>\r
+ <pkg_name>common/tct-webstorage-w3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-download-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>62</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>62</total_tcn>\r
+ <pkg_name>common/tct-download-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-mediaqueries-css3-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>63</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>63</total_tcn>\r
+ <pkg_name>common/tct-mediaqueries-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-systemsetting-tizen-tests" category="Tizen Web Device APIs">\r
+ <auto_tcn>33</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>33</total_tcn>\r
+ <pkg_name>wearable/tct-systemsetting-tizen-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-video-html5-tests" category="W3C/HTML5 APIs">\r
+ <auto_tcn>197</auto_tcn>\r
+ <manual_tcn>3</manual_tcn>\r
+ <total_tcn>200</total_tcn>\r
+ <pkg_name>common/tct-video-html5-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-backgrounds-css3-tests" launcher="WRTLauncher" category="W3C/HTML5 APIs">\r
+ <auto_tcn>541</auto_tcn>\r
+ <manual_tcn>74</manual_tcn>\r
+ <total_tcn>615</total_tcn>\r
+ <pkg_name>common/tct-backgrounds-css3-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-pm-wrt-tests" category="Tizen WRT Core Spec">\r
+ <auto_tcn>24</auto_tcn>\r
+ <manual_tcn>0</manual_tcn>\r
+ <total_tcn>24</total_tcn>\r
+ <pkg_name>common/tct-pm-wrt-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+ <suite name="tct-webgl-nonw3c-tests" category="Supplementary APIs">\r
+ <auto_tcn>910</auto_tcn>\r
+ <manual_tcn>1</manual_tcn>\r
+ <total_tcn>911</total_tcn>\r
+ <pkg_name>common/tct-webgl-nonw3c-tests-3.0.zip</pkg_name>\r
+ </suite>\r
+</ns3:testplan>\r
+\r
--- /dev/null
+#!/usr/bin/python
+
+from glob import glob
+
+from setuptools import setup, find_packages
+
+setup(
+ name = "tct-shell",
+ description = "Console tool for Tizen Compliance Test",
+ author = "Cathy Shen",
+ author_email = "daniel.tao@intel.com",
+ version = "1.0.16",
+ include_package_data = True,
+ data_files = [('/opt/tools/shell/plan', glob('plan/*')),
+ ('/opt/tools/shell/', ['CONFIG', 'LICENSE', 'VERSION']),
+ ('/opt/tools/shell/style', glob('style/*')),
+ ('/opt/tools/', ['tct-shell', 'tct-plan-generator'])],
+ packages = find_packages(),
+)
--- /dev/null
+globals = com.arne.GlobalLogics$ServerLifeCycle\r
+\r
+server.host = 182.254.132.122\r
+server.port = 8080\r
+\r
+platform.imgUrlPattern = http://182.254.132.122/imgStorage/%s\r
+platform.servlet.imgStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/imgStorage"}}\r
+platform.bookUrlPattern = http://182.254.132.122/bookStorage/%s\r
+platform.servlet.bookStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/bookStorage"}}\r
+platform.bookImgUrlPattern = http://182.254.132.122/bookImgStorage/%s\r
+platform.servlet.bookImgStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/bookImgStorage"}}\r
+platform.appUrlPattern = http://182.254.132.122/appStorage/%s\r
+platform.servlet.appStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/appStorage"}}\r
+platform.appTestUrlPattern = http://182.254.132.122/appTestStorage/%s\r
+platform.servlet.appTestStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/appTestStorage"}}\r
+platform.docUrlPattern = http://182.254.132.122/docStorage/%s\r
+platform.servlet.docStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/docStorage"}}\r
+\r
+platform.ysbookImgUrlPattern = http://182.254.132.122/bookImgStorage/%s\r
+platform.servlet.ysbookImgStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/bookImgStorage"}}\r
+\r
+platform.servlet.xmlStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/xml/"}}\r
+platform.attachmentPattern = http://182.254.132.122/Attachments/%s\r
+\r
+platform.ysbookImgUrlPattern.small.flag = 0\r
+platform.ysbookImgUrlPattern.small.width=110\r
+platform.ysbookImgUrlPattern.small = http://182.254.132.122/bookImgStorage/small/%s\r
+platform.servlet.ysbookImgStorage.small = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/bookImgStorage/small"}}\r
+\r
+platform.servlet.qrCodeStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/qrCode/"}}\r
+platform.servlet.qrCodeStr = /home/leader21/sltLeader21/leader21/qrCode/\r
+platform.qrCodePattern = http://182.254.132.122/qrCode/%s\r
+platform.servlet.qrCode.width = 300\r
+platform.servlet.qrCode.height = 300\r
+\r
+platform.xmlStr = /home/leader21/sltLeader21/leader21/xml/\r
+platform.appStr = /home/leader21/sltLeader21/leader21/appStorage/\r
+\r
+platform.test.device.ids = /home/leader21/sltLeader21/leader21/device/ids.txt\r
+\r
+platform.join_act_count = 10\r
+platform.act_fillgolden.join_begin = 2014-02-10 00:00:00\r
+platform.act_fillgolden.join_end = 2014-02-28 23:59:59\r
+\r
+YL.merchantName = LEADER21\r
+YL.merchantId = 802310048992658\r
+YL.password = 61dear86420\r
+YL.private.p12 = /home/leader21/sltLeader21/leader21/PAY.YL/up_61dear_p12.p12\r
+YL.head.cer = /home/leader21/sltLeader21/leader21/PAY.YL/yl8001.cer\r
+YL.merchant_public_cer = /home/leader21/sltLeader21/leader21/PAY.YL/up_61dear_cer.cer\r
+YL.sendUrl = http://mobilepay.unionpaysecure.com/qzjy/MerOrderAction/deal.action\r
+YL.backEndUrl = http://182.254.132.122:8080/order/yl_back\r
+\r
+\r
+ZFB.partner = 2088701185025742\r
+ZFB.private_key = MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAMym9J2yZ1K1/Lq+9V4UqDylZ7JygEk24d9vtFmPbNCGywU5JiQddfif8/lN8XcdpgvoNl1ujiXzpT6w5n2GYEKycg3B8zHcdoU8tWzWVL6GGbeZ/4dLY2U2XMPWtBJ+256ZP9qxN0iyBP8/qex57Ua43goWBRML5TPa/wQaCE2HAgMBAAECgYEAkiYAtsV7CBQy4eIRNBiodHbi8QrYFnD9KSWKtBK68MfyIE7JsCzh3KXOA5HoCNrBg+tXN64GEZBHx9dpIuddwbzZwoKv4DBWKRaIZDgfCyhWfopAYpxcGODngREIsdaBL7MSpElxfl2opMTESTIGSfXi4ZJFNb1kys7NlxjKEfECQQDo1kN+ka1s/Tk/oZHFysaM653oqdi6hTjpqSZJqlK7VAShQoKlR6aDy2phB3HWI2Qc5NJbNbEwqZ0+ISyhldATAkEA4QLmeWj2ZKcMwNitwq9i6Y9h4TZ0jG70B/+JgaayPFplwIjOiLn5rlLF+GRUsDJya/GQGCeAYsMIHUkbJDSDPQJBAOHCh1Uc+VQ5P54kEgz/bX9MIiNrNFq+PA3L1fUNcgRzFb4qmDScAae+v5nvNwCT9klR0Wlg6Tqu62lHj1fpxAMCQHY79OlVGyuWj+ABu4RybnI18oPJ/oIQh1BwmUu0UTHfeloqSQSVXLqaKga0ib+wMmnAHCxlDVRYETp6QLXMli0CQAOaSMnMfTrWwgdSSZVz9YKMqtCa1hzkUekTBQWFryNCLl+z54BMMhBSrj8XcGXkyD9ROzR+8HtS2ofuMn69XC8=\r
+ZFB.seller_id = 2088701185025742\r
+ZFB.log_path = /home/leader21/sltLeader21/leader21/\r
+ZFB.it_b_pay = 30 m\r
+ZFB.show_url = http://182.254.132.122/\r
+ZFB.backEndUrl = http://182.254.132.122:8080/order/zfb_back\r
+ZFB.ali_public_key = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCnxj/9qwVfgoUh/y2W89L6BkRAFljhNhgPdyPuBV64bfQNN1PjbCzkIM6qRdKBoLPXmKKMiFYnkd6rAoprih3/PrQEB/VsW8OoM8fxn67UDYuyBTqA23MML9q1+ilIZwBC2AQ2UBVOrFXfFl75p6/B5KsiNG9zpgmLCUYuLkxpLQIDAQAB\r
+\r
+YB.pay_urlprefix=https://ok.yeepay.com/payapi\r
+YB.paytest_merchantaccount = YB01000000675\r
+YB.paytest_merchant_publickey = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCPGXEFfLsmUVlBzb/4LjH+512G4fjVX9exKfM6ZET+JYNpGoNGTx6Qa1Q9vT4wMKR+fWTyGtjzP2T8AjTbAX4MuhzjxEfoWGzSz4On24F6cdYbcl9ZW92Ejic3w6B9QNkQ6QccOBviBjWlfm59jlfnDzxvibhMjuG/K+MJzfnLZwIDAQAB\r
+YB.paytest_merchant_privatekey = MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAI8ZcQV8uyZRWUHNv/guMf7nXYbh+NVf17Ep8zpkRP4lg2kag0ZPHpBrVD29PjAwpH59ZPIa2PM/ZPwCNNsBfgy6HOPER+hYbNLPg6fbgXpx1htyX1lb3YSOJzfDoH1A2RDpBxw4G+IGNaV+bn2OV+cPPG+JuEyO4b8r4wnN+ctnAgMBAAECgYA8fB92l0svnhDhLIto5nXBbZ/tpFQeNH2h575kPv+egNKzuT4lmMmtd4BK/FNt4RGWWYAyiUCMSI5xqqkWrOHO8yrECuG3HOJOJuDFIZ6IA+4deVujzKGGuShV93Stm0Kkgz4L6Gy3FTiDzSV2Sb4WdSlObbtol8jvYHvdK1if6QJBAMza32yMWd2UzJ8kZLnBZTqO27zxpW523NRC7kP/osJqHqjaa3eTlPSUwHIE79kUtajLnnjSB4ZNNqQBp1OfUtUCQQCy04OOSaeTCMqdw9Z+b9eImkols/b//fH5wm8miK1SYGux4vghIObneOgHA0hZL3z3SRwK1E0Uw9IgZo77t+tLAkAVJvhw7eENlyK1v/1CjOyV6lBYJx9s04sjw7F0hf3ZUznNN5hnJW74/i8M1uOpJ5FGV5gKY61xOaHNt3n+kXHtAkEAqL8ljlh8tCgAot1Rg+BgP/xwaaGoPCrTcz8CChfBjlGEbsliIkjc+6LBORTk6ZwBTYyE1Mc/sY+TspV06Z3FfwJAKQA7ilH5VL7i7hwBF2q83pT5dco/vND1/RanOFgHMmuMrgWckvmWNs0wJh7nqomQVFkoxNRqWngH9/+qGHoD1w==\r
+YB.paytest_yibao_publickey = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDD/yQOpBS2bulX2a+sHLXJPkAfMhF5dgmpc9+wGxOWqzvuxCgjy1Kyb9SwXVqHJtl1S+PA6ZSXdOosRgjVBhKonYU+7CLj0gvDk50mfhzFEM5bSEeM7Vu9G2gwy4yVJKV7lKg6KvGDzwdJpodvT8DS04OaBwcp6zvf6heqYNDyTQIDAQAB\r
+YB.user_id_card = 355533056614185\r
+YB.server_mac_addr = 14-DA-E9-F0-7C-47\r
+YB.server_ip_addr = 210.73.207.184\r
+YB.userua = bkb\r
+YB.callbackurl = http://182.254.132.122:8080/order/yb_back\r
+YB.fcallbackurl = http://182.254.132.122/close.html\r
+\r
+Exam.question.count = 7\r
+platform.servlet.questionStorage = {"class":"com.arne.basedevss.base.sfs.local.LocalSFS", "args":{"dir":"/home/leader21/sltLeader21/leader21/"}}\r
+platform.questionPattern = http://182.254.132.122/%s\r
+platform.questionPatternStr = http://182.254.132.122/\r
+\r
+platform.activity.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.admin.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.apps.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.books.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.examinations.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.history.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.user.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.user_books.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.user_increase.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.user_wealth.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+platform.api.db = mysql/127.0.0.1/leader21/root/ledi!@#qwe\r
+\r
+servlet.activity.class =com.arne.platform.activity.ActivityServlet\r
+servlet.activity.path = /activity/*\r
+servlet.admin.class =com.arne.platform.admin.AdminServlet\r
+servlet.admin.path = /admin/*\r
+servlet.apps.class =com.arne.platform.apps.AppsServlet\r
+servlet.apps.path = /apps/*,/a/*\r
+servlet.books.class =com.arne.platform.books.BooksServlet\r
+servlet.books.path = /books/*\r
+servlet.history.class =com.arne.platform.history.HistoryServlet\r
+servlet.history.path = /history/*\r
+servlet.user.class =com.arne.platform.user.UserServlet\r
+servlet.user.path = /user/*\r
+servlet.userbooks.class =com.arne.platform.user_books.User_booksServlet\r
+servlet.userbooks.path = /userbooks/*\r
+servlet.user_increase.class =com.arne.platform.user_increase.User_increaseServlet\r
+servlet.user_increase.path = /user_increase/*\r
+servlet.userwealth.class =com.arne.platform.user_wealth.User_wealthServlet\r
+servlet.userwealth.path = /userwealth/*\r
+servlet.solutionapi.class =com.arne.platform.solutionapi.SolutionApiServlet\r
+servlet.solutionapi.path = /solutionapi/*\r
+servlet.exam.class =com.arne.platform.exam.ExamServlet\r
+servlet.exam.path = /exam/*\r
+servlet.order.class =com.arne.platform.order.OrderServlet\r
+servlet.order.path = /order/*\r
--- /dev/null
+function getScrollTop() {
+ return f_scrollTop();
+}
+
+function f_scrollTop() {
+ return f_filterResults($(window) ? $(window).scrollTop() : 0,
+ document.documentElement ? document.documentElement.scrollTop : 0,
+ document.body ? document.body.scrollTop : 0);
+}
+function f_filterResults(n_win, n_docel, n_body) {
+ var n_result = n_win ? n_win : 0;
+ if (n_docel && (!n_result || (n_result > n_docel)))
+ n_result = n_docel;
+ return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
+}
+
+function setScrollTop() {
+ $(window) ? $(window).scrollTop(0) : 0;
+ document.documentElement ? document.documentElement.scrollTop = 0 : 0;
+ document.body ? document.body.scrollTop = 0 : 0;
+}
+
+function goTopEx() {
+ $node = $('#goTopBtn');
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+
+ $(window).scroll(function() {
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+ });
+
+ $node.click(function() {
+ setScrollTop();
+ });
+}
+
+function drawRatio() {
+ $('.suite_item').each(function(i, node) {
+ drawSuiteRatio(node)
+ });
+}
+
+$(".see_all").click(function(){
+ $("#see_all").show();
+ $("#see_fail").hide();
+ $("#see_block").hide();
+ $("#see_na").hide();
+ updateToggles();
+ return false;
+});
+
+$(".see_failed").click(function(){
+ $("#see_all").hide();
+ $("#see_fail").show();
+ $("#see_block").hide();
+ $("#see_na").hide();
+ updateToggles();
+ return false;
+});
+
+$(".see_blocked").click(function(){
+ $("#see_all").hide();
+ $("#see_fail").hide();
+ $("#see_block").show();
+ $("#see_na").hide();
+ updateToggles();
+ return false;
+});
+
+$(".see_na").click(function(){
+ $("#see_all").hide();
+ $("#see_fail").hide();
+ $("#see_block").hide();
+ $("#see_na").show();
+ updateToggles();
+ return false;
+});
+
+$("a.test_case_popup").click(function(){
+ var $this = $(this);
+ Popup.show($this.attr('id'));
+ return false;
+});
+
+$(".see_capabilities").click(function(){
+ if ($('#capability_table').css('display') == 'none') {
+ $("#capability_table").show();
+ }else{
+ $("#capability_table").hide();
+ }
+ return false;
+});
+
+function drawSuiteRatio(node) {
+ arrTitle = new Array("Passed", "Failed", "Blocked", "Not Executed");
+ var $node = $(node);
+ var $total = $node.find('.total');
+ var $pass = $node.find('.pass');
+ var $fail = $node.find('.fail');
+ var $block = $node.find('.block');
+ var $na = $node.find('.na');
+ var $div = $node.find('.RatioGraphic');
+
+ var total_int = parseInt($total.text());
+ var pass_int = parseInt($pass.text());
+ var fail_int = parseInt($fail.text());
+ var block_int = parseInt($block.text());
+ var na_int = parseInt($na.text());
+
+ var pass_rate = pass_int * 100 / total_int;
+ var fail_rate = fail_int * 100 / total_int;
+ var block_rate = block_int * 100 / total_int;
+ var na_rate = na_int * 100 / total_int;
+
+ var areaWidth = 380;
+
+ var pass_width = areaWidth * pass_rate / 100;
+ var fail_width = areaWidth * fail_rate / 100;
+ var block_width = areaWidth * block_rate / 100;
+ var na_width = areaWidth * na_rate / 100;
+
+ pass_rate = pass_rate.toFixed(2);
+ fail_rate = fail_rate.toFixed(2);
+ block_rate = block_rate.toFixed(2);
+ na_rate = na_rate.toFixed(2);
+
+ var pass_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/blue.jpg");"
+ var fail_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/red.jpg");"
+ var block_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/orange.jpg");"
+ var na_style = "padding:3px 0px 0px 0px;font-size:9pt;height:17px;text-align:center;color:white;font-weight:bold;background:url("./style/gray.jpg");"
+
+ var html = "<table width=\"380.68\" align=\"center\"><tbody><tr>";
+ if (pass_width > 0){
+ html += "<td width=\""
+ + pass_width
+ + "\" style=\""
+ + pass_style
+ + "\" title=\"Passed :"
+ + pass_rate
+ + "%\">";
+ if (pass_width > 20){
+ html += pass_rate + "%"
+ }
+ html += "</td>";
+ }
+ if (fail_width > 0){
+ html += "<td width=\""
+ + fail_width
+ + "\" style=\""
+ + fail_style
+ + "\" title=\"Failed :"
+ + fail_rate
+ + "%\">";
+ if (fail_width > 20){
+ html += fail_rate + "%"
+ }
+ html += "</td>";
+ }
+ if (block_width > 0){
+ html += "<td width=\""
+ + block_width
+ + "\" style=\""
+ + block_style
+ + "\" title=\"Blocked :"
+ + block_rate
+ + "%\">";
+ if (block_width > 20){
+ html += block_rate + "%"
+ }
+ html += "</td>";
+ }
+ if (na_width > 0){
+ html += "<td width=\""
+ + na_width
+ + "\" style=\""
+ + na_style
+ + "\" title=\"Blocked :"
+ + na_rate
+ + "%\">";
+ if (na_width > 20){
+ html += na_rate + "%"
+ }
+ html += "</td>";
+ }
+ html += "</tr></tbody></table>";
+ $div.html(html);
+}
--- /dev/null
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
--- /dev/null
+/**
+ * Copyright (c)2005-2009 Matt Kruse (javascripttoolbox.com)
+ *
+ * Dual licensed under the MIT and GPL licenses.
+ * This basically means you can use this code however you want for
+ * free, but don't claim to have written it yourself!
+ * Donations always accepted: http://www.JavascriptToolbox.com/donate/
+ *
+ * Please do not link to the .js files on javascripttoolbox.com from
+ * your site. Copy the files locally to your server instead.
+ *
+ */
+/* ******************************************************************* */
+/* UTIL FUNCTIONS */
+/* ******************************************************************* */
+var Util = {'$VERSION':1.06};
+
+// Util functions - these are GLOBAL so they
+// look like built-in functions.
+
+// Determine if an object is an array
+function isArray(o) {
+ return (o!=null && typeof(o)=="object" && typeof(o.length)=="number" && (o.length==0 || defined(o[0])));
+};
+
+// Determine if an object is an Object
+function isObject(o) {
+ return (o!=null && typeof(o)=="object" && defined(o.constructor) && o.constructor==Object && !defined(o.nodeName));
+};
+
+// Determine if a reference is defined
+function defined(o) {
+ return (typeof(o)!="undefined");
+};
+
+// Iterate over an array, object, or list of items and run code against each item
+// Similar functionality to Perl's map() function
+function map(func) {
+ var i,j,o;
+ var results = [];
+ if (typeof(func)=="string") {
+ func = new Function('$_',func);
+ }
+ for (i=1; i<arguments.length; i++) {
+ o = arguments[i];
+ if (isArray(o)) {
+ for (j=0; j<o.length; j++) {
+ results[results.length] = func(o[j]);
+ }
+ }
+ else if (isObject(o)) {
+ for (j in o) {
+ results[results.length] = func(o[j]);
+ }
+ }
+ else {
+ results[results.length] = func(o);
+ }
+ }
+ return results;
+};
+
+// Set default values in an object if they are undefined
+function setDefaultValues(o,values) {
+ if (!defined(o) || o==null) {
+ o = {};
+ }
+ if (!defined(values) || values==null) {
+ return o;
+ }
+ for (var val in values) {
+ if (!defined(o[val])) {
+ o[val] = values[val];
+ }
+ }
+ return o;
+};
+
+/* ******************************************************************* */
+/* DEFAULT OBJECT PROTOTYPE ENHANCEMENTS */
+/* ******************************************************************* */
+// These functions add useful functionality to built-in objects
+Array.prototype.contains = function(o) {
+ var i,l;
+ if (!(l = this.length)) { return false; }
+ for (i=0; i<l; i++) {
+ if (o==this[i]) {
+ return true;
+ }
+ }
+};
+
+/* ******************************************************************* */
+/* DOM FUNCTIONS */
+/* ******************************************************************* */
+var DOM = (function() {
+ var dom = {};
+
+ // Get a parent tag with a given nodename
+ dom.getParentByTagName = function(o,tagNames) {
+ if(o==null) { return null; }
+ if (isArray(tagNames)) {
+ tagNames = map("return $_.toUpperCase()",tagNames);
+ while (o=o.parentNode) {
+ if (o.nodeName && tagNames.contains(o.nodeName)) {
+ return o;
+ }
+ }
+ }
+ else {
+ tagNames = tagNames.toUpperCase();
+ while (o=o.parentNode) {
+ if (o.nodeName && tagNames==o.nodeName) {
+ return o;
+ }
+ }
+ }
+ return null;
+ };
+
+ // Remove a node from its parent
+ dom.removeNode = function(o) {
+ if (o!=null && o.parentNode && o.parentNode.removeChild) {
+ // First remove all attributes which are func references, to avoid memory leaks
+ for (var i in o) {
+ if (typeof(o[i])=="function") {
+ o[i] = null;
+ }
+ }
+ o.parentNode.removeChild(o);
+ return true;
+ }
+ return false;
+ };
+
+ // Get the outer width in pixels of an object, including borders, padding, and margin
+ dom.getOuterWidth = function(o) {
+ if (defined(o.offsetWidth)) {
+ return o.offsetWidth;
+ }
+ return null;
+ };
+
+ // Get the outer height in pixels of an object, including borders, padding, and margin
+ dom.getOuterHeight = function(o) {
+ if (defined(o.offsetHeight)) {
+ return o.offsetHeight;
+ }
+ return null;
+ };
+
+ // Resolve an item, an array of items, or an object of items
+ dom.resolve = function() {
+ var results = new Array();
+ var i,j,o;
+ for (var i=0; i<arguments.length; i++) {
+ var o = arguments[i];
+ if (o==null) {
+ if (arguments.length==1) {
+ return null;
+ }
+ results[results.length] = null;
+ }
+ else if (typeof(o)=='string') {
+ if (document.getElementById) {
+ o = document.getElementById(o);
+ }
+ else if (document.all) {
+ o = document.all[o];
+ }
+ if (arguments.length==1) {
+ return o;
+ }
+ results[results.length] = o;
+ }
+ else if (isArray(o)) {
+ for (j=0; j<o.length; j++) {
+ results[results.length] = o[j];
+ }
+ }
+ else if (isObject(o)) {
+ for (j in o) {
+ results[results.length] = o[j];
+ }
+ }
+ else if (arguments.length==1) {
+ return o;
+ }
+ else {
+ results[results.length] = o;
+ }
+ }
+ return results;
+ };
+ dom.$ = dom.resolve;
+
+ return dom;
+})();
+
+/* ******************************************************************* */
+/* CSS FUNCTIONS */
+/* ******************************************************************* */
+var CSS = (function(){
+ var css = {};
+
+ // Convert an RGB string in the form "rgb (255, 255, 255)" to "#ffffff"
+ css.rgb2hex = function(rgbString) {
+ if (typeof(rgbString)!="string" || !defined(rgbString.match)) { return null; }
+ var result = rgbString.match(/^\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*/);
+ if (result==null) { return rgbString; }
+ var rgb = +result[1] << 16 | +result[2] << 8 | +result[3];
+ var hex = "";
+ var digits = "0123456789abcdef";
+ while(rgb!=0) {
+ hex = digits.charAt(rgb&0xf)+hex;
+ rgb>>>=4;
+ }
+ while(hex.length<6) { hex='0'+hex; }
+ return "#" + hex;
+ };
+
+ // Convert hyphen style names like border-width to camel case like borderWidth
+ css.hyphen2camel = function(property) {
+ if (!defined(property) || property==null) { return null; }
+ if (property.indexOf("-")<0) { return property; }
+ var str = "";
+ var c = null;
+ var l = property.length;
+ for (var i=0; i<l; i++) {
+ c = property.charAt(i);
+ str += (c!="-")?c:property.charAt(++i).toUpperCase();
+ }
+ return str;
+ };
+
+ // Determine if an object or class string contains a given class.
+ css.hasClass = function(obj,className) {
+ if (!defined(obj) || obj==null || !RegExp) { return false; }
+ var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
+ if (typeof(obj)=="string") {
+ return re.test(obj);
+ }
+ else if (typeof(obj)=="object" && obj.className) {
+ return re.test(obj.className);
+ }
+ return false;
+ };
+
+ // Add a class to an object
+ css.addClass = function(obj,className) {
+ if (typeof(obj)!="object" || obj==null || !defined(obj.className)) { return false; }
+ if (obj.className==null || obj.className=='') {
+ obj.className = className;
+ return true;
+ }
+ if (css.hasClass(obj,className)) { return true; }
+ obj.className = obj.className + " " + className;
+ return true;
+ };
+
+ // Remove a class from an object
+ css.removeClass = function(obj,className) {
+ if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
+ if (!css.hasClass(obj,className)) { return false; }
+ var re = new RegExp("(^|\\s+)" + className + "(\\s+|$)");
+ obj.className = obj.className.replace(re,' ');
+ return true;
+ };
+
+ // Fully replace a class with a new one
+ css.replaceClass = function(obj,className,newClassName) {
+ if (typeof(obj)!="object" || obj==null || !defined(obj.className) || obj.className==null) { return false; }
+ css.removeClass(obj,className);
+ css.addClass(obj,newClassName);
+ return true;
+ };
+
+ // Get the currently-applied style of an object
+ css.getStyle = function(o, property) {
+ if (o==null) { return null; }
+ var val = null;
+ var camelProperty = css.hyphen2camel(property);
+ // Handle "float" property as a special case
+ if (property=="float") {
+ val = css.getStyle(o,"cssFloat");
+ if (val==null) {
+ val = css.getStyle(o,"styleFloat");
+ }
+ }
+ else if (o.currentStyle && defined(o.currentStyle[camelProperty])) {
+ val = o.currentStyle[camelProperty];
+ }
+ else if (window.getComputedStyle) {
+ val = window.getComputedStyle(o,null).getPropertyValue(property);
+ }
+ else if (o.style && defined(o.style[camelProperty])) {
+ val = o.style[camelProperty];
+ }
+ // For color values, make the value consistent across browsers
+ // Convert rgb() colors back to hex for consistency
+ if (/^\s*rgb\s*\(/.test(val)) {
+ val = css.rgb2hex(val);
+ }
+ // Lowercase all #hex values
+ if (/^#/.test(val)) {
+ val = val.toLowerCase();
+ }
+ return val;
+ };
+ css.get = css.getStyle;
+
+ // Set a style on an object
+ css.setStyle = function(o, property, value) {
+ if (o==null || !defined(o.style) || !defined(property) || property==null || !defined(value)) { return false; }
+ if (property=="float") {
+ o.style["cssFloat"] = value;
+ o.style["styleFloat"] = value;
+ }
+ else if (property=="opacity") {
+ o.style['-moz-opacity'] = value;
+ o.style['-khtml-opacity'] = value;
+ o.style.opacity = value;
+ if (defined(o.style.filter)) {
+ o.style.filter = "alpha(opacity=" + value*100 + ")";
+ }
+ }
+ else {
+ o.style[css.hyphen2camel(property)] = value;
+ }
+ return true;
+ };
+ css.set = css.setStyle;
+
+ // Get a unique ID which doesn't already exist on the page
+ css.uniqueIdNumber=1000;
+ css.createId = function(o) {
+ if (defined(o) && o!=null && defined(o.id) && o.id!=null && o.id!="") {
+ return o.id;
+ }
+ var id = null;
+ while (id==null || document.getElementById(id)!=null) {
+ id = "ID_"+(css.uniqueIdNumber++);
+ }
+ if (defined(o) && o!=null && (!defined(o.id)||o.id=="")) {
+ o.id = id;
+ }
+ return id;
+ };
+
+ return css;
+})();
+
+/* ******************************************************************* */
+/* EVENT FUNCTIONS */
+/* ******************************************************************* */
+
+var Event = (function(){
+ var ev = {};
+
+ // Resolve an event using IE's window.event if necessary
+ // --------------------------------------------------------------------
+ ev.resolve = function(e) {
+ if (!defined(e) && defined(window.event)) {
+ e = window.event;
+ }
+ return e;
+ };
+
+ // Add an event handler to a function
+ // Note: Don't use 'this' within functions added using this method, since
+ // the attachEvent and addEventListener models differ.
+ // --------------------------------------------------------------------
+ ev.add = function( obj, type, fn, capture ) {
+ if (obj.addEventListener) {
+ obj.addEventListener( type, fn, capture );
+ return true;
+ }
+ else if (obj.attachEvent) {
+ obj.attachEvent( "on"+type, fn );
+ return true;
+ }
+ return false;
+ };
+
+ // Get the mouse position of an event
+ // --------------------------------------------------------------------
+ // PageX/Y, where they exist, are more reliable than ClientX/Y because
+ // of some browser bugs in Opera/Safari
+ ev.getMouseX = function(e) {
+ e = ev.resolve(e);
+ if (defined(e.pageX)) {
+ return e.pageX;
+ }
+ if (defined(e.clientX)) {
+ return e.clientX+Screen.getScrollLeft();
+ }
+ return null;
+ };
+ ev.getMouseY = function(e) {
+ e = ev.resolve(e);
+ if (defined(e.pageY)) {
+ return e.pageY;
+ }
+ if (defined(e.clientY)) {
+ return e.clientY+Screen.getScrollTop();
+ }
+ return null;
+ };
+
+ // Stop the event from bubbling up to parent elements.
+ // Two method names map to the same function
+ // --------------------------------------------------------------------
+ ev.cancelBubble = function(e) {
+ e = ev.resolve(e);
+ if (typeof(e.stopPropagation)=="function") { e.stopPropagation(); }
+ if (defined(e.cancelBubble)) { e.cancelBubble = true; }
+ };
+ ev.stopPropagation = ev.cancelBubble;
+
+ // Prevent the default handling of the event to occur
+ // --------------------------------------------------------------------
+ ev.preventDefault = function(e) {
+ e = ev.resolve(e);
+ if (typeof(e.preventDefault)=="function") { e.preventDefault(); }
+ if (defined(e.returnValue)) { e.returnValue = false; }
+ };
+
+ return ev;
+})();
+
+/* ******************************************************************* */
+/* SCREEN FUNCTIONS */
+/* ******************************************************************* */
+var Screen = (function() {
+ var screen = {};
+
+ // Get a reference to the body
+ // --------------------------------------------------------------------
+ screen.getBody = function() {
+ if (document.body) {
+ return document.body;
+ }
+ if (document.getElementsByTagName) {
+ var bodies = document.getElementsByTagName("BODY");
+ if (bodies!=null && bodies.length>0) {
+ return bodies[0];
+ }
+ }
+ return null;
+ };
+
+ // Get the amount that the main document has scrolled from top
+ // --------------------------------------------------------------------
+ screen.getScrollTop = function() {
+ if (document.documentElement && defined(document.documentElement.scrollTop) && document.documentElement.scrollTop>0) {
+ return document.documentElement.scrollTop;
+ }
+ if (document.body && defined(document.body.scrollTop)) {
+ return document.body.scrollTop;
+ }
+ return null;
+ };
+
+ // Get the amount that the main document has scrolled from left
+ // --------------------------------------------------------------------
+ screen.getScrollLeft = function() {
+ if (document.documentElement && defined(document.documentElement.scrollLeft) && document.documentElement.scrollLeft>0) {
+ return document.documentElement.scrollLeft;
+ }
+ if (document.body && defined(document.body.scrollLeft)) {
+ return document.body.scrollLeft;
+ }
+ return null;
+ };
+
+ // Util function to default a bad number to 0
+ // --------------------------------------------------------------------
+ screen.zero = function(n) {
+ return (!defined(n) || isNaN(n))?0:n;
+ };
+
+ // Get the width of the entire document
+ // --------------------------------------------------------------------
+ screen.getDocumentWidth = function() {
+ var width = 0;
+ var body = screen.getBody();
+ if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ var rightMargin = parseInt(CSS.get(body,'marginRight'),10) || 0;
+ var leftMargin = parseInt(CSS.get(body,'marginLeft'), 10) || 0;
+ width = Math.max(body.offsetWidth + leftMargin + rightMargin, document.documentElement.clientWidth);
+ }
+ else {
+ width = Math.max(body.clientWidth, body.scrollWidth);
+ }
+ if (isNaN(width) || width==0) {
+ width = screen.zero(self.innerWidth);
+ }
+ return width;
+ };
+
+ // Get the height of the entire document
+ // --------------------------------------------------------------------
+ screen.getDocumentHeight = function() {
+ var body = screen.getBody();
+ var innerHeight = (defined(self.innerHeight)&&!isNaN(self.innerHeight))?self.innerHeight:0;
+ if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ var topMargin = parseInt(CSS.get(body,'marginTop'),10) || 0;
+ var bottomMargin = parseInt(CSS.get(body,'marginBottom'), 10) || 0;
+ return Math.max(body.offsetHeight + topMargin + bottomMargin, document.documentElement.clientHeight, document.documentElement.scrollHeight, screen.zero(self.innerHeight));
+ }
+ return Math.max(body.scrollHeight, body.clientHeight, screen.zero(self.innerHeight));
+ };
+
+ // Get the width of the viewport (viewable area) in the browser window
+ // --------------------------------------------------------------------
+ screen.getViewportWidth = function() {
+ if (document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ return document.documentElement.clientWidth;
+ }
+ else if (document.compatMode && document.body) {
+ return document.body.clientWidth;
+ }
+ return screen.zero(self.innerWidth);
+ };
+
+ // Get the height of the viewport (viewable area) in the browser window
+ // --------------------------------------------------------------------
+ screen.getViewportHeight = function() {
+ if (!window.opera && document.documentElement && (!document.compatMode || document.compatMode=="CSS1Compat")) {
+ return document.documentElement.clientHeight;
+ }
+ else if (document.compatMode && !window.opera && document.body) {
+ return document.body.clientHeight;
+ }
+ return screen.zero(self.innerHeight);
+ };
+
+ return screen;
+})();var Sort = (function(){
+ var sort = {};
+ sort.AlphaNumeric = function(a,b) {
+ if (a==b) { return 0; }
+ if (a<b) { return -1; }
+ return 1;
+ };
+
+ sort.Default = sort.AlphaNumeric;
+
+ sort.NumericConversion = function(val) {
+ if (typeof(val)!="number") {
+ if (typeof(val)=="string") {
+ val = parseFloat(val.replace(/,/g,''));
+ if (isNaN(val) || val==null) { val=0; }
+ }
+ else {
+ val = 0;
+ }
+ }
+ return val;
+ };
+
+ sort.Numeric = function(a,b) {
+ return sort.NumericConversion(a)-sort.NumericConversion(b);
+ };
+
+ sort.IgnoreCaseConversion = function(val) {
+ if (val==null) { val=""; }
+ return (""+val).toLowerCase();
+ };
+
+ sort.IgnoreCase = function(a,b) {
+ return sort.AlphaNumeric(sort.IgnoreCaseConversion(a),sort.IgnoreCaseConversion(b));
+ };
+
+ sort.CurrencyConversion = function(val) {
+ if (typeof(val)=="string") {
+ val = val.replace(/^[^\d\.]/,'');
+ }
+ return sort.NumericConversion(val);
+ };
+
+ sort.Currency = function(a,b) {
+ return sort.Numeric(sort.CurrencyConversion(a),sort.CurrencyConversion(b));
+ };
+
+ sort.DateConversion = function(val) {
+ // inner util function to parse date formats
+ function getdate(str) {
+ // inner util function to convert 2-digit years to 4
+ function fixYear(yr) {
+ yr = +yr;
+ if (yr<50) { yr += 2000; }
+ else if (yr<100) { yr += 1900; }
+ return yr;
+ };
+ var ret;
+ // YYYY-MM-DD
+ if (ret=str.match(/(\d{2,4})-(\d{1,2})-(\d{1,2})/)) {
+ return (fixYear(ret[1])*10000) + (ret[2]*100) + (+ret[3]);
+ }
+ // MM/DD/YY[YY] or MM-DD-YY[YY]
+ if (ret=str.match(/(\d{1,2})[\/-](\d{1,2})[\/-](\d{2,4})/)) {
+ return (fixYear(ret[3])*10000) + (ret[1]*100) + (+ret[2]);
+ }
+ return 99999999; // So non-parsed dates will be last, not first
+ };
+ return getdate(val);
+ };
+
+ sort.Date = function(a,b) {
+ return sort.Numeric(sort.DateConversion(a),sort.DateConversion(b));
+ };
+
+ return sort;
+})();
+
+var Position = (function() {
+ // Resolve a string identifier to an object
+ // ========================================
+ function resolveObject(s) {
+ if (document.getElementById && document.getElementById(s)!=null) {
+ return document.getElementById(s);
+ }
+ else if (document.all && document.all[s]!=null) {
+ return document.all[s];
+ }
+ else if (document.anchors && document.anchors.length && document.anchors.length>0 && document.anchors[0].x) {
+ for (var i=0; i<document.anchors.length; i++) {
+ if (document.anchors[i].name==s) {
+ return document.anchors[i]
+ }
+ }
+ }
+ }
+
+ var pos = {};
+ pos.$VERSION = 1.0;
+
+ // Set the position of an object
+ // =============================
+ pos.set = function(o,left,top) {
+ if (typeof(o)=="string") {
+ o = resolveObject(o);
+ }
+ if (o==null || !o.style) {
+ return false;
+ }
+
+ // If the second parameter is an object, it is assumed to be the result of getPosition()
+ if (typeof(left)=="object") {
+ var pos = left;
+ left = pos.left;
+ top = pos.top;
+ }
+
+ o.style.left = left + "px";
+ o.style.top = top + "px";
+ return true;
+ };
+
+ // Retrieve the position and size of an object
+ // ===========================================
+ pos.get = function(o) {
+ var fixBrowserQuirks = true;
+ // If a string is passed in instead of an object ref, resolve it
+ if (typeof(o)=="string") {
+ o = resolveObject(o);
+ }
+
+ if (o==null) {
+ return null;
+ }
+
+ var left = 0;
+ var top = 0;
+ var width = 0;
+ var height = 0;
+ var parentNode = null;
+ var offsetParent = null;
+
+
+ offsetParent = o.offsetParent;
+ var originalObject = o;
+ var el = o; // "el" will be nodes as we walk up, "o" will be saved for offsetParent references
+ while (el.parentNode!=null) {
+ el = el.parentNode;
+ if (el.offsetParent==null) {
+ }
+ else {
+ var considerScroll = true;
+ /*
+ In Opera, if parentNode of the first object is scrollable, then offsetLeft/offsetTop already
+ take its scroll position into account. If elements further up the chain are scrollable, their
+ scroll offsets still need to be added in. And for some reason, TR nodes have a scrolltop value
+ which must be ignored.
+ */
+ if (fixBrowserQuirks && window.opera) {
+ if (el==originalObject.parentNode || el.nodeName=="TR") {
+ considerScroll = false;
+ }
+ }
+ if (considerScroll) {
+ if (el.scrollTop && el.scrollTop>0) {
+ top -= el.scrollTop;
+ }
+ if (el.scrollLeft && el.scrollLeft>0) {
+ left -= el.scrollLeft;
+ }
+ }
+ }
+ // If this node is also the offsetParent, add on the offsets and reset to the new offsetParent
+ if (el == offsetParent) {
+ left += o.offsetLeft;
+ if (el.clientLeft && el.nodeName!="TABLE") {
+ left += el.clientLeft;
+ }
+ top += o.offsetTop;
+ if (el.clientTop && el.nodeName!="TABLE") {
+ top += el.clientTop;
+ }
+ o = el;
+ if (o.offsetParent==null) {
+ if (o.offsetLeft) {
+ left += o.offsetLeft;
+ }
+ if (o.offsetTop) {
+ top += o.offsetTop;
+ }
+ }
+ offsetParent = o.offsetParent;
+ }
+ }
+
+
+ if (originalObject.offsetWidth) {
+ width = originalObject.offsetWidth;
+ }
+ if (originalObject.offsetHeight) {
+ height = originalObject.offsetHeight;
+ }
+
+ return {'left':left, 'top':top, 'width':width, 'height':height
+ };
+ };
+
+ // Retrieve the position of an object's center point
+ // =================================================
+ pos.getCenter = function(o) {
+ var c = this.get(o);
+ if (c==null) { return null; }
+ c.left = c.left + (c.width/2);
+ c.top = c.top + (c.height/2);
+ return c;
+ };
+
+ return pos;
+})();// CLASS CONSTRUCTOR
+// --------------------------------------------------------------------
+var Popup = function(div, options) {
+ this.div = defined(div)?div:null;
+ this.index = Popup.maxIndex++;
+ this.ref = "Popup.objects["+this.index+"]";
+ Popup.objects[this.index] = this;
+ // Store a reference to the DIV by id, also
+ if (typeof(this.div)=="string") {
+ Popup.objectsById[this.div] = this;
+ }
+ if (defined(this.div) && this.div!=null && defined(this.div.id)) {
+ Popup.objectsById[this.div.id] = this.div.id;
+ }
+ // Apply passed-in options
+ if (defined(options) && options!=null && typeof(options)=="object") {
+ for (var i in options) {
+ this[i] = options[i];
+ }
+ }
+ return this;
+};
+
+// CLASS PROPERTIES
+// --------------------------------------------------------------------
+// Index of popup objects, to maintain a global reference if necessary
+Popup.maxIndex = 0;
+Popup.objects = {};
+Popup.objectsById = {};
+
+// The z-index value that popups will start at
+Popup.minZIndex = 101;
+
+// Class names to assign to other objects
+Popup.screenClass = "PopupScreen";
+Popup.iframeClass = "PopupIframe";
+Popup.screenIframeClass = "PopupScreenIframe";
+
+// CLASS METHODS
+// --------------------------------------------------------------------
+
+// Hide all currently-visible non-modal dialogs
+Popup.hideAll = function() {
+ for (var i in Popup.objects) {
+ var p = Popup.objects[i];
+ if (!p.modal && p.autoHide) {
+ p.hide();
+ }
+ }
+};
+// Catch global events as a trigger to hide auto-hide popups
+Event.add(document, "mouseup", Popup.hideAll, false);
+
+// A simple class method to show a popup without creating an instance
+Popup.show = function(divObject, referenceObject, position, options, modal) {
+ var popup;
+ if (defined(divObject)) {
+ popup = new Popup(divObject);
+ }
+ else {
+ popup = new Popup();
+ popup.destroyDivOnHide = true;
+ }
+ if (defined(referenceObject)) { popup.reference = DOM.resolve(referenceObject); }
+ if (defined(position)) { popup.position = position; }
+ if (defined(options) && options!=null && typeof(options)=="object") {
+ for (var i in options) {
+ popup[i] = options[i];
+ }
+ }
+ if (typeof(modal)=="boolean") {
+ popup.modal = modal;
+ }
+ popup.destroyObjectsOnHide = true;
+ popup.show();
+ return popup;
+};
+
+// A simple class method to show a modal popup
+Popup.showModal = function(divObject, referenceObject, position, options) {
+ Popup.show(divObject, referenceObject, position, options, true);
+};
+
+// A method to retrieve a popup object based on a div ID
+Popup.get = function(divId) {
+ if (defined(Popup.objectsById[divId])) {
+ return Popup.objectsById[divId];
+ }
+ return null;
+};
+
+// A method to hide a popup based on a div id
+Popup.hide = function(divId) {
+ var popup = Popup.get(divId);
+ if (popup!=null) {
+ popup.hide();
+ }
+};
+
+// PROTOTYPE PROPERTIES
+// --------------------------------------------------------------------
+Popup.prototype.content = null;
+Popup.prototype.className = "PopupDiv";
+Popup.prototype.style = null; // Styles to be applied to the DIV
+Popup.prototype.width = null;
+Popup.prototype.height = null;
+Popup.prototype.top = null;
+Popup.prototype.left = null;
+Popup.prototype.offsetLeft = 0;
+Popup.prototype.offsetTop = 0;
+Popup.prototype.constrainToScreen = true;
+Popup.prototype.autoHide = true;
+Popup.prototype.useIframeShim = false; /*@cc_on @*/ /*@if (@_win32) {Popup.prototype.useIframeShim = true;} @end @*/
+Popup.prototype.iframe = null;
+Popup.prototype.position = null; // vertical: "above top center bottom below", horizontal: "adjacent-left,left,center,right,adjacent-right"
+Popup.prototype.reference = null;
+Popup.prototype.modal = false;
+Popup.prototype.destroyDivOnHide = false;
+Popup.prototype.destroyObjectsOnHide = false;
+Popup.prototype.screen = null;
+Popup.prototype.screenIframeShim = null;
+Popup.prototype.screenOpacity=.4;
+Popup.prototype.screenColor="#cccccc";
+
+// INSTANCE METHODS
+// --------------------------------------------------------------------
+
+// Show the popup
+// --------------------------------------------------------------------
+Popup.prototype.show = function(options, modal) {
+ this.modal = this.modal || (typeof(modal)=="boolean" && modal);
+ if (defined(options) && options!=null && typeof(options)=="object") {
+ for (var i in options) {
+ this[i] = options[i];
+ }
+ }
+ this.div = DOM.resolve(this.div);
+ CSS.setStyle(this.div,'position','absolute');
+
+ // If there is no div pre-defined to use, create one
+ if (this.div==null) {
+ this.div = this.createDiv();
+ }
+ if (this.content!=null) {
+ this.div.innerHTML = this.content;
+ this.content = null;
+ }
+ if (this.className!=null) {
+ this.div.className = this.className;
+ }
+ if (this.style!=null) {
+ this.applyStyle();
+ }
+ if (this.width!=null) {
+ this.div.style.width = this.width+"px";
+ this.div.style.overflowX="auto";
+ }
+ if (this.height!=null) {
+ this.div.style.height = this.height+"px";
+ this.div.style.overflowY="auto";
+ }
+
+ // Do the actual display - this is a separate method so display transitions can be implemented
+ this.transition();
+
+ // Make sure clicks on the DIV don't bubble up to the document
+ this.div.onclick = function(e) {
+ Event.cancelBubble(Event.resolve(e));
+ };
+ this.div.onmouseup = this.div.onclick;
+
+ // Focus to the DIV if possible
+ if (this.modal && this.div.focus) {
+ this.div.focus();
+ }
+};
+
+// Show the popup but make it modal
+// --------------------------------------------------------------------
+Popup.prototype.transition = function() {
+ if (this.modal) {
+ this.addScreen();
+ }
+
+ // Make the DIV displayed but hidden so its size can be measured
+ CSS.setStyle(this.div,'visibility','hidden');
+ CSS.setStyle(this.div,'display','block');
+
+ // Position the popup
+ this.setPosition();
+
+ // Add the shim if necessary
+ if (this.useIframeShim) {
+ this.addIframeShim();
+ }
+
+ // Make sure the DIV is higher than the shim
+ this.div.style.zIndex = Popup.minZIndex++;
+
+ CSS.setStyle(this.div,'display','block');
+ CSS.setStyle(this.div,'visibility','visible');
+};
+
+// Show the popup but make it modal
+// --------------------------------------------------------------------
+Popup.prototype.showModal = function(options) {
+ this.show(options,true);
+};
+
+// Apply user styles to the DIV
+// --------------------------------------------------------------------
+Popup.prototype.applyStyle = function() {
+ if (this.div!=null && this.style!=null && typeof(this.style)=="object") {
+ for (var i in this.style) {
+ this.div.style[i] = this.style[i];
+ }
+ }
+};
+
+// Hide the popup
+// --------------------------------------------------------------------
+Popup.prototype.hide = function() {
+ // If this was a temp object creating on-the-fly, then remove objects from the DOM so
+ // The document doesn't get littered with extra objects
+ if (this.destroyDivOnHide) {
+ DOM.removeNode(this.div);
+ this.div = null;
+ delete Popup.objects[this.id];
+ }
+ else if (this.div!=null) {
+ CSS.setStyle(this.div,'display','none');
+ }
+
+ if (this.destroyObjectsOnHide) {
+ DOM.removeNode(this.iframe);
+ DOM.removeNode(this.screen);
+ DOM.removeNode(this.screenIframeShim);
+ }
+ else {
+ if (this.iframe!=null) {
+ this.iframe.style.display = "none";
+ }
+ if (this.screen!=null) {
+ this.screen.style.display = "none";
+ }
+ if (this.screenIframeShim!=null) {
+ this.screenIframeShim.style.display = "none";
+ }
+ }
+};
+
+// Util funcs for position
+// --------------------------------------------------------------------
+Popup.prototype.setTop = function(top) {
+ this.div.style.top = top+"px";
+};
+Popup.prototype.setLeft = function(left) {
+ this.div.style.left = left+"px";
+};
+Popup.prototype.getTop = function() {
+ return parseInt(CSS.getStyle(this.div,"top"),10);
+};
+Popup.prototype.getLeft = function() {
+ return parseInt(CSS.getStyle(this.div,"left"),10);
+};
+
+// All the logic to position the popup based on various criteria
+// --------------------------------------------------------------------
+Popup.prototype.setPosition = function() {
+ if (this.position!=null) {
+ var m = this.position.match(/^(\S+)\s+(\S+)/);
+ if (m!=null && m.length==3) {
+ var v = m[1];
+ var h = m[2];
+
+ var ref = this.reference;
+ if (ref==null) { ref = Screen.getBody(); }
+ var p = Position.get(ref);
+ var refTop = p.top;
+ var refLeft = p.left;
+ var refWidth = DOM.getOuterWidth(ref);
+ var refHeight = DOM.getOuterHeight(ref);
+
+ var width = DOM.getOuterWidth(this.div);
+ var height = DOM.getOuterHeight(this.div);
+
+ var scrollLeft = Screen.getScrollLeft();
+ var scrollTop = Screen.getScrollTop();
+
+ // Set vertical position relative to reference object
+ if (v=="above") { this.setTop(refTop-height+this.offsetTop); }
+ else if (v=="top") { this.setTop(refTop+this.offsetTop); }
+ else if (v=="center") { this.setTop(refTop+(refHeight/2)-(height/2)+this.offsetTop); }
+ else if (v=="bottom") { this.setTop(refTop+refHeight-height+this.offsetTop); }
+ else if (v=="below") { this.setTop(refTop+refHeight+this.offsetTop); }
+
+ // Set horizontal position relative to reference object
+ if (h=="adjacent-left") { this.setLeft(refLeft-width+this.offsetLeft); }
+ else if (h=="left") { this.setLeft(refLeft+this.offsetLeft); }
+ else if (h=="center") { this.setLeft(refLeft+(refWidth/2)-(width/2)+this.offsetLeft); }
+ else if (h=="right") { this.setLeft(refLeft+refWidth-width+this.offsetLeft); }
+ else if (h=="adjacent-right") { this.setLeft(refLeft+refWidth+this.offsetLeft); }
+ }
+ }
+ else if (this.top==null && this.left==null) {
+ this.center();
+ }
+ else {
+ if (this.top==null) { this.top=0; }
+ if (this.left==null) { this.left=0; }
+ this.div.style.top = this.top+this.offsetTop+"px";
+ this.div.style.left = this.left+this.offsetLeft+"px";
+ }
+
+ // Re-position to make sure it stays on the screen
+ if (this.constrainToScreen) {
+ this.fitToScreen();
+ }
+};
+
+// Append an object to the body
+// --------------------------------------------------------------------
+Popup.prototype.appendToBody = function(o) {
+ var body = Screen.getBody();
+ if (body && body.appendChild) {
+ body.appendChild(o);
+ }
+};
+
+// Create a new DIV object to be used for a popup
+// --------------------------------------------------------------------
+Popup.prototype.createDiv = function() {
+ if (document.createElement) {
+ var d = document.createElement("DIV");
+ d.style.position="absolute";
+ d.style.display="block";
+ d.style.visibility="hidden";
+ this.appendToBody(d);
+ return d;
+ }
+ alert("ERROR: Couldn't create DIV element in Popup.prototype.createDiv()");
+ return null;
+};
+
+// Create a new IFRAME object to be used behind the popup
+// --------------------------------------------------------------------
+Popup.prototype.createIframe = function() {
+ if (document.createElement) {
+ var i= document.createElement("IFRAME");
+ i.style.position="absolute";
+ i.style.display="block";
+ i.style.visibility="hidden";
+ i.style.background="none";
+ this.appendToBody(i);
+ return i;
+ }
+ else {
+ alert("ERROR: Couldn't create IFRAME object in Popup.prototype.createIframe()");
+ }
+};
+
+// Add an IFRAME shim for the DIV
+// --------------------------------------------------------------------
+Popup.prototype.addIframeShim = function() {
+ if (this.iframe==null) {
+ this.iframe = this.createIframe();
+ }
+ this.iframe.className = Popup.iframeClass;
+ CSS.setStyle(this.iframe,'top',this.getTop()+"px");
+ CSS.setStyle(this.iframe,'left',this.getLeft()+"px");
+ CSS.setStyle(this.iframe,'width',DOM.getOuterWidth(this.div) + "px");
+ CSS.setStyle(this.iframe,'height',DOM.getOuterHeight(this.div) + "px");
+ CSS.setStyle(this.iframe,'zIndex',Popup.minZIndex++);
+ CSS.setStyle(this.iframe,'opacity',0);
+ CSS.setStyle(this.iframe,'visibility','visible');
+ CSS.setStyle(this.iframe,'display','block');
+};
+
+// Create a "screen" to make a popup modal
+// --------------------------------------------------------------------
+Popup.prototype.addScreen = function() {
+ if (this.screen==null) {
+ this.screen = this.createDiv();
+ this.screen.style.top="0px";
+ this.screen.style.left="0px";
+ this.screen.style.backgroundColor = this.screenColor;
+ this.screen.className=Popup.screenClass;;
+ CSS.setStyle(this.screen,"opacity",this.screenOpacity);
+ this.screen.onclick = function(e) { Event.cancelBubble(Event.resolve(e)); }
+ }
+ if (this.screenIframeShim==null) {
+ this.screenIframeShim = this.createIframe();
+ this.screenIframeShim.style.top="0px";
+ this.screenIframeShim.style.left="0px";
+ this.screenIframeShim.className=Popup.screenIframeClass;
+ CSS.setStyle(this.screenIframeShim,"opacity",0);
+ }
+ this.screen.style.width = Screen.getDocumentWidth()+"px";
+ this.screen.style.height = Screen.getDocumentHeight()+"px";
+ this.screenIframeShim.style.width = Screen.getDocumentWidth()+"px";
+ this.screenIframeShim.style.height = Screen.getDocumentHeight()+"px";
+ this.screenIframeShim.style.zIndex = Popup.minZIndex++;
+ this.screenIframeShim.style.visibility="visible";
+ this.screenIframeShim.style.display="block";
+ this.screen.style.zIndex = Popup.minZIndex++;
+ this.screen.style.visibility="visible";
+ this.screen.style.display="block";
+};
+
+// Re-position the DIV so it stays on the screen
+// --------------------------------------------------------------------
+Popup.prototype.fitToScreen = function() {
+ var width = DOM.getOuterWidth(this.div);
+ var height = DOM.getOuterHeight(this.div);
+ var top = this.getTop();
+ var left = this.getLeft();
+
+ var clientWidth = Screen.getViewportWidth();
+ var clientHeight = Screen.getViewportHeight();
+
+ var scrollLeft = Screen.getScrollLeft();
+ var scrollTop = Screen.getScrollTop();
+
+ if (top-scrollTop+height>clientHeight) {
+ top = top - ((top+height) - (scrollTop+clientHeight));
+ this.div.style.top = top + "px";
+ }
+ if (left-scrollLeft+width>clientWidth) {
+ left = left - ((left+width) - (scrollLeft+clientWidth));
+ this.div.style.left = left + "px";
+ }
+ if (top<scrollTop) {
+ this.div.style.top=scrollTop+"px";
+ }
+ if (left<scrollLeft) {
+ this.div.style.left=scrollLeft+"px";
+ }
+};
+
+// Center the DIV object
+// --------------------------------------------------------------------
+Popup.prototype.center = function() {
+ var left = DOM.getOuterWidth(this.div);
+ var top = DOM.getOuterHeight(this.div);
+ if (isNaN(left)) { left=0; }
+ if (isNaN(top)) { top=0; }
+ var clientW = Screen.getViewportWidth();
+ var clientH = Screen.getViewportHeight();
+ if (clientW!=null && clientH!=null) {
+ top = (clientH-top)/2;
+ left = (clientW-left)/2;
+ }
+ top += Screen.getScrollTop();
+ left += Screen.getScrollLeft();
+
+ this.div.style.top = top+this.offsetTop+"px";
+ this.div.style.left = left+this.offsetLeft+"px";
+};
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "./style/tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="./style/jquery.min.js" />
+ </head>
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>TCT Report</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="overview">
+ <table>
+ <tr>
+ <td>
+ <div id="summary">
+ <table>
+ <tr>
+ <th colspan="2">Test Summary</th>
+ </tr>
+ <tr>
+ <td>TCT Version</td>
+ <td>
+ <xsl:value-of select="result_summary/environment/@tct_version" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Plan Name</td>
+ <td>
+ <xsl:value-of select="result_summary/@plan_name" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Profile</td>
+ <td>
+ <xsl:value-of select="result_summary/environment/@tct_profile" />
+ </td>
+ </tr>
+ <tr>
+ <td>Build ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@build_id">
+ <xsl:if test="result_summary/environment/@build_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@build_id" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Total</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/total_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Passed</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/pass_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Failed</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/fail_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Blocked</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/block_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Not Executed</td>
+ <td>
+ <xsl:value-of select="sum(result_summary//suite/na_case)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Time</td>
+ <td>
+ <xsl:value-of select="result_summary/summary/start_at" />
+ ~
+ <xsl:value-of select="result_summary/summary/end_at" />
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ <td>
+ <div id="device">
+ <table>
+ <tr>
+ <th colspan="2">Device Information</th>
+ </tr>
+ <tr>
+ <td>Host Device</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@host">
+ <xsl:if test="result_summary/environment/@host = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@host" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Manufacturer</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@manufacturer">
+ <xsl:if test="result_summary/environment/@manufacturer = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@manufacturer" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device Model</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@device_model">
+ <xsl:if test="result_summary/environment/@device_model = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@device_model" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@device_id">
+ <xsl:if test="result_summary/environment/@device_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@device_id" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Screen Size</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@screen_size">
+ <xsl:if test="result_summary/environment/@screen_size = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@screen_size" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Resolution</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="result_summary/environment/@resolution">
+ <xsl:if test="result_summary/environment/@resolution = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="result_summary/environment/@resolution" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </table>
+ </div>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="capability">
+ <div id="title">
+ <a name="contents"></a>
+ <table>
+ <tr>
+ <td class="title">
+ <h1><a href="#" class="see_capabilities">Device Capability</a></h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:choose>
+ <xsl:when test="result_summary/capabilities">
+ <div id="capability_table" style="display:none;">
+ <table>
+ <tr>
+ <th>Capability Name</th>
+ <th>Type</th>
+ <th>Value</th>
+ </tr>
+ <xsl:for-each select="result_summary/capabilities/capability">
+ <xsl:sort select="@name" />
+ <tr>
+ <td>
+ <xsl:value-of select="@name" />
+ </td>
+ <td>
+ <xsl:value-of select="@type" />
+ </td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="value">
+ <xsl:value-of select="value" />
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="@support" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+ </xsl:when>
+ <xsl:otherwise>
+ The information of device capability is not available.
+ </xsl:otherwise>
+ </xsl:choose>
+ </div>
+ <div id="btc">
+ <table>
+ <tr>
+ <td>
+ <a href="#" class="see_all">Show all</a>
+ </td>
+ <td>
+ <a href="#" class="see_failed">Show only failed</a>
+ </td>
+ <td>
+ <a href="#" class="see_blocked">Show only blocked</a>
+ </td>
+ <td>
+ <a href="#" class="see_na">Show only not executed</a>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="title">
+ <h1></h1>
+ </div>
+ <div id="suite_summary">
+ <div id="title">
+ <a name="contents"></a>
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Test Summary by Suite</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="see_all">
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Total</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Executed</th>
+ <th class="Ratio">Ratio</th>
+ </tr>
+ <xsl:for-each select="result_summary/suite">
+ <xsl:if test="total_case > 0">
+ <tr class="suite_item">
+ <xsl:attribute name="id">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <td>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@name" />.xml</xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td class="total">
+ <xsl:value-of select="total_case" />
+ </td>
+ <td class="pass">
+ <xsl:value-of select="pass_case" />
+ </td>
+ <td class="fail">
+ <xsl:value-of select="fail_case" />
+ </td>
+ <td class="block">
+ <xsl:value-of select="block_case" />
+ </td>
+ <td class="na">
+ <xsl:value-of select="na_case" />
+ </td>
+ <td class="Ratio">
+ <div class="RatioGraphic" />
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="see_fail" style="display:none;">
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Total</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Executed</th>
+ <th class="Ratio">Ratio</th>
+ </tr>
+ <xsl:for-each select="result_summary/suite">
+ <xsl:if test="fail_case > 0">
+ <tr class="suite_item">
+ <xsl:attribute name="id">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <td>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@name" />.xml</xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td class="total">
+ <xsl:value-of select="total_case" />
+ </td>
+ <td class="pass">
+ <xsl:value-of select="pass_case" />
+ </td>
+ <td class="fail">
+ <xsl:value-of select="fail_case" />
+ </td>
+ <td class="block">
+ <xsl:value-of select="block_case" />
+ </td>
+ <td class="na">
+ <xsl:value-of select="na_case" />
+ </td>
+ <td class="Ratio">
+ <div class="RatioGraphic" />
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="see_block" style="display:none;">
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Total</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Executed</th>
+ <th class="Ratio">Ratio</th>
+ </tr>
+ <xsl:for-each select="result_summary/suite">
+ <xsl:if test="block_case > 0">
+ <tr class="suite_item">
+ <xsl:attribute name="id">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <td>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@name" />.xml</xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td class="total">
+ <xsl:value-of select="total_case" />
+ </td>
+ <td class="pass">
+ <xsl:value-of select="pass_case" />
+ </td>
+ <td class="fail">
+ <xsl:value-of select="fail_case" />
+ </td>
+ <td class="block">
+ <xsl:value-of select="block_case" />
+ </td>
+ <td class="na">
+ <xsl:value-of select="na_case" />
+ </td>
+ <td class="Ratio">
+ <div class="RatioGraphic" />
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="see_na" style="display:none;">
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Total</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Executed</th>
+ <th class="Ratio">Ratio</th>
+ </tr>
+ <xsl:for-each select="result_summary/suite">
+ <xsl:if test="na_case > 0">
+ <tr class="suite_item">
+ <xsl:attribute name="id">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <td>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@name" />.xml</xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td class="total">
+ <xsl:value-of select="total_case" />
+ </td>
+ <td class="pass">
+ <xsl:value-of select="pass_case" />
+ </td>
+ <td class="fail">
+ <xsl:value-of select="fail_case" />
+ </td>
+ <td class="block">
+ <xsl:value-of select="block_case" />
+ </td>
+ <td class="na">
+ <xsl:value-of select="na_case" />
+ </td>
+ <td class="Ratio">
+ <div class="RatioGraphic" />
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:for-each>
+ </table>
+ </div>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./style/back_top.png" />
+ </div>
+ <script type="text/javascript" src="./style/application.js" />
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ drawRatio();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word" />
+ <xsl:variable name="cr">
+ <xsl:text>\n</xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)" />
+ <br />
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "./style/tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="./style/jquery.min.js" />
+ <script type="text/javascript" src="./style/popup.js" />
+ </head>
+ <body>
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">Suite Test Results</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="btc">
+ <table>
+ <tr>
+ <td>
+ <a href="#" class="see_all">Show all</a>
+ </td>
+ <td>
+ <a href="#" class="see_failed">Show only failed</a>
+ </td>
+ <td>
+ <a href="#" class="see_blocked">Show only blocked</a>
+ </td>
+ <td>
+ <a href="#" class="see_na">Show only not executed</a>
+ </td>
+ <td>
+ <a href="summary.xml">Summary</a>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="testcasepage">
+ <div id="cases">
+ <div id="see_all">
+ <xsl:for-each select="test_definition/suite">
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (All)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id"><xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id"><xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+ <td class="red_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'PASS'">
+ <td class="green_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'BLOCK' ">
+ <td class="orange_rate">
+ BLOCK
+ </td>
+ </xsl:if>
+ <xsl:if
+ test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
+ <td class="gray_rate">
+ Not Run
+ </td>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>
+
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stdout" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="see_fail" style="display:none;">
+ <xsl:for-each select="test_definition/suite">
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (Failed only)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase[@result='FAIL']">
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id">fail_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id">fail_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <td class="red_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stdout" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="see_block" style="display:none;">
+ <xsl:for-each select="test_definition/suite">
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (Blocked Only)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase[@result='BLOCK']">
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id">block_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id">block_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <td class="orange_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stdout" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="see_na" style="display:none;">
+ <xsl:for-each select="test_definition/suite">
+ <div id="suite_title">
+ <h2>
+ Test Suite:
+ <xsl:value-of select="@name" />
+ (Not executed Only)
+ </h2>
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <tr>
+ <xsl:choose>
+ <xsl:when test="@name">
+ <td colspan="3">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ <td colspan="1">
+ <h4>
+ <a>
+ <xsl:attribute name="href"><xsl:value-of
+ select="@set_debug_msg" /></xsl:attribute>
+ dlog
+ </a>
+ </h4>
+ </td>
+ </xsl:when>
+ <xsl:otherwise>
+ <td colspan="4">
+ <h3>
+ Test Set:
+ <xsl:value-of select="@name" />
+ </h3>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ </tr>
+ <xsl:for-each select=".//testcase[@result='N/A']">
+ <tr>
+ <td>
+ <div
+ style="background-color:#F5DEB3;border:1px solid black;display:none;">
+ <xsl:attribute name="id">na_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <p>
+ <xsl:for-each select="./description/steps//step">
+ <xsl:sort select="@order" />
+ <B>
+ Step
+ <xsl:value-of select="@order" />
+ :
+ </B>
+ <br />
+ <xsl:value-of select=".//step_desc" />
+ <br />
+ <B>Expected:</B>
+ <xsl:value-of select=".//expected" />
+ <br />
+ </xsl:for-each>
+ </p>
+ <p>
+ <br />
+ <B>
+ Entry:
+ <br />
+ </B>
+ <xsl:value-of select="./description//test_script_entry" />
+ <br />
+ </p>
+ </div>
+ <a href="#" class="test_case_popup">
+ <xsl:attribute name="id">na_<xsl:value-of
+ select="@id" /></xsl:attribute>
+ <xsl:value-of select="@id" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <td class="gray_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ <td>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select=".//result_info/stdout" />
+ </xsl:call-template>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./style/back_top.png" />
+ </div>
+ <script type="text/javascript" src="./style/application.js" />
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word" />
+ <xsl:variable name="cr">
+ <xsl:text>\n</xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)" />
+ <br />
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+@charset "UTF-8";\r
+/* CSS Document */\r
+#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td\r
+ {\r
+ margin: 0;\r
+ padding: 0;\r
+ border: 0;\r
+ font-weight: inherit;\r
+ font-style: inherit;\r
+ font-size: 0.96em;\r
+ font-family: arial;\r
+ vertical-align: baseline;\r
+}\r
+\r
+#title td, #btc td{\r
+ margin: 0;\r
+ padding: 0;\r
+ border: 0;\r
+ font-weight: inherit;\r
+ font-style: inherit;\r
+ font-size: 0.96em;\r
+ font-family: arial;\r
+ vertical-align: baseline;\r
+}\r
+\r
+td.Ratio {\r
+ text-align: left;\r
+ font-weight: normal;\r
+ padding: 4px 10px 4px 5px;\r
+ vertical-align: middle;\r
+}\r
+\r
+th.Ratio {\r
+ width: 400px;\r
+}\r
+\r
+#testcasepage p {\r
+ text-align: left;\r
+}\r
+\r
+#suite_title {\r
+ text-align: left;\r
+}\r
+\r
+#btc {\r
+ text-align: right;\r
+}\r
+\r
+#btc table {\r
+ position: absolute;\r
+ right: 0px;\r
+ width: 600px;\r
+}\r
+\r
+#testcasepage table {\r
+ border-collapse: separate;\r
+ border-spacing: 0;\r
+ margin-bottom: 1.4em;\r
+ vertical-align: middle;\r
+}\r
+\r
+#testcasepage th,#testcasepage td {\r
+ text-align: left;\r
+ font-weight: normal;\r
+ padding: 4px 10px 4px 5px;\r
+ vertical-align: middle;\r
+}\r
+\r
+#cases table {\r
+ width: 101%;\r
+}\r
+\r
+#cases td {\r
+ border-left: 0px;\r
+ font-weight: normal;\r
+ border-bottom: 0px;\r
+}\r
+\r
+#suite_summary table {\r
+ width: 100%;\r
+}\r
+\r
+\r
+#overview table {\r
+ width: 101%;\r
+}\r
+\r
+#overview table, #overview td, #overview tr {\r
+ border-left: none;\r
+ border-bottom: none;\r
+ border-right: none;\r
+ vertical-align: top;\r
+}\r
+\r
+#overview td{\r
+ width: 50%;\r
+}\r
+\r
+#capability table {\r
+ width: 50%;\r
+}\r
+\r
+#fail_cases table {\r
+ width: 101%;\r
+}\r
+\r
+#title table {\r
+ width: 101%;\r
+}\r
+\r
+#device table {\r
+ width: 100%;\r
+}\r
+\r
+#summary table {\r
+ width: 100%;\r
+}\r
+\r
+#testcasepage th {\r
+ border-bottom: 1px solid #000;\r
+ background-color: #AAAAAA;\r
+ border-left: 1px solid #000;\r
+ border-top: 1px solid #000;\r
+ color: #000;\r
+ font-weight: bold;\r
+ vertical-align: bottom;\r
+}\r
+\r
+#summary th:last-child,#summary td:last-child, #device th:last-child,#device td:last-child, #suite_summary th:last-child,#suite_summary td:last-child,#cases th:last-child,#cases td:last-child,#capability th:last-child,#capability td:last-child {\r
+ border-right: 1px solid #000;\r
+}\r
+\r
+#testcasepage td {\r
+ font-weight: normal;\r
+}\r
+\r
+#summary td, #device td, #capability td, #suite_summary td, #cases td{\r
+ border-left: 1px solid;\r
+ font-weight: normal;\r
+ border-bottom: 1px solid;\r
+}\r
+\r
+#testcasepage td.yellow_rate {\r
+ background-color: #ffcc00;\r
+}\r
+\r
+#testcasepage td.green_rate {\r
+ background-color: #1E90FF;\r
+}\r
+\r
+#testcasepage td.dgreen_rate {\r
+ background-color: #339933;\r
+}\r
+\r
+#testcasepage td.red_rate {\r
+ background-color: #FF3333;\r
+}\r
+\r
+#testcasepage td.orange_rate {\r
+ background-color: #FFA500;\r
+}\r
+\r
+#testcasepage td.gray_rate {\r
+ background-color: #AAAAAA;\r
+}\r
+\r
+#title table,#title tr,#title td {\r
+ border-left: none;\r
+ border-bottom: none;\r
+ text-align: center;\r
+}\r
+\r
+#title td:last-child {\r
+ border-right: none;\r
+}\r
+\r
+#testcasepage h1 {\r
+ font-size: 2em;\r
+ font-family: Arial, sans-serif;\r
+ font-weight: bold;\r
+ line-height: 1;\r
+ color: #000;\r
+ margin-bottom: 0.75em;\r
+ padding-top: 0.25em;\r
+ font-weight: bold;\r
+}\r
+\r
+#goTopBtn {\r
+ right: 0px;\r
+ bottom: 0px;\r
+ position: fixed; +\r
+ position: absolute;\r
+ top: expression(parseInt(document.body.scrollTop)+document.body.clientHeight-40\r
+ );\r
+}\r
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Tang, Shaofeng <shaofeng.tang@intel.com>
+
+
+import sys
+from tctshell.plan_options import PlanGeneratorOptions
+from tctshell.plan_runner import PlanRunner
+
+
+def main():
+ wrapper = PlanGeneratorOptions()
+ wrapper.parse_options(sys.argv)
+ output = wrapper.get_output()
+
+ runner = PlanRunner()
+ runner.load_local_repo(wrapper.get_repository_folder(), \
+ wrapper.get_tizenV(), wrapper.get_match_regex(), \
+ wrapper.get_unmatch_regex(), wrapper.get_plan_name(),\
+ wrapper.get_profile_name(), wrapper.get_execute_type())
+
+ runner.to_xml(output)
+
+if __name__ == "__main__":
+ main()
--- /dev/null
+#!/usr/bin/python
+
+import sys
+from tctshell.scenario_options import ScenarioGeneratorOptions
+from tctshell.scenario_runner import ScenarioRunner
+
+
+def main():
+ wrapper = ScenarioGeneratorOptions()
+ wrapper.parse_options(sys.argv)
+ output = wrapper.get_output()
+ runner = ScenarioRunner()
+ runner.load_local_repo(wrapper.get_planlist_args(), \
+ wrapper.get_plansrc_folder(), wrapper.get_scen_name(), \
+ wrapper.getPlanList(), wrapper.getDeviceList())
+
+ runner.to_xml(output)
+
+if __name__ == "__main__":
+ main()
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Tang, Shaofeng <shaofeng.tang@intel.com>
+
+import os
+import sys
+import traceback
+import timeit
+import logging
+import threading
+
+from tctshell.shellwrapper import ShellWrapper
+from tctshell.intention_generator import IntentionGenerator
+from tctshell.shellplanner import MultiRunnPlan
+from tctshell.shellworker import PlanExecutor
+from tctshell.distribute_plan import AutoPlanExecutor
+from tctshell.result_manager import ResultManager
+from tctshell.logmanager import LOGGER
+from tctshell.constants import Constants
+from tctshell.environment_manager import EnvironmentManager
+from tctshell.devicemanager import DevBaseManager
+from tctshell.sdbmanager import SdbManager
+
+
+def main():
+ #time check
+ env_manager = None
+ plans = None
+ devmgr = None
+ try:
+ start_time = timeit.default_timer()
+
+ devbaseMgr = DevBaseManager()
+ devbaseMgr.start()
+
+ devmgr = devbaseMgr.DeviceManager()
+ wrapper = ShellWrapper(devmgr)
+ wrapper.parse_options(sys.argv)
+
+ isPreconSet = wrapper.is_enable_preconf_func()
+
+ devmgr.setDbuteDevIds(wrapper.getDbuteDevIds())
+
+ resultIns = ResultManager()
+ plans = IntentionGenerator.genIntentionData(wrapper, devmgr)
+
+ if plans is None:
+ LOGGER.error("Not found test suites")
+ raise
+
+ env_manager = EnvironmentManager(plans, isPreconSet, \
+ wrapper.get_tracking_dump(), devmgr)
+ env_manager.setup()
+
+ MRP_i = MultiRunnPlan.getInstance()
+ pExecutor = []
+ if plans:
+ for plan in plans:
+ if len(plan.getSuites()) > 0:
+ MRP_i.addPlan(plan.getPlanName(), plan)
+
+ resultManager = threading.Thread(\
+ target=resultIns.waitForFinishedPlans, name="ResultManager")
+ resultManager.start()
+
+ for counter, plan in enumerate(MRP_i.getPlanDict().values()):
+ th = None
+ if Constants.isDistMode():
+ th = AutoPlanExecutor(plan, counter + 1, isPreconSet, \
+ env_manager, wrapper.get_run_timeout(), devmgr)
+ else:
+ th = PlanExecutor(plan, counter + 1, isPreconSet, devmgr)
+
+ pExecutor.append(th)
+
+ if Constants.isDistMode():
+ for plan_thread in pExecutor:
+ env_manager.recovery_setup(plan_thread.autop_executors)
+
+ for thread in pExecutor:
+ thread.start()
+
+ env_manager.start_monitor()
+
+ pExecutor.append(resultManager)
+ for thread in pExecutor:
+ thread.join()
+
+ env_manager.kill_monitors()
+ LOGGER.info("[ Succeed to complete TCT-shell execution, good-bye ]")
+
+ #time_check
+ end_time = timeit.default_timer()
+ timetaken = end_time - start_time
+ LOGGER.debug("Time taken: %d min %d sec" % (timetaken / 60, \
+ timetaken % 60))
+
+ logging.shutdown()
+ wrapper.fetch_logs(pExecutor)
+ sys.exit(0)
+ except SystemExit:
+ raise
+
+ except KeyboardInterrupt:
+ Constants.clean_unzip_file()
+ logging.shutdown()
+ print ('\nKeyboardInterrupt')
+ print ("Logs saved to ['/opt/tools/shell/tmp/logs']")
+ if threading.activeCount() > 1:
+ os._exit(1)
+ else:
+ sys.exit(1)
+ except:
+ if env_manager:
+ env_manager.kill_monitors()
+
+ if Constants.isDistMode():
+ if plans:
+ for plan in plans:
+ for dev in devmgr.getSdbDeviceList():
+ SdbManager.exportDumpFiles(dev.getDeviceId(), \
+ plan.getResultFolderPath() + "/dump")
+
+ Constants.clean_unzip_file()
+ LOGGER.info("[ Failed to complete TCT-shell execution, good-bye ]")
+ logging.shutdown()
+ print ('-' * 60)
+ traceback.print_exc(file=sys.stdout)
+ print ('-' * 60)
+ print ("Please check logs in [/opt/tools/shell/tmp/logs/]")
+ if threading.activeCount() > 1:
+ os._exit(1)
+ else:
+ sys.exit(1)
+
+
+if __name__ == "__main__":
+ main()
+
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110 - 1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+""" The process kill for os"""
+
+import os
+import platform
+import signal
+import re
+import ctypes
+
+
+def killall(ppid):
+ """Kill all children process by parent process ID"""
+ os_ver = platform.system()
+ try:
+ if os_ver == "Linux" or os_ver == "Darwin":
+ ppid = str(ppid)
+ pidgrp = []
+
+ def getchildpids(ppid):
+ """Return a list of children process"""
+ command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
+ ppid)
+ pids = os.popen(command).read()
+ pids = pids.split()
+ return pids
+
+ pidgrp.extend(getchildpids(ppid))
+ for pid in pidgrp:
+ pidgrp.extend(getchildpids(pid))
+ # Insert self process ID to PID group list
+ pidgrp.insert(0, ppid)
+ while len(pidgrp) > 0:
+ pid = pidgrp.pop()
+ try:
+ os.kill(int(pid), signal.SIGKILL)
+ except OSError as error:
+ pattern = re.compile('No such process')
+ match = pattern.search(str(error))
+ if not match:
+ print ("[ Error: fail to kill pid: %s," \
+ " error: %s ]\n" % (int(pid), error))
+ # kill for windows platform
+ else:
+ kernel32 = ctypes.windll.kernel32
+ handle = kernel32.OpenProcess(1, 0, int(ppid))
+ kernel32.TerminateProcess(handle, 0)
+ except OSError as error:
+ pattern = re.compile('No such process')
+ match = pattern.search(str(error))
+ if not match:
+ print ("[ Error: fail to kill pid: %s, error: %s ]\n" \
+ % (int(ppid), error))
+ return None
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Tang, Shaofeng <shaofeng.tang@intel.com>
+
+import re
+import os
+import os.path
+import zipfile
+import shutil
+import configparser
+from .logmanager import LOGGER
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = configparser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+CONFIG_FILE = "/opt/tools/shell/CONFIG"
+parser = configparser.ConfigParser()
+parser.read(CONFIG_FILE)
+
+
+class Constants:
+
+ TCT_VERSION = "TCT-SHELL-3.0"
+
+ TCT_HOME = "/opt/tct/"
+
+ SUITE_TEST_EXPECTED_TIME = 7
+
+ TCT_PLAN_FOLDER = "/opt/tools/shell/plan/"
+
+ TCT_SCEN_FOLDER = "/opt/tools/shell/scen/"
+
+ STYLE_FOLDER = "/opt/tools/shell/style/"
+
+ DEVICE_HEALTH_CMD = "/opt/tct/%s/scripts/tct-config-device.py"
+
+ HEALTH_CHECK_FILE_PATH = "/opt/tct/%s/scripts/healthcheck.ini"
+
+ RESULT_FOLDER = "/opt/tct/%s/shell/result/%s/"
+
+ RESULT_REPO = "/opt/tct/%s/shell/result/%s/"
+
+ AUTO_RESULT_SUFFIX = ".auto.xml"
+
+ MANUAL_RESULT_SUFFIX = ".manual.xml"
+
+ RERUN_AUTO_RESULT_SUFFIX = ".auto.rerun.xml"
+
+ RERUN_MANUAL_RESULT_SUFFIX = ".manual.rerun.xml"
+
+ RERUN_SUFFIX = ".rerun.xml"
+
+ TCT_LOG_FOLDER = "/opt/tools/shell/tmp/logs"
+
+ DEFAULT_TIZENV = ""
+
+ #SDB Command
+ SDB_PUSH = "sdb -s %s push"
+ SDB_SHELL = "sdb -s %s shell"
+ SDB_ROOT_ON = "sdb -s %s root on"
+ SDB_DEVICES = "sdb devices"
+ SDB_START_SERVER = "sdb start-server"
+ SDB_KILL_SERVER = "sdb kill-server"
+ SDB_CONNECT = "sdb connect %s"
+ SDB_PULL = "sdb -s %s pull"
+ SDB_CAT_CONFIG = " cat %s"
+ SDB_LS = "sdb -s %s shell ls -al"
+ SDB_DISPLAY_STOP = "sdb -s %s shell devicectl display stop"
+ FILE_FOUND_SCRIPT = "[ -f %s ] && echo \"Found\" || echo \"Not Found\""
+
+ UNZIP = "unzip -uo"
+
+ LOCAL_CAPABILITY_PATH = "/opt/tools/shell/tmp/%s/device_capability.xml"
+ LOCAL_BUILD_INFO_PATH = "/opt/tools/shell/tmp/%s/buildinfo.xml"
+ LOCAL_SHELL_TEMP_PATH = "/opt/tools/shell/tmp/%s/"
+
+ #Testkit-Lite
+ LITE_CMD1 = "testkit-lite1.0"
+ LITE_CMD2 = "testkit-lite2.0"
+ PRIORITY_VALUE = False
+ PRIORITY = "--priority P0 P1"
+ LOCAL_PRE = "-f "
+ DEVICE_PRE = "-f device:"
+ LITE_E_PARAM = "-e ""WRTLauncher"""
+ LITE_NON_ACTIVE_PARAM = "--non-active"
+ LITE_DEVICE_PARAM = "--deviceid"
+ LITE_CAPABILITY_PARAM = "--capability"
+ TESTCASE_ID = "--id"
+ EXECUTE_PREFF = " -e "
+ ONLY_AUTO_CASES = "-A"
+ ONLY_MANUAL_CASES = "-M"
+
+ DEVICE_SUITE_DEF = "tests.xml"
+ LITE_OUTPUT_PARAM = "-o "
+ EXT_TYPE_PARAM = "-e xwalk"
+ ENV_TYPE_PARAM = "--testenv \"Launcher=app_launcher \""
+ COMM_TYPE_PARAM = "--comm tizenmobile"
+ WRT_LAUNCHER_CMD = "WRTLauncher"
+
+ #HOST/OPT
+ SUITES_REPOSITORY = "/opt/tct/%s/packages/"
+
+ INSTALL_ZIP_24 = "inst.sh"
+ INSTALL_ZIP_W3 = "inst.py"
+
+ UNINSTALL_ZIP_24 = "inst.sh -u"
+ UNINSTALL_ZIP_W3 = "inst.py -u"
+
+ #Scenario Generator
+ DEFAULT_SCEN_NAME = "Scen_Full_test"
+
+ #Plan Generator
+ ALL_PROFILES = ['mobile', 'wearable', 'tv']
+ DEFAULT_MATCH_REGEX = "*.zip"
+ DEFAULT_UNMATCH_REGEX = None
+ DEFAULT_PLAN_NAME = "Full_test"
+ DEFAULT_PROFILE_NAME = "mobile"
+ DEFAULT_EXECUTE_TYPE = "All"
+ DEFAULT_PLAN_FILE = "tct_plan"
+
+ REGEX_FOR_SPLIT_PKG_NAME = "-\d\.\d*"
+
+ #Log Level
+ DEFAULT_LOG_LEVEL = "INFO"
+ LOG_LEVEL = None
+ LOG_LEVELS = {"CRITICAL": 50,
+ "ERROR": 40,
+ "WARNING": 30,
+ "INFO": 20,
+ "DEBUG": 10,
+ "NOTSET": 0
+ }
+
+ #Running Mode
+ RUNNING_MODE_PLAN = "plan"
+ RUNNING_MODE_SCEN = "scenario"
+ RUNNING_MODE_RERUN = "rerun"
+ RUNNING_MODE_SUITES = "suites"
+ RUNNING_MODE_PROFILE = "profile"
+ RERUNING_MODE = False
+ SCENARIO_MODE = False
+ DISTRIBUTE_MODE = False
+
+ #PRECONFIGURE
+ PRE_CONF_HOST_INI = "/opt/tools/shell/tmp/%s/tct-testconfig.ini"
+ PRE_CONF_HOST_JSON = "/opt/tools/shell/tmp/%s/preconfigure.json"
+ PRE_CONF_HOST_XML = "/opt/tools/shell/tmp/%s/tests.xml"
+ PORT_CONF_HOST_JSON = "/opt/tools/shell/tmp/%s/portconfigure.json"
+ NAT_CONF_HOST_TXT = "/opt/tools/shell/tmp/%s/TC_Config.txt"
+ NAT_CONF_DEVICE_TXT = "/opt/usr/home/owner/share/"
+
+ #Waiting Time
+ #DEBUG PURPOSE. Original value: 300
+ NO_WORKERS_TIMEOUT = 300
+ #Temporary constant value. Should be dynamic.
+ RECOVERY_TIME = 100
+
+ DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
+ DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+ @staticmethod
+ def setRecoveryTime(timeout):
+ Constants.RECOVERY_TIMEOUT = timeout
+
+ @staticmethod
+ def getDEVICE_TESTS_FILE(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/%s/tests.xml")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/%s/tests.xml")
+
+ @staticmethod
+ def getDEVICE_SUITE_TARGET(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/")
+
+ @staticmethod
+ def getDEVICE_SUITE_FOLDER(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/")
+
+ @staticmethod
+ def getDEVICE_BUILD_INFO_PATH(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "Documents/tct/buildinfo.xml")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "Documents/tct/buildinfo.xml")
+
+ @staticmethod
+ def getDEVICE_CAPABILITY_PATH(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "Documents/tct/capability.xml")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "Documents/tct/capability.xml")
+
+ @staticmethod
+ def getPRE_CONF_DEVICE_INI(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/tct-testconfig.ini")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/tct-testconfig.ini")
+
+ @staticmethod
+ def getPRE_CONF_DEVICE_JSON(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/preconfigure.json")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/preconfigure.json")
+
+ @staticmethod
+ def getPRE_CONF_DEVICE_XML(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/tests.xml")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/tests.xml")
+
+ @staticmethod
+ def getPORT_CONF_DEVICE_JSON(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/portconfigure.json")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/portconfigure.json")
+
+ @staticmethod
+ def getTCT_PORT_CONF_DEVICE_JSON(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/portconfigure.json")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/portconfigure.json")
+
+ @staticmethod
+ def getTCT_PRE_CONF_DEVICE_JSON(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/preconfigure.json")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/preconfigure.json")
+
+ @staticmethod
+ def getNAT_CONF_DEVICE_TXT(_tizenV):
+ if _tizenV and float(_tizenV.split('_')[-1]) >= 3.0:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_30, "tct/opt/tct-testconfig/TC_Config.txt")
+ else:
+ return os.path.join(Constants.DEVICE_SUITE_TARGET_24, "tct/opt/tct-testconfig/TC_Config.txt")
+
+ @staticmethod
+ def setLogLevel(lvl):
+ Constants.LOG_LEVEL = lvl
+
+ @staticmethod
+ def setRerunMode(isRerun):
+ Constants.RERUNING_MODE = isRerun
+
+ @staticmethod
+ def setScenMode(isScen):
+ Constants.SCENARIO_MODE = isScen
+
+ @staticmethod
+ def setDistMode(isDist):
+ Constants.DISTRIBUTE_MODE = isDist
+
+ @staticmethod
+ def isDistMode():
+ return Constants.DISTRIBUTE_MODE
+
+ @staticmethod
+ def isScenMode():
+ return Constants.SCENARIO_MODE
+
+ @staticmethod
+ def checkBuildIds(devs):
+ check = True
+ if len(devs) == 0:
+ check = False
+
+ first_buildId = None
+ for count, dev in enumerate(devs):
+ dev_buildId = dev.getDeviceBuildId()
+ if count == 0:
+ first_buildId = dev_buildId
+ if not dev_buildId:
+ check = False
+ if not first_buildId in dev_buildId:
+ check = False
+
+ return check
+
+ @staticmethod
+ def getSuiteNameFromFile(suiteFile):
+ suffixes = [Constants.AUTO_RESULT_SUFFIX, \
+ Constants.MANUAL_RESULT_SUFFIX, \
+ Constants.RERUN_AUTO_RESULT_SUFFIX, \
+ Constants.RERUN_MANUAL_RESULT_SUFFIX]
+ for suffix in suffixes:
+ if suiteFile.endswith(suffix):
+ suiteFile = suiteFile[:-len(suffix)]
+ return suiteFile
+
+ @staticmethod
+ def checkFileExists(aPath):
+ if os.path.exists(aPath):
+ return True
+ else:
+ return False
+
+ @staticmethod
+ def getTempPath(filepath):
+ xmlFolder = Constants.LOCAL_SHELL_TEMP_PATH % "temp_xml"
+ if not os.path.isdir(xmlFolder):
+ os.makedirs(xmlFolder, mode=0o777)
+
+ xml_name = os.path.basename(filepath)
+ temp_path = os.path.join(xmlFolder, xml_name)
+ return temp_path
+
+ @staticmethod
+ def unzip_package(filepath):
+ path = os.path.expanduser("~")
+ os.chdir(path)
+ if os.path.exists(Constants.DEFAULT_PLAN_FILE):
+ shutil.rmtree(Constants.DEFAULT_PLAN_FILE)
+
+ os.makedirs(Constants.DEFAULT_PLAN_FILE, mode=0o777)
+ f = zipfile.ZipFile(filepath, 'r')
+ for file in f.namelist():
+ f.extract(file, path + "/" + Constants.DEFAULT_PLAN_FILE)
+
+ @staticmethod
+ def clean_unzip_file():
+ os.chdir(os.path.expanduser("~"))
+ if os.path.exists(Constants.DEFAULT_PLAN_FILE):
+ shutil.rmtree(Constants.DEFAULT_PLAN_FILE)
+
+ @staticmethod
+ def move_log_file(src_file, dest_folder):
+ log_folder = os.path.join(dest_folder, 'logs')
+ if not os.path.isfile(src_file):
+ LOGGER.warning('%s does not exist' % src_file)
+ return False
+ if not os.path.isdir(log_folder):
+ os.mkdir(log_folder, mode=0o777)
+
+ count = 1
+ src_basename = os.path.basename(src_file)
+ src_dir = os.path.dirname(src_file)
+ title, ext = os.path.splitext(src_basename)
+ while True:
+ if os.path.exists(os.path.join(log_folder, src_basename)):
+ src_basename = title + "_%s%s" % (count, ext)
+ count += 1
+ else:
+ break
+
+ rename_src = os.path.join(src_dir, src_basename)
+ os.rename(src_file, rename_src)
+ shutil.copy(rename_src, log_folder)
+ return True
+
+ @staticmethod
+ def indent(elem, level=0):
+ i = "\n" + level * " "
+ if len(elem):
+ if not elem.text or not elem.text.strip():
+ elem.text = i + " "
+ if not elem.tail or not elem.tail.strip():
+ elem.tail = i
+ for elem in elem:
+ Constants.indent(elem, level + 1)
+ if not elem.tail or not elem.tail.strip():
+ elem.tail = i
+ else:
+ if level and (not elem.tail or not elem.tail.strip()):
+ elem.tail = i
+
+ @staticmethod
+ def isSdbNetwork(deviceId):
+ patt = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}.\d{1,3}:')
+ ma = patt.match(deviceId)
+ if ma:
+ return True
+ else:
+ return False
+
+ '''
+ @staticmethod
+ def getDeviceExceptions():
+ devices = []
+ try:
+ devs = parser.get('DISTRIBUTE_MODE', 'DEVICE_EXCEPTIONS')
+ devs = devs.splitlines()
+ for dev in devs:
+ if dev != '':
+ devices.append(dev)
+ LOGGER.info("Ignoring device: %s" % dev)
+ except Exception as e:
+ LOGGER.error("CONFIG file Parsing Error: %s" % e)
+ finally:
+ return devices
+ '''
+
+ @staticmethod
+ def set_default_tizenV(_tizenV):
+ Constants.DEFAULT_TIZENV = _tizenV
+
+ @staticmethod
+ def get_tct_binaryV():
+ tct_binV = ""
+ ver_path = '/opt/tct/%s/VERSION' % Constants.DEFAULT_TIZENV
+ if os.path.exists(ver_path):
+ ver_file = open('/opt/tct/%s/VERSION' % \
+ Constants.DEFAULT_TIZENV, 'r')
+ tct_binV = ver_file.readline().strip()
+ return tct_binV
+
--- /dev/null
+#!/usr/bin/python
+
+import queue
+from multiprocessing.managers import BaseManager
+
+from .sdbmanager import SdbManager
+from .constants import Constants
+from .logmanager import LOGGER
+from xml.etree import ElementTree
+from .exception import DevNotFoundErr
+
+
+class DeviceManager(object):
+ devices = []
+ dbutedevIds = []
+ dumpMonitor_q = queue.Queue()
+
+ def __init__(self):
+ if len(self.devices) == 0:
+ self.loadDeviceList()
+
+ def _updateConnDevice(self, connDevices):
+ self._resetDevices()
+
+ for dev in connDevices:
+ self.devices.append(dev)
+
+ def _resetDevices(self):
+ listSize = len(self.devices)
+ del self.devices[0:listSize]
+
+ def deleteFaultDevice(self, _devid):
+ if len(self.devices) < 1:
+ return False
+ else:
+ devs = self.getSdbDeviceList()
+ for idx, dev in enumerate(devs):
+ devId = dev.getDeviceId()
+ if devId == _devid:
+ del self.devices[idx]
+ return True
+ return False
+
+ def isDeviceAvailable(self, deviceId):
+ if len(self.devices) == 0:
+ return False
+ else:
+ devs = self.getSdbDeviceList()
+ for dev in devs:
+ devId = dev.getDeviceId()
+ if devId == deviceId:
+ return True
+ return False
+
+ def getDeviceSize(self):
+ return len(self.devices)
+
+ def getSdbDeviceList(self):
+ if self.dbutedevIds:
+ remake_devices = []
+ for devid in self.dbutedevIds:
+ dev = self.getDevice(devid)
+ if dev:
+ remake_devices.append(dev)
+
+ return remake_devices
+ else:
+ return self.devices
+
+ def getDevice(self, deviceId):
+ for dev in self.devices:
+ if dev.getDeviceId() == deviceId:
+ return dev
+
+ LOGGER.error("The '%s' device Id exists error" % deviceId)
+ return None
+
+ def loadDeviceList(self):
+ connDevices = []
+ sdbOutLog = SdbManager.sdbDevices()
+ if not sdbOutLog:
+ return False
+ devicesInfo = sdbOutLog.replace("List of devices attached", "")
+ devList = devicesInfo.split('\n')
+
+ for dev in devList:
+ if len(dev) > 1:
+ devInfoItem = dev.split('\t')
+ if len(devInfoItem) < 2:
+ continue
+ devId = devInfoItem[0].rstrip()
+ devType = devInfoItem[1].rstrip()
+ devName = devInfoItem[2].rstrip()
+ if not (devType == "unknown" or devType == "offline" \
+ or devId == "unknown" or devId == "offline"):
+ connDevices.append(SdbDevice(devId, devName, devType))
+ else:
+ raise DevNotFoundErr(devId)
+
+ if len(connDevices) > 0:
+ self._updateConnDevice(connDevices)
+ LOGGER.debug("Connected Devices = %s" \
+ % str([dev.devId for dev in self.devices]))
+ return True
+ else:
+ self._resetDevices()
+ LOGGER.debug("Reset Devices List")
+ return False
+
+ def setDbuteDevIds(self, _devIds):
+ self.dbutedevIds = _devIds
+
+ def add_dump_monitor_dev(self, _devid):
+ LOGGER.debug("add dump monitor dev : %s" % _devid)
+ self.dumpMonitor_q.put(_devid)
+
+ '''
+ def check_dump_monitor_que(self, _devid):
+ LOGGER.debug("check dump monitor queue : %s" % _devid)
+ temp_devs = []
+ while not self.dumpMonitor_q.empty():
+ devid = self.dumpMonitor_q.get()
+ if devid == _devid:
+ return True
+ else:
+ temp_devs.append(devid)
+
+ for dev in temp_devs:
+ self.dumpMonitor_q.put(dev)
+
+ return False
+ '''
+
+
+class SdbDevice:
+ def __init__(self, devId, devName, devType):
+ self.devId = devId
+ self.devName = devName
+ self.devType = devType
+ self.devBuildId = ""
+
+ def _printDevInfo(self):
+ LOGGER.info("===== Device Infomation =====")
+ LOGGER.info(" Name : " + self.devName)
+ LOGGER.info(" Id : " + self.devId)
+ LOGGER.info(" Type : " + self.devType)
+ LOGGER.info("=============================")
+
+ def getDeviceId(self):
+ return self.devId
+
+ def getDeviceName(self):
+ return self.devName
+
+ def getDeviceType(self):
+ return self.devType
+
+ def getDeviceBuildId(self):
+ if self.devBuildId == "":
+ infoFilePath = Constants.LOCAL_BUILD_INFO_PATH % self.devId
+ if Constants.checkFileExists(infoFilePath) is False:
+ LOGGER.error("Not Found BuildInfo.xml file in %s" % self.devId)
+ LOGGER.error('Path : %s' % infoFilePath)
+ return None
+ try:
+ xml_tree = ElementTree.parse(infoFilePath)
+ xml_root = xml_tree.getroot()
+
+ for buildinfo in xml_root.findall('buildinfo'):
+ if buildinfo.get("name") == "buildVersion":
+ self.devBuildId = buildinfo.find("value").text
+ return self.devBuildId
+
+ except Exception as e:
+ LOGGER.warning("[ reading buildInfo XML fail, error : %s ] " % e)
+ return None
+ else:
+ return self.devBuildId
+
+class DevBaseManager(BaseManager):
+ pass
+
+DevBaseManager.register('DeviceManager', DeviceManager)
+
--- /dev/null
+import os
+import time
+import threading
+from multiprocessing import Process, Queue, Manager
+
+from .shellplanner import *
+from .sdbmanager import SdbManager
+from .result_summary import ResultSummary
+from .logmanager import LOGGER
+
+
+def wait_time(_time):
+ for loop in range(_time):
+ LOGGER.debug("Wait {} seconds......".format(_time-loop))
+ time.sleep(1)
+
+
+class AutoPlanExecutor(threading.Thread):
+
+ def __init__(self, plan, threadCounter, isPreconSet, envManager, \
+ run_timeout, devmgr):
+ #Process.__init__(self)
+ threading.Thread.__init__(self)
+ self.suites = {}
+ self.autop_executors = []
+ self.all_dev_threads = []
+ self.suite_q = Queue(maxsize=1)
+ self.plan = plan
+ self.devmgr = devmgr
+ self.name = plan.getPlanName()
+ self.tcCounter = threadCounter
+ self.isPreconSet = isPreconSet
+ self.notrun_count = 0
+ self._orgSuites()
+ self._prepareAutoPlan(self.isPreconSet)
+ self.envManager = envManager
+ self.finish_time = float(time.time()) + \
+ ((int(run_timeout)) * 60)
+
+ def run(self):
+ self._startAutoPlan()
+ LOGGER.debug("finished AutoPlanExecutor")
+
+ def _orgSuites(self):
+ if self.plan.getDeviceId() in self.suites:
+ self.suites[self.plan.getDeviceId()] += self.plan.getSuites()[:]
+ else:
+ self.suites[self.plan.getDeviceId()] = self.plan.getSuites()[:]
+
+ def _orgNotRunSuites(self, notRunSuites):
+ suites = []
+ LOGGER.debug("Finding Not Run suites")
+ LOGGER.debug("Suites to find: %s" % str(notRunSuites))
+ for suite in self.plan.getSuites():
+ if suite.suiteName in notRunSuites:
+ suites.append(suite)
+ if None in self.suites:
+ self.suites[None] += suites
+ else:
+ self.suites[None] = suites
+
+ def _prepareAutoPlan(self, isPreconSet, notrun=None):
+ runningDevs = self.devmgr.getSdbDeviceList()
+ self.autop_executors = []
+ for counter, dev in enumerate(runningDevs):
+ self.plan.setDeviceId(dev.getDeviceId())
+ self.suites[None].append('Finished')
+ process_name = dev.getDeviceId()
+ if notrun is not None:
+ process_name = "%s_notRun%d" % (dev.getDeviceId(), notrun)
+ autopExecutor = AutoPlanDevExecutor(self.plan, process_name, \
+ dev.getDeviceId(), counter + 1, self.suite_q, \
+ isPreconSet, self.devmgr)
+ self.autop_executors.append(autopExecutor)
+ self.all_dev_threads += self.autop_executors
+
+ def _is_run_timeout(self):
+ curr_time = float(time.time())
+
+ if self.finish_time > curr_time:
+ return False
+ else:
+ return True
+
+ def _startAutoPlan(self):
+ for worker in self.autop_executors:
+ worker.start()
+
+ while len(self.suites[None]) > 0:
+ done_inhost = False
+ wakeup_others = False
+ suite = self.suites[None][0]
+ if self._is_run_timeout():
+ LOGGER.error('tct-shell run/rerun timeout...')
+ while not self.suite_q.empty():
+ self.suites[None].insert(0, (self.suite_q.get(True)))
+ self._auto_test_inhost(self.suites[None])
+ self.suites[None] = []
+ break
+
+ timeout = 0
+ while self._no_worker_available():
+ '''
+ if self._exists_finished_worker():
+ wakeup_others = True
+ self._kill_all_workers()
+ LOGGER.debug("No need to reboot. Waking up other devices")
+ break
+ '''
+ LOGGER.info("Wait for the connected devices to be reconnected [%s:%s]" % \
+ (str(timeout), str(Constants.NO_WORKERS_TIMEOUT)))
+ time.sleep(10)
+ timeout += 10
+ if timeout >= Constants.NO_WORKERS_TIMEOUT:
+ LOGGER.error("The reboot times for all the devices have been exceeded")
+ while not self.suite_q.empty():
+ self.suites[None].insert(0, (self.suite_q.get(True)))
+ self._auto_test_inhost(self.suites[None])
+ self.suites[None] = []
+ done_inhost = True
+ break
+
+ if done_inhost or wakeup_others:
+ break
+ try:
+ self.suite_q.put(suite, True, 20)
+ except:
+ continue
+ self.suites[None].pop(0)
+
+ '''
+ for autopExecutor in self.autop_executors:
+ SdbManager.exportDumpFiles(autopExecutor.deviceId, \
+ self.plan.getResultFolderPath())
+ if autopExecutor.isRebooting():
+ self.envManager.kill_usbMonitor(autopExecutor.deviceId)
+ autopExecutor.killThread()
+ autopExecutor.join()
+ '''
+ for autopExecutor in self.autop_executors:
+ autopExecutor.join()
+ '''
+ for dev in self.devmgr.getSdbDeviceList():
+ SdbManager.exportDumpFiles(dev.getDeviceId(), \
+ self.plan.getResultFolderPath())
+ '''
+
+ summary = ResultSummary([self.plan])
+ '''
+ notRunSuites = summary.checkResults()
+
+ if len(notRunSuites) > 0:
+ while not self.suite_q.empty():
+ LOGGER.debug("Suite left in the queue. Clearing...")
+ self.suite_q.get(True)
+ LOGGER.debug("Starting Not Run suites")
+ self._orgNotRunSuites(notRunSuites)
+ LOGGER.debug("Not Run suites = %s" % str(self.suites[None]))
+ self.notrun_count += 1
+ self._prepareAutoPlan(self.isPreconSet, notrun=self.notrun_count)
+ self._startAutoPlan()
+ else:
+ '''
+ summary.genResults()
+ summary.genSummary()
+ self.plan.setFinished()
+
+ def _auto_test_inhost(self, suites):
+ self._kill_all_workers()
+ self._kill_liteprocess()
+ exeType = self.plan.getExecuteType()
+ for suite in suites:
+ if suite == 'Finished':
+ continue
+ if exeType.getCurrType() == ExecuteType.e_auto:
+ self.autoworker = AutoPlan_AutoSuiteWorker(suite, None, \
+ self.plan)
+ self.autoworker.auto_test_inhost()
+ elif exeType.getCurrType() == ExecuteType.e_manual:
+ continue
+ else:
+ self.autoworker = AutoPlan_AutoSuiteWorker(suite, None, \
+ self.plan)
+ self.autoworker.auto_test_inhost()
+
+ def _kill_liteprocess(self):
+ cmd = "ps aux | grep 'python /opt/testkit/lite[0-9].[0-9]/testkit-lite'"
+ result = SdbManager.hostCommandwithResult(cmd)
+ if isinstance(result, (bytes, bytearray)):
+ result = result.decode('utf-8')
+
+ LOGGER.debug(result)
+ grep_lines = result.split('\n')
+
+ kill_packages = []
+ for line in grep_lines:
+ if line and len(line) > 1:
+ proc_id = line.split()[1]
+ SdbManager.hostCommand('kill -9 %s' % proc_id)
+
+ res_url = line.split()[-1]
+ if res_url and res_url.find('shell/result') > -1:
+ spt_pack = res_url.split('/')[-1].split('.')[0]
+ kill_packages.append(spt_pack)
+
+ exeType = self.plan.getExecuteType()
+ suites = self.plan.getSuites()
+
+ for num in range(len(kill_packages)):
+ pack_name = str(kill_packages.pop())
+
+ for suite in suites:
+ if suite.getSuiteName().find(pack_name):
+ if exeType.getCurrType() == ExecuteType.e_auto:
+ self.autowoker = AutoPlan_AutoSuiteWorker(suite, None, \
+ self.plan)
+ self.autowoker.auto_test_inhost()
+ elif exeType.getCurrType() == ExecuteType.e_manual:
+ continue
+ else:
+ self.autowoker = AutoPlan_AutoSuiteWorker(suite, None, \
+ self.plan)
+ self.autowoker.auto_test_inhost()
+ break
+
+ def _no_worker_available(self):
+ executor_size = len(self.autop_executors)
+ curr_killed_executor = 0
+ for autopExecutor in self.autop_executors:
+ if autopExecutor.isKilled():
+ curr_killed_executor += 1
+
+ if executor_size == curr_killed_executor:
+ return True
+
+ return False
+
+ def _exists_finished_worker(self):
+ for autopExecutor in self.autop_executors:
+ if autopExecutor.isKilled():
+ return True
+ return False
+
+ def _kill_all_workers(self):
+ for autopExecutor in self.autop_executors:
+ autopExecutor.killThread()
+
+ def _require_kill_worker(self):
+ for autopExecutor in self.autop_executors:
+ if not autopExecutor.isKilled():
+ autopExecutor.killThread()
+
+ def getSuites(self):
+ return self.suites
+
+
+class AutoPlanDevExecutor(Process):
+
+ def __init__(self, plan, name, deviceId, threadCounter, suite_queue, \
+ isPreconSet, devmgr):
+ LOGGER.debug("Creating AutoPlanExecutor, with [device]: " + deviceId)
+ Process.__init__(self)
+ self.name = name
+ self.deviceId = deviceId
+ self.tcCounter = threadCounter
+ self.threadLock = threading.Lock()
+ self.suite_q = suite_queue
+ self.plan = plan
+ self.rebooting = Queue(1)
+ self.finished = Queue(1)
+ self.rebootLock = Queue()
+ self.devmgr = devmgr
+
+ def get_suite(self):
+ try:
+ suite = self.suite_q.get(True)
+ except Queue.Empty:
+ LOGGER.warning("AutoPlanDevExecutor.suite_queue empty exception")
+ pass
+
+ if suite == 'Finished':
+ LOGGER.debug('suite obtained: Finished')
+
+ return suite
+
+ def killThread(self):
+ if self.finished.empty():
+ LOGGER.debug("Killing [%s]" % self.name)
+ self.finished.put(1, block=False)
+ else:
+ LOGGER.debug("[%s] finished" % self.name)
+
+ def isKilled(self):
+ return not self.finished.empty()
+
+ def isRebooting(self):
+ return not self.rebooting.empty()
+
+ def setRebooting(self, reboot):
+ if reboot:
+ self.rebooting.put(1, block=False)
+ elif not self.rebooting.empty():
+ self.rebooting.get()
+
+ def run(self):
+ LOGGER.debug("Starting AutoPlanDevExecutor|DevID:{},PID:{}".\
+ format(self.deviceId, str(os.getpid())))
+ suite = None
+ is_reboot_timeout = False
+ while True:
+ if self.isKilled():
+ LOGGER.debug("finished AutoPlanDevExecutor|DevID:{},PID:{}".\
+ format(self.deviceId, str(os.getpid())))
+ break
+
+ if not self.devmgr.isDeviceAvailable(self.deviceId) and \
+ not is_reboot_timeout:
+ #reboot
+ LOGGER.error("Please reboot device : %s" % self.deviceId)
+ #scheduling purpose: waiting for UsbMonitor to release lock.
+ try:
+ self.rebootLock.get(block=True, timeout=60)
+ self.setRebooting(True)
+ except:
+ is_reboot_timeout = True
+
+ continue
+
+ elif is_reboot_timeout:
+ self.killThread()
+ LOGGER.error("%s is reboot timeout" % self.deviceId)
+ break
+ else:
+ if self.isRebooting():
+ LOGGER.info("Rebooting complete device : %s" % \
+ self.deviceId)
+ SdbManager.recoveryDevice(self.plan.getTizenVersion(), \
+ self.deviceId)
+ self.setRebooting(False)
+ self.is_reboot_timeout = False
+
+ '''
+ if self.devIns.check_dump_monitor_que(self.deviceId):
+ LOGGER.debug("Tracking dump device : %s" % self.deviceId)
+ self.killThread()
+ break
+ '''
+
+ suite = self.get_suite()
+ if suite == 'Finished':
+ self.killThread()
+ break
+ exeType = self.plan.getExecuteType()
+ if exeType.getCurrType() == ExecuteType.e_auto:
+ self.autoworker = AutoPlan_AutoSuiteWorker(suite, \
+ self.deviceId, self.plan)
+ self.autoworker.auto_test()
+ elif exeType.getCurrType() == ExecuteType.e_manual:
+ self.manualworker = AutoPlan_ManualSuiteWorker(suite, \
+ self.deviceId, self.plan)
+ self.manualworker.auto_test()
+ else:
+ self.autoworker = AutoPlan_AutoSuiteWorker(suite, \
+ self.deviceId, self.plan)
+ self.autoworker.auto_test()
+ self.manualworker = AutoPlan_ManualSuiteWorker(suite, \
+ self.deviceId, self.plan)
+ self.manualworker.auto_test()
+ try:
+ dump_files = SdbManager.exportDumpFiles(self.deviceId, \
+ self.plan.getResultFolderPath() + "/dump/" + suite.getSuiteName())
+ if dump_files:
+ SdbManager.deleteDumpFiles(self.deviceId, dump_files)
+ except Exception as ex:
+ LOGGER.error(str(ex))
+
+ LOGGER.debug("finished AutoPlanDevExecutor")
+
+
+class AutoPlan_AutoSuiteWorker:
+ def __init__(self, suite, deviceId, plan):
+ self.suite = suite
+ self.deviceId = deviceId
+ self.plan = plan
+ self.remTmpDir = plan.getDevTctTmpPath()
+ self.resultFolder = plan.getResultFolderPath()
+ self.tizenVer = plan.getTizenVersion()
+ self.isRerun = plan.isReRunning()
+ self.stubPort = plan.getStubPort()
+
+ def auto_test(self):
+ suite = self.suite
+ if suite.getAutoNum() is None or int(suite.getAutoNum()) == 0:
+ suite.setNoAuto()
+ LOGGER.warning('Suite : %s , AutoNum : 0' % (suite.getSuiteName()))
+ return
+
+ suiteName = suite.getSuiteName()
+ suite.runPreTestScript(self.deviceId)
+
+ LOGGER.info("Start to execute|suite:{},devid:{},pid:{}".\
+ format(suiteName, self.deviceId, os.getpid()))
+ LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
+
+ LOGGER.info('Checking if the suite ' + suiteName \
+ + ' is installed already.')
+ if suite.sdbCheckSuite(self.deviceId, suiteName):
+ LOGGER.info('The suite ' + suiteName + ' is existed. uninstalling')
+ LOGGER.info('Uninstalling the existed suite ' + suiteName)
+ suite.unInstallSuite(self.deviceId, self.remTmpDir)
+
+ LOGGER.info('Uploading the suite ' + suiteName)
+ LOGGER.info('Installing the suite ' + suiteName)
+
+ suite.installSuite(self.deviceId, self.remTmpDir)
+ LOGGER.info('Executing the suite ' + suiteName + ' in testkit-lite.')
+ suite.executePlanAuto(self.deviceId, self.resultFolder, \
+ suite.getTestCase(), self.isRerun, self.stubPort)
+
+ suite.runPostTestScript(self.deviceId)
+
+ LOGGER.info('removing the suite pkg file of the suite ' + suiteName)
+ LOGGER.info('Uninstalling the suite ' + suiteName)
+ suite.unInstallSuite(self.deviceId, self.remTmpDir)
+
+ LOGGER.info("Finished to execute|suite:{},devid:{},pid:{}".\
+ format(suiteName, self.deviceId, os.getpid()))
+ wait_time(10)
+
+ def auto_test_inhost(self):
+ suite = self.suite
+ if suite.getAutoNum() is None or int(suite.getAutoNum()) == 0:
+ suite.setNoAuto()
+ LOGGER.warning('Suite : %s , AutoNum : 0' % (suite.getSuiteName()))
+ return
+
+ suiteName = suite.getSuiteName()
+ LOGGER.info("Start to execute auto suite:%s" % suiteName)
+
+ LOGGER.info('Uploading the suite ' + suiteName)
+ LOGGER.info('Installing the suite ' + suiteName)
+ suite.installSuite(self.deviceId, self.remTmpDir)
+ LOGGER.info('Executing the suite ' + suiteName + ' in testkit-lite.')
+ suite.executePlanAuto(self.deviceId, self.resultFolder, \
+ suite.getTestCase(), self.isRerun, self.stubPort)
+
+ LOGGER.info('removing the suite pkg file of the suite ' + suiteName)
+ LOGGER.info('Uninstalling the suite ' + suiteName)
+ suite.unInstallSuite(self.deviceId, self.remTmpDir)
+
+ LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
+ LOGGER.info("Finished to execute auto suite:%s" % suiteName)
+
+
+class AutoPlan_ManualSuiteWorker:
+ def __init__(self, suite, deviceId, plan):
+ self.suite = suite
+ self.deviceId = deviceId
+ self.plan = plan
+
+ def auto_test(self):
+ deviceId = self.deviceId
+ remTmpDir = self.plan.getDevTctTmpPath()
+ resultFolder = self.plan.getResultFolderPath()
+ isRerun = self.plan.isReRunning()
+ stubPort = self.plan.getStubPor()
+ suite = self.suite
+
+ if suite.getManualNum() is None or int(suite.getManualNum()) == 0:
+ suite.setNoManual()
+ LOGGER.warning('Suite : %s , ManualNum : 0' % \
+ (suite.getSuiteName()))
+ return
+
+ suiteName = suite.getSuiteName()
+ LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
+
+ LOGGER.info('Checking if the suite ' + suiteName \
+ + 'is installed already.')
+ if suite.sdbCheckSuite(deviceId, suiteName):
+ LOGGER.info('The suite ' + suiteName + ' is existed. uninstalling')
+ LOGGER.info('Uninstalling the existed suite ' + suiteName)
+ suite.unInstallSuite(deviceId, remTmpDir)
+
+ LOGGER.info('Uploading the suite ' + suiteName)
+ LOGGER.info('Installing the suite ' + suiteName)
+ suite.installSuite(deviceId, remTmpDir)
+ LOGGER.info('Executing the suite ' + suiteName + ' in testkit-lite.')
+ suite.executePlanManual(deviceId, resultFolder, suite.getTestCase(), \
+ isRerun, stubPort)
+
+ LOGGER.info('removing the suite pkg file of the suite ' + suiteName)
+ LOGGER.info('Uninstalling the suite ' + suiteName)
+ suite.unInstallSuite(deviceId, remTmpDir)
+
+ LOGGER.info("Finished to execute manual suite: [%s]" % suiteName)
--- /dev/null
+#!/usr/bin/python
+
+import time
+from multiprocessing import Process
+
+from .logmanager import LOGGER
+from .sdbmanager import SdbManager
+
+class DumpMonitor(Process):
+
+ def __init__(self, _devid, _dump_name):
+ Process.__init__(self)
+ self.daemon = True
+ self.name = "DumpMonitor"
+ self.devid = _devid
+ self.dumpName = _dump_name
+ self.isFinish = False
+
+ def run(self):
+ LOGGER.debug("Starting DumpMonitor : %s" % self.devid)
+ cmd = self._make_ls_command()
+ if not cmd:
+ return
+
+ while True:
+ if self.isFinish:
+ break
+ time.sleep(10)
+ result = SdbManager.sdbShell(self.devid, cmd)
+ if result and self.dumpName:
+ for dName in self.dumpName.split(','):
+ if dName and str(result).find(dName) > -1:
+ self.devIns.add_dump_monitor_dev(self.devid)
+ return
+
+ def _make_ls_command(self):
+ dump_dir_path = SdbManager.findDumpPath(self.devid)
+ if dump_dir_path:
+ dump_ls_cmd = "ls -al %s" % dump_dir_path
+ return dump_ls_cmd
+ else:
+ return None
+
+ def kill_dumpmonitor(self):
+ self.isFinish = True
+
--- /dev/null
+#!/usr/bin/python
+
+from multiprocessing import Queue
+from .shellguider import Guider
+from .testenvironment import TestEnvironment
+from .usbmonitor import UsbMonitor
+from .netstatmonitor import NetstatMonitor
+from .dumpmonitor import DumpMonitor
+
+from .logmanager import LOGGER
+from .constants import Constants
+
+
+class EnvironmentManager:
+ def __init__(self, plans, isPreconSet, dump_name, devmgr):
+ self.plans = plans
+ self.dev_plans = {}
+ self.env_threads = []
+ self.connDevices = []
+ self.isPreconSet = isPreconSet
+ self.usb_monitor = None
+ self.netstat_monitors = []
+ self.dump_monitors = []
+ self.dev_recovery_locks = {}
+ self.dump_name = dump_name
+ self.devmgr = devmgr
+ self.orgPlans()
+ self.load_devices()
+ self.init_monitors()
+
+ def init_monitors(self):
+ if Constants.isDistMode():
+ for dev in self.connDevices:
+ dev_id = dev.getDeviceId()
+ if dev_id is None:
+ continue
+ if Constants.isSdbNetwork(dev_id):
+ pass
+ #netstat_m = NetstatMonitor(dev_id, self.devmgr)
+ #self.netstat_monitors.append(netstat_m)
+ else:
+ if not self.usb_monitor:
+ pass
+ #self.usb_monitor = UsbMonitor(self.devmgr)
+ '''
+ if self.dump_name:
+ dump_m = DumpMonitor(dev_id, self.dump_name)
+ self.dump_monitors.append(dump_m)
+ '''
+ else:
+ pass
+ '''
+ for devId in self.dev_plans.keys():
+ if Constants.isSdbNetwork(devId):
+ netstat_m = NetstatMonitor(devId, self.devmgr)
+ self.netstat_monitors.append(netstat_m)
+ else:
+ if not self.usb_monitor:
+ self.usb_monitor = UsbMonitor(self.devmgr)
+ '''
+
+ def kill_monitors(self):
+ if self.usb_monitor:
+ self.usb_monitor.kill_usbmonitor()
+
+ self.kill_netstatMonitor()
+
+ for dumpM in self.dump_monitors:
+ dumpM.kill_dumpmonitor()
+
+ def kill_netstatMonitor(self):
+ for nsMonitor in self.netstat_monitors:
+ nsMonitor.kill_netMonitor()
+
+ def kill_usbMonitor(self, devid):
+ if self.usb_monitor:
+ self.usb_monitor.device_recovered(devid)
+
+ def start_usbMonitor(self):
+ if self.usb_monitor:
+ self.usb_monitor.start()
+
+ def start_netstatMonitor(self):
+ for nsMonitor in self.netstat_monitors:
+ nsMonitor.start()
+
+ def start_dumpMonitor(self):
+ for dumpMonitor in self.dump_monitors:
+ dumpMonitor.start()
+
+ def load_devices(self):
+ self.devmgr.loadDeviceList()
+ self.connDevices = self.devmgr.getSdbDeviceList()
+
+ def orgPlans(self):
+ if self.plans:
+ for plan in self.plans:
+ if len(plan.getSuites()) < 1:
+ continue
+ deviceId = plan.getDeviceId()
+ tizenVer = plan.getTizenVersion()
+
+ if not deviceId in self.dev_plans:
+ self.dev_plans[deviceId] = {}
+
+ if not tizenVer in self.dev_plans[deviceId]:
+ self.dev_plans[deviceId][tizenVer] = []
+
+ self.dev_plans[deviceId][tizenVer].append(plan)
+
+ def env_setup(self):
+ err_msg_queue = Queue()
+ for devId, devId_val in self.dev_plans.items():
+ for tizenVer, plans in devId_val.items():
+ if Constants.isDistMode():
+ for dev in self.connDevices:
+ tEn = TestEnvironment(tizenVer, dev.getDeviceId(), \
+ self.isPreconSet, err_msg_queue, self.devmgr)
+ tEn.start()
+ self.env_threads.append(tEn)
+ else:
+ tEn = TestEnvironment(tizenVer, devId, self.isPreconSet, \
+ err_msg_queue, self.devmgr)
+ tEn.start()
+ self.env_threads.append(tEn)
+
+ for thread in self.env_threads:
+ thread.join()
+
+ if not err_msg_queue.empty():
+ raise
+
+ def guider_setup(self):
+ for devId, devId_val in self.dev_plans.items():
+ for tizenVer, plans in devId_val.items():
+ for plan in plans:
+ if Constants.isDistMode():
+ guider = Guider(plan, [dev.getDeviceId() \
+ for dev in self.connDevices])
+ else:
+ guider = Guider(plan)
+
+ guider.init_items()
+ if self.isPreconSet:
+ guider.setup_manual_env()
+ guider.setup_default_env()
+
+ def check_build_ids(self):
+ if Constants.isDistMode() and \
+ not Constants.checkBuildIds(self.connDevices):
+ LOGGER.error("All connected devices should have the same build ids for distribute/auto-plan mode.")
+ LOGGER.error("Devices with different build ids connected")
+ raise
+ return True
+
+ def setup(self):
+ self.env_setup()
+ self.check_build_ids()
+ self.guider_setup()
+
+ def start_monitor(self):
+ self.start_usbMonitor()
+ self.start_netstatMonitor()
+ self.start_dumpMonitor()
+
+ def recovery_setup(self, workers):
+ for worker in workers:
+ if Constants.isSdbNetwork(worker.deviceId):
+ for nsMonitor in self.netstat_monitors:
+ if nsMonitor.deviceId == worker.deviceId:
+ nsMonitor.setup_recovery(worker.rebootLock)
+ else:
+ if self.usb_monitor:
+ self.usb_monitor.setup_recovery(\
+ worker.deviceId, worker.rebootLock)
--- /dev/null
+
+class DevNotFoundErr(Exception):
+ def __init__(self, _devid):
+ self.devid = _devid
+ def __str__(self):
+ return repr(self.devid)
--- /dev/null
+#!/usr/bin/python
+
+from Tkinter import *
+
+class ActionFrame(Frame):
+ def __init__(self, parent):
+ Frame.__init__(self, parent)
+ self.parent = parent
+ self.planMenus = []
+ self.devMenus = []
+ self.tVerMenus = []
+ self.plans = []
+ self.devices = []
+ self.tVersions = []
+ self.scenario = []
+ self.checkReady = []
+
+ def initUI(self):
+ for plan in self.plans:
+ self.addPlan()
+ self.infoLabel = Label(self.parent, text = "Prepare plans: choose plan, device id and tizen version.\n--Plans that aren't ready will be ignored", width = 75, height =4)
+ self.infoLabel.grid(column = 1, row = 0, columnspan=4)
+ self.addButton = Button(self.parent, text='Add Plan', command=self.addPlan, width = 37, height = 2)
+ self.addButton.grid(column=1, row=1, columnspan=2, sticky='w')
+ self.doneButton = Button(self.parent, text='Done', command=self.done, width = 37, height=2)
+ self.doneButton.grid(column=2, row=1, columnspan=2, sticky='E')
+
+
+ def importData(self, plans, devices, tVersions):
+ self.plans = plans
+ self.devices = devices
+ self.tVersions = tVersions
+ self.planOptions = plans[:]
+ self.devOptions = devices[:]
+ self.tVerOptions = tVersions[:]
+ self.set_default()
+
+ def set_default(self):
+ self.planOptions.insert(0, "Select plan")
+ self.devOptions.insert(0, "Select device")
+ self.tVerOptions.insert(0, "Select version")
+
+ def check(self, internal_v, index, op_mode):
+ for i in range(len(self.planMenus)):
+ selectedPlan = self.planMenus[i].get()
+ selectedDevice = self.devMenus[i].get()
+ selectedVersion = self.tVerMenus[i].get()
+ if not ("Select " in selectedPlan + selectedDevice + selectedVersion):
+ self.checkReady[i].config(text="Plan #%d : Ready" %(i+1), fg="green")
+ else:
+ self.checkReady[i].config(text="Plan #%d"%(i+1), fg='red')
+
+ def addPlan(self):
+ tail = len(self.planMenus)
+ self.planMenus.append(StringVar(self.parent))
+ self.planMenus[tail].set(self.planOptions[0])
+ self.planMenus[tail].trace_variable('w', callback=self.check)
+ self.devMenus.append(StringVar(self.parent))
+ self.devMenus[tail].set(self.devOptions[0])
+ self.devMenus[tail].trace_variable('w', callback=self.check)
+ self.tVerMenus.append(StringVar(self.parent))
+ self.tVerMenus[tail].set(self.tVerOptions[0])
+ self.tVerMenus[tail].trace_variable('w', callback=self.check)
+ self.checkReady.append(Label(self.parent, text="Plan #%d" %(tail+1), fg='red'))
+ self.checkReady[tail].config(width = 15)
+ self.checkReady[tail].grid(column = 0, row = tail+2)
+ w = apply(OptionMenu, (self.parent, self.planMenus[tail]) + tuple(self.planOptions))
+ w.config(width = 15)
+ w.grid(column = 1, row = tail+2)
+ w = apply(OptionMenu, (self.parent, self.devMenus[tail]) + tuple(self.devOptions))
+ w.config(width = 40)
+ w.grid(column = 2, row = tail+2)
+ w = apply(OptionMenu, (self.parent, self.tVerMenus[tail]) + tuple(self.tVerOptions))
+ w.config(width = 10)
+ w.grid(column = 3, row = tail+2)
+ self.check("", "", "")
+ def run(self):
+ #Button(root, text='Start', command=self.onStart, width=10).pack(side=LEFT)
+ #Button(root, text='Exit', command=self.onExit, width=10).pack(side=LEFT)
+ self.parent.mainloop()
+
+ def done(self):
+ for i in range(len(self.planMenus)):
+ selectedPlan = self.planMenus[i].get()
+ selectedDevice = self.devMenus[i].get()
+ selectedVersion = self.tVerMenus[i].get()
+ if not ("Select " in selectedPlan + selectedDevice + selectedVersion):
+ strDevlist = [str(dev) for dev in self.devices]
+ print strDevlist
+ print self.devices
+ self.scenario.append([selectedPlan, self.devices[strDevlist.index(selectedDevice)], selectedVersion])
+ self.parent.quit()
+
+ def getScenData(self):
+ return self.scenario
--- /dev/null
+#!/usr/bin/python
+from action_frame import ActionFrame
+from Tkinter import *
+
+class MainWindow:
+ def __init__(self, title='Empty Title'):
+ self.root = Tk()
+ self.root.title(title)
+ self.root.geometry("900x500+300+300")
+
+ def getActionFrame(self):
+ self.actionFrame = ActionFrame(self.root)
+
+ def importData(self, plans, devices, tVersions):
+ self.actionFrame.importData(plans, devices, tVersions)
+ self.actionFrame.initUI()
+ def run(self):
+ #Button(root, text='Start', command=self.onStart, width=10).pack(side=LEFT)
+ #Button(root, text='Exit', command=self.onExit, width=10).pack(side=LEFT)
+ self.root.mainloop()
+ def getScenData(self):
+ return self.actionFrame.getScenData()
+
+ def onExit(self):
+ self.root.quit()
+
+ def onStart(self):
+ print "START"
--- /dev/null
+#!/usr/bin/python
+import os
+import re
+from .constants import Constants
+from .shellwrapper import IntentionType
+from xml.etree import ElementTree
+import xml.etree.ElementTree as etree
+from .result_summary import ResultSummary
+from .logmanager import LOGGER
+from .shellplanner import *
+
+
+def _verifyPlan(planfile, tizenVersion):
+ xml_tree = ElementTree.parse(planfile)
+ xml_root = xml_tree.getroot()
+ executeType = xml_root.find('execute_type')
+ suites = xml_root.findall('suite')
+ if executeType is None:
+ LOGGER.warning("[WARNING] Plan xml:" + \
+ " No execute type specified in plan xml")
+ elif not executeType.text in ['All', 'Auto', 'Manual']:
+ LOGGER.warning("[WARNING] Plan xml: Execute type in plan xml: %s. \
+ Execute type should be either All, Auto or Manual" \
+ % executeType.text)
+ if len(suites) < 1:
+ LOGGER.warning("No suites specified in plan xml")
+ return True
+
+
+def _verifySuite(suite, tizenVersion):
+ try:
+ suite_name = suite.get('name')
+ launcher = suite.get('launcher')
+ auto_tcn = suite.find('auto_tcn')
+ manual_tcn = suite.find('manual_tcn')
+ total_tcn = suite.find('total_tcn')
+ if suite_name is None:
+ LOGGER.warning("[ERROR] Plan xml: Suite name is not specified")
+ return False
+
+ if suite.find('pkg_name') is None:
+ LOGGER.warning("[ERROR] Plan xml:" + \
+ " Package name is not specified for suite: %s" % suite_name)
+ return False
+
+ suite_pkg_name = suite.find('pkg_name').text
+ suite_zipname = os.path.basename(suite_pkg_name)
+ suite_path = os.path.join(Constants.SUITES_REPOSITORY % tizenVersion, \
+ suite_pkg_name)
+ if not os.path.isfile(suite_path):
+ LOGGER.warning("suite_path does not exist. [%s]" % suite_path)
+ return False
+ auto_num, manual_num, suite_launcher, suite_category, tc_exist, s_name\
+ = _get_suiteInfo(suite_zipname, suite_path, None)
+
+ if suite_name != s_name:
+ LOGGER.warning("[ERROR] Plan xml: Suite name [%s] does not match with \
+ suite package name" % suite_name)
+ return False
+
+ if launcher != suite_launcher:
+ LOGGER.warning("[WARNING] Plan xml: \
+ Suite [%s] running on a different launcher" % suite_name)
+
+ if auto_tcn is None:
+ LOGGER.warning("[ERROR] Plan xml: \
+ Suite [%s] Auto testcase count not specified" % suite_name)
+ return False
+ elif auto_tcn.text != str(auto_num):
+ LOGGER.warning("[WARNING] Plan xml: \
+ Suite [%s] Wrong auto testcase count" % suite_name)
+
+ if manual_tcn is None:
+ LOGGER.warning("[ERROR] Plan xml: \
+ Suite [%s] Manual testcase count not specified" % suite_name)
+ return False
+ elif manual_tcn.text != str(manual_num):
+ LOGGER.warning("[WARNING] Plan xml: \
+ Suite [%s] Wrong manual testcase count" % suite_name)
+
+ if total_tcn is None:
+ LOGGER.warning("[ERROR] Plan xml: \
+ Suite [%s] Total testcase count not specified" % suite_name)
+ return False
+ elif total_tcn.text != str(manual_num + auto_num):
+ LOGGER.warning("[WARNING] Plan xml: \
+ Suite [%s] Wrong total testcase count" % suite_name)
+
+ Constants.clean_unzip_file()
+ except Exception as ex:
+ LOGGER.warning(str(ex))
+ return True
+
+
+def _get_suiteInfo(filesname, filepath, tc_name):
+ Constants.unzip_package(filepath)
+ m = re.split(Constants.REGEX_FOR_SPLIT_PKG_NAME, filesname)
+ name = m[0]
+ test_file = os.path.expanduser("~") + "/" + Constants.DEFAULT_PLAN_FILE + \
+ "/opt/" + name + "/tests.xml"
+ LOGGER.debug("Getting information from suite package: %s" % test_file)
+ if not os.path.exists(test_file):
+ LOGGER.warning("Can't find the test file...")
+ return 0, 0, Constants.WRT_LAUNCHER_CMD, None
+ return _read_xml_suiteInfo(test_file, tc_name)
+
+
+def _read_xml_suiteInfo(test_file, tc_name):
+ try:
+ autocnt = manualcnt = 0
+ test_xml_temp = etree.parse(test_file)
+ tc_exist = False
+ for test_xml_temp_suite in test_xml_temp.getiterator('suite'):
+ suite_name = test_xml_temp_suite.get('name')
+ suite_launcher = test_xml_temp_suite.get('launcher')
+ suite_category = test_xml_temp_suite.get('category')
+ autocnt = manualcnt = 0
+ for tset in test_xml_temp_suite.getiterator('set'):
+ set_autocnt, set_manualcnt, tcCheck = \
+ _read_xml_tcInfo(tset, tc_name)
+ autocnt += set_autocnt
+ manualcnt += set_manualcnt
+ if tcCheck:
+ tc_exist = True
+
+ return autocnt, manualcnt, suite_launcher, suite_category, tc_exist, \
+ suite_name
+
+ except Exception as msg:
+ LOGGER.warning("error read xml %s package : %s" % \
+ (str(test_file), str(msg)))
+ return 0, 0, None, None, None, None
+
+
+def _read_xml_tcInfo(tset, tc_name):
+ set_autocnt = set_manualcnt = 0
+ tcCheck = False
+ for tcase in tset.getiterator('testcase'):
+ tcId = tcase.get('id')
+ exetype = tcase.get('execution_type')
+ if exetype == "auto":
+ set_autocnt += 1
+ elif exetype == "manual":
+ set_manualcnt += 1
+ if tc_name == tcId:
+ tcCheck = True
+
+ return set_autocnt, set_manualcnt, tcCheck
+
+
+def _parsTestScenario(scen_name, file_path, stubPort, skip_package, \
+ skip_count, skip_tc):
+ LOGGER.debug("parsing Test Scenario : " + file_path)
+ plans = []
+ xml_tree = ElementTree.parse(file_path)
+ xml_root = xml_tree.getroot()
+ for xml_plan in xml_root.findall('plan'):
+ plan_file_path = xml_plan.find("path").text
+ plan_name = xml_plan.get("name")
+ plan_deviceId = xml_plan.find("device").get("id")
+ plan_tizenVersion = xml_plan.find("version").text
+ plans.append(_parsTestPlan(plan_file_path, plan_name, plan_deviceId, \
+ None, plan_tizenVersion, None, stubPort, skip_package, \
+ skip_count, skip_tc, scen_name)[0])
+ return plans
+
+
+# return : TctShellSuite []
+def _parsTestPlan(file_path, plan_name, deviceId, executeType, tizenVersion, \
+ resultFolder, stubPort, skip_package, skip_count, skip_tc, devmgr, \
+ scen_name=None, make_ne_package=None, pre_test=None, post_test=None):
+ suites = []
+ profile = ""
+ if not _verifyPlan(file_path, tizenVersion):
+ LOGGER.warning("Please check the plan xml file: %s" % file_path)
+ return None
+
+ LOGGER.debug("parsing Test Plan : " + plan_name)
+ xml_tree = ElementTree.parse(file_path)
+ xml_root = xml_tree.getroot()
+ if xml_root.get('profile') is not None:
+ profile = xml_root.get('profile')
+
+ if not executeType:
+ executeType = ExecuteType.createExecuteType(\
+ xml_root.find('execute_type').text)
+
+ for xml_suite in xml_root.findall('suite'):
+ if not _verifySuite(xml_suite, tizenVersion):
+ continue
+
+ packName = xml_suite.get("name")
+ if skip_package and str(skip_package).find(packName) > -1:
+ LOGGER.info("[skip package : %s]" % packName)
+ else:
+ is_make_ne = 0
+ if make_ne_package and str(make_ne_package).find(suite_name) > -1:
+ issue_num = _pars_issue_num(make_ne_package[0], suite_name)
+ is_make_ne = int(issue_num)
+
+ suite = TctShellSuite(packName, None, \
+ xml_suite.find("auto_tcn").text, \
+ xml_suite.find("manual_tcn").text, \
+ xml_suite.find("pkg_name").text, \
+ xml_suite.get("launcher"), xml_suite.get("category"), \
+ tizenVersion, skip_count, skip_tc, devmgr, \
+ pre_test=pre_test, \
+ post_test=post_test, \
+ is_make_ne=is_make_ne)
+ suites.append(suite)
+
+ plan = TctShellPlan(plan_name, devmgr, deviceId, profile, executeType, \
+ suites, tizenVersion, resultFolder, stubPort, scen_name)
+
+ if Constants.isDistMode():
+ if not plan.setup_distribute():
+ raise
+
+ return [plan]
+
+
+def _parsTestProfile(path_suites, deviceId, executeType, tizenV, profile, \
+ resultFolder, stubPort, skip_package, skip_count, skip_tc, devmgr, \
+ distribute_count, make_ne_package=None, pre_test=None, post_test=None):
+ suites = []
+ LOGGER.debug("Preparing Test Suite ")
+ suite_profile = os.path.basename(os.path.dirname(path_suites[0]))
+ for counter, suite_path in enumerate(path_suites):
+ counter = counter + 1
+ suite_profile = os.path.basename(os.path.dirname(suite_path))
+ suite_zipname = os.path.basename(suite_path)
+ suite_name = _geneSuiteName(suite_zipname, tizenV)
+ auto_num, manual_num, suite_launcher, suite_category, tc_exist, s_name\
+ = _get_suiteInfo(suite_zipname, suite_path, None)
+
+ suite_tizenVer = tizenV
+ suite_pkg_name = os.path.join(suite_profile, \
+ os.path.basename(suite_path))
+
+ dist_res = None
+ if distribute_count:
+ dist_res = _check_dist_number(counter, distribute_count)
+
+ if skip_package and str(skip_package).find(suite_name) > -1:
+ LOGGER.info("[skip package : %s]" % suite_name)
+ elif auto_num == 0 and manual_num == 0:
+ pass
+ else:
+ is_make_ne = 0
+ if make_ne_package and str(make_ne_package).find(suite_name) > -1:
+ issue_num = _pars_issue_num(make_ne_package[0], suite_name)
+ is_make_ne = int(issue_num)
+
+ suite = TctShellSuite(suite_name, None, auto_num, manual_num, \
+ suite_pkg_name, suite_launcher, suite_category, \
+ suite_tizenVer, skip_count, skip_tc, devmgr, \
+ pre_test=pre_test, \
+ post_test=post_test, \
+ is_make_ne=is_make_ne)
+
+ if not distribute_count:
+ suites.append(suite)
+ elif dist_res:
+ suites.append(suite)
+
+ Constants.clean_unzip_file()
+
+ temp_plan_name = profile
+ plan = TctShellPlan(temp_plan_name, devmgr, deviceId, profile, executeType, \
+ suites, tizenV, resultFolder, stubPort)
+
+ if Constants.isDistMode():
+ if not plan.setup_distribute():
+ raise
+
+ return [plan]
+
+
+def _parsTestSuite(path_suites, deviceId, executeType, tizenVersion, tc_name, \
+ resultFolder, stubPort, devmgr, skip_count=None, skip_tc=None, \
+ pre_test=None, post_test=None, make_ne_package=None):
+ #type(suites) -> list
+ suites = []
+ LOGGER.debug("Preparing Test Suite ")
+ suite_profile = os.path.basename(os.path.dirname(path_suites[0]))
+ for suite_path in path_suites:
+ suite_zipname = os.path.basename(suite_path)
+ suite_name = _geneSuiteName(suite_zipname, tizenVersion)
+ auto_num, manual_num, suite_launcher, suite_category, tc_exist, s_name\
+ = _get_suiteInfo(suite_zipname, suite_path, tc_name)
+ if tc_name is not None and not tc_exist:
+ LOGGER.warning("Testcase Id : [%s] does not exist in suite : [%s]" \
+ % (tc_name, suite_name))
+ return None
+
+ suite_tizenVer = tizenVersion
+ suite_pkg_name = os.path.join(suite_profile, \
+ os.path.basename(suite_path))
+
+ is_make_ne = 0
+ if make_ne_package and str(make_ne_package).find(suite_name) > -1:
+ issue_num = _pars_issue_num(make_ne_package[0], suite_name)
+ is_make_ne = int(issue_num)
+
+ suite = TctShellSuite(suite_name, tc_name, auto_num, manual_num, \
+ suite_pkg_name, suite_launcher, suite_category, \
+ suite_tizenVer, skip_count, skip_tc, devmgr, \
+ pre_test=pre_test, \
+ post_test=post_test, \
+ is_make_ne=is_make_ne)
+
+ suites.append(suite)
+ Constants.clean_unzip_file()
+
+ temp_plan_name = "temp_plan_name"
+ plan = TctShellPlan(temp_plan_name, devmgr, deviceId, suite_profile, executeType, \
+ suites, tizenVersion, resultFolder, stubPort)
+
+ if Constants.isDistMode():
+ if not plan.setup_distribute():
+ raise
+
+ return [plan]
+
+
+def _parsTestCase(path_suites, deviceId, executeType, tizenVersion, \
+ testcase_id, resultFolder, stubPort, devmgr):
+ LOGGER.debug("parsing Test Case : " + str(testcase_id))
+
+ return _parsTestSuite(path_suites, deviceId, executeType, tizenVersion, \
+ testcase_id, resultFolder, stubPort, devmgr)
+
+
+def _parsAutoPlan(planFile, plan_name, executeType, tizenVer, \
+ resultFolderPath, stubPort, skip_package, skip_count, skip_tc, \
+ devmgr, pre_test=None, post_test=None, make_ne_package=None):
+ if not _verifyPlan(planFile, tizenVer):
+ LOGGER.warning("Please check the plan xml file: %s" % planFile)
+ return None
+
+ LOGGER.debug("parsing Test Plan : " + planFile)
+ suites = []
+ profile = ""
+ planList = []
+ deviceLen = devmgr.getDeviceSize()
+ if deviceLen < 1:
+ LOGGER.error("No connected device")
+ return None
+
+ LOGGER.info("Plan [%s] will be distributed to %d devices" \
+ % (plan_name, deviceLen))
+ devices = devmgr.getSdbDeviceList()
+ xml_tree = ElementTree.parse(planFile)
+ xml_root = xml_tree.getroot()
+ if xml_root.get('profile') is not None:
+ profile = xml_root.get('profile')
+
+ if not executeType:
+ executeType = ExecuteType.createExecuteType(\
+ xml_root.find('execute_type').text)
+
+ for dev in range(deviceLen):
+ planTempName = plan_name + str(dev)
+ devId = devices[dev].getDeviceId()
+ planList.append(TctShellPlan(planTempName, devId, profile, \
+ executeType, [], tizenVer, resultFolderPath, stubPort, \
+ plan_name))
+
+ for xml_suite in xml_root.findall('suite'):
+ if not _verifySuite(xml_suite, tizenVer):
+ continue
+ autoCount = int(xml_suite.find("auto_tcn").text)
+ category = xml_suite.get("category")
+ if category and category.find('Runtime') > -1:
+ etime = autoCount * (Constants.SUITE_TEST_EXPECTED_TIME + 2)
+ else:
+ etime = (autoCount * 2) + Constants.SUITE_TEST_EXPECTED_TIME
+
+ suite_name = xml_suite.get("name")
+ if skip_package and str(skip_package).find(suite_name) > -1:
+ LOGGER.error("[skip package : %s]" % suite_name)
+ else:
+ is_make_ne = 0
+ if make_ne_package and str(make_ne_package).find(suite_name) > -1:
+ issue_num = _pars_issue_num(make_ne_package[0], suite_name)
+ is_make_ne = int(issue_num)
+
+ suite = TctShellSuite(suite_name, None, \
+ xml_suite.find("auto_tcn").text, xml_suite.find("manual_tcn").text,\
+ xml_suite.find("pkg_name").text, xml_suite.get("launcher"), \
+ xml_suite.get("category"), tizenVer, skip_count, skip_tc, \
+ devmgr, pre_test=pre_test, post_test=post_test, is_make_ne=is_make_ne)
+
+ suite.setExpectedTime(etime)
+ if suite.suite_pkg_name is None:
+ LOGGER.warning("suite: [%s] has missing information" \
+ % suite.suiteName)
+ return None
+ suites.append(suite)
+ suites.sort(key=lambda x: x.expectedTime, reverse=True)
+ for suite in suites:
+ minPlan = min(planList, key=lambda x: x.expectedTime)
+ minPlan.addExpectedTime(suite.getExpectedTime())
+ minPlan.addSuite(suite)
+
+ for plan in planList:
+ LOGGER.debug("%s has ECT: %d" % (plan.getPlanName(), \
+ plan.expectedTime))
+
+ return planList
+
+
+def _parsResultForRerun(wrapper, skip_package, skip_count, skip_tc, devmgr, \
+ distribute_count, pre_test=None, post_test=None, make_ne_package=None):
+ result = wrapper.get_result_for_rerun()
+ rerun_plan_creator = ResultSummary()
+ rerun_data = rerun_plan_creator.prepareRerun(result)
+ if len(rerun_data) < 1:
+ LOGGER.debug("No unpassed results to rerun")
+ return None
+
+ plans = []
+ for plan_path, rerun_info in rerun_data.items():
+ planFolder = plan_path
+ intention_info = rerun_info[0]
+ suites_path = rerun_info[1]
+ plan_name = intention_info[0]
+ executeType = ExecuteType.createExecuteType(intention_info[1])
+ profile = intention_info[2]
+ tizenVer = intention_info[3]
+ deviceId = intention_info[4]
+ scen_resultFolderPath = intention_info[6]
+
+ if len(suites_path) < 1:
+ LOGGER.debug("No unpassed results to rerun in plan: [%s]" \
+ % plan_name)
+ continue
+
+ if devmgr.getDevice(deviceId) is None:
+ if len(rerun_data) > 1:
+ LOGGER.error("Required devices not connected. " + \
+ "Check what devices were used for the scenario.")
+
+ LOGGER.warning("WARNING: \
+ Device used for the test is not connected: \
+ device id: %s" % deviceId)
+ LOGGER.warning("WARNING: Rerunning the test in a different device")
+ if Constants.isDistMode():
+ deviceId = None
+ else:
+ deviceId = wrapper.get_deviceId()
+
+ suites = []
+ resultFolderPath = wrapper.get_resultFolderPath()
+ if not resultFolderPath:
+ resultFolderPath = planFolder
+
+ for counter, suite_path in enumerate(suites_path):
+ counter = counter + 1
+ suite_pkg_name = os.path.join(os.path.basename(\
+ os.path.dirname(suite_path)), os.path.basename(suite_path))
+ suite_zipname = os.path.basename(suite_pkg_name)
+ suite_name = _geneSuiteName(suite_zipname, tizenVer)
+ auto_num, manual_num, suite_launcher, suite_category, \
+ tc_exist, s_name = _get_suiteInfo(suite_zipname, \
+ suite_path, None)
+
+ dist_res = None
+ if distribute_count:
+ dist_res = _check_dist_number(counter, distribute_count)
+
+ if skip_package and str(skip_package).find(suite_name) > -1:
+ LOGGER.error("[skip package : %s]" % suite_name)
+ else:
+ is_make_ne = 0
+ if make_ne_package and \
+ str(make_ne_package).find(suite_name) > -1:
+ issue_num = _pars_issue_num(make_ne_package[0], \
+ suite_name)
+ is_make_ne = int(issue_num)
+
+ suite = TctShellSuite(suite_name, None, auto_num, manual_num, \
+ suite_pkg_name, suite_launcher, suite_category, \
+ tizenVer, skip_count, skip_tc, devmgr, \
+ pre_test=pre_test, \
+ post_test=post_test, \
+ is_make_ne=is_make_ne)
+
+ if not distribute_count:
+ suites.append(suite)
+ elif dist_res:
+ suites.append(suite)
+
+ plan = TctShellPlan(plan_name, devmgr, deviceId, profile, executeType, suites,\
+ tizenVer, resultFolderPath, wrapper.get_stubPort())
+ plan.setScenResultFolderPath(scen_resultFolderPath)
+ plan.setRerunning(True)
+ plans.append(plan)
+
+ if Constants.isDistMode():
+ for plan in plans:
+ if not plan.setup_distribute():
+ raise
+
+ return plans
+
+
+def _geneSuiteName(suite_zipname, _tizenV):
+ suite_name = ""
+ match_ext = ""
+
+ if _tizenV:
+ match_ext = "-{}.zip".format(_tizenV.split('_')[-1])
+ find_idx = suite_zipname.find(match_ext)
+ if find_idx > -1:
+ suite_name = suite_zipname[0:find_idx]
+ else:
+ LOGGER.warning("Not found suite name")
+
+ return suite_name
+
+
+MATCH_CT = 0
+def _check_dist_number(suite_num, dist_ct):
+ global MATCH_CT
+ total = int(dist_ct.split('-')[0])
+ curr = int(dist_ct.split('-')[1])
+
+ if curr > total:
+ LOGGER.error("distribute command error")
+ raise
+
+ if MATCH_CT == 0:
+ MATCH_CT = MATCH_CT + curr
+ if suite_num == MATCH_CT:
+ MATCH_CT = MATCH_CT + total
+ return True
+ else:
+ return False
+
+
+def _pars_issue_num(_make_ne_package, _suite_name):
+ ne_pack_list = _make_ne_package.split(',')
+ for _pn in ne_pack_list:
+ if _pn.find(_suite_name) > -1:
+ return _pn.split(':')[1]
+ return 0
+
+
+class IntentionGenerator:
+ # return : bool
+ @staticmethod
+ def genIntentionData(wrapper, devmgr):
+ skip_package = wrapper.get_skip_package()
+ skip_count = wrapper.get_skip_count()
+ skip_tc = wrapper.get_skip_tc()
+ make_ne_package = wrapper.get_make_ne()
+ pre_test = wrapper.get_pre_test()
+ post_test = wrapper.get_post_test()
+ distribute_count = wrapper.get_distribute_count()
+
+ if wrapper.get_running_mode() == Constants.RUNNING_MODE_RERUN:
+ return _parsResultForRerun(wrapper, skip_package, skip_count, \
+ skip_tc, devmgr, distribute_count, \
+ make_ne_package=make_ne_package)
+
+ intention_type = wrapper.getIntentionType()
+ deviceId = None
+ if not (intention_type == IntentionType.AutoPlan or \
+ Constants.isDistMode()):
+ deviceId = wrapper.get_deviceId()
+ else:
+ deviceId = None
+
+ tcId = wrapper.get_testcase_id()
+ executeType = wrapper.get_execute_type()
+ suites = wrapper.get_suites()
+ tizenVer = wrapper.get_tizenV()
+ resultFolderPath = wrapper.get_resultFolderPath()
+ stubPort = wrapper.get_stubPort()
+
+ if intention_type == -1:
+ return None
+
+ if (intention_type == IntentionType.TestPlan or \
+ intention_type == IntentionType.TestProfile or \
+ intention_type == IntentionType.TestSuite) and \
+ not Constants.isDistMode():
+ if not wrapper.is_make_summary_mode():
+ if not devmgr.isDeviceAvailable(deviceId):
+ LOGGER.error("Device [%s] is not connected" % deviceId)
+ LOGGER.error("Required devices not connected properly")
+ return None
+
+ if intention_type == IntentionType.TestScenario:
+ scenFile = wrapper.get_scenfile()
+ scenName = wrapper.get_scen_name()
+ plans = _parsTestScenario(scenName, scenFile, stubPort, \
+ skip_package, skip_count, skip_tc)
+ elif intention_type == IntentionType.TestPlan:
+ name = wrapper.get_plan_name()
+ planFile = wrapper.get_planfile()
+ plans = _parsTestPlan(planFile, name, deviceId, executeType, \
+ tizenVer, resultFolderPath, stubPort, skip_package, \
+ skip_count, skip_tc, devmgr, make_ne_package=make_ne_package, \
+ pre_test=pre_test, post_test=post_test)
+ elif intention_type == IntentionType.TestCase:
+ plans = _parsTestCase(suites, deviceId, executeType, tizenVer, \
+ tcId, resultFolderPath, stubPort, devmgr)
+ elif intention_type == IntentionType.TestSuite:
+ plans = _parsTestSuite(suites, deviceId, executeType, tizenVer, \
+ None, resultFolderPath, stubPort, devmgr, skip_count, \
+ skip_tc, make_ne_package=make_ne_package, pre_test=pre_test, post_test=post_test)
+ elif intention_type == IntentionType.AutoPlan:
+ name = wrapper.get_plan_name()
+ autoFile = wrapper.get_autoplanfile()
+ plans = _parsAutoPlan(autoFile, name, executeType, tizenVer, \
+ resultFolderPath, stubPort, skip_package, skip_count, \
+ skip_tc, devmgr, make_ne_package=make_ne_package, pre_test=pre_test, post_test=post_test)
+ elif intention_type == IntentionType.TestProfile:
+ profile_suites = wrapper.get_profile_suites()
+ if not profile_suites:
+ return None
+ profile = wrapper.get_profile()
+ plans = _parsTestProfile(profile_suites, deviceId, executeType, \
+ tizenVer, profile, resultFolderPath, stubPort, \
+ skip_package, skip_count, skip_tc, devmgr, distribute_count, \
+ make_ne_package=make_ne_package, pre_test=pre_test, post_test=post_test)
+
+ return plans
--- /dev/null
+import logging
+import os
+import shutil
+
+BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
+
+RESET_SEQ = "\033[0m "
+COLOR_SEQ = "\033[%dm "
+BOLD_SEQ = "\033[1m "
+
+LEVELS = {"CRITICAL": 50,
+ "ERROR": 40,
+ "WARNING": 30,
+ "INFO": 20,
+ "DEBUG": 10,
+ "NOTSET": 0
+ }
+
+COLORS = {"CRITICAL": YELLOW,
+ "ERROR": RED,
+ "WARNING": YELLOW,
+ "INFO": WHITE,
+ "DEBUG": CYAN,
+ "NOTSET": WHITE
+ }
+
+
+def formatter_message(message, use_color=True):
+ if use_color:
+ message = message.replace("$RESET", RESET_SEQ)\
+ .replace("$BOLD", BOLD_SEQ)
+ else:
+ message = message.replace("$RESET", "").replace("$BOLD", "")
+
+ return message
+
+
+class ColoredFormatter(logging.Formatter):
+
+ def __init__(self, msg, datefmt, use_color=True):
+ logging.Formatter.__init__(self, msg, datefmt)
+ self.use_color = use_color
+
+ def format(self, record):
+ levelname = record.levelname
+ record_msg = record.msg
+ if self.use_color and levelname in COLORS:
+ if levelname == "ERROR":
+ colorsq = "\033[1;%dm "
+ else:
+ colorsq = COLOR_SEQ
+ colored_msg = colorsq % (30 + COLORS[levelname]) \
+ + record_msg + RESET_SEQ
+ record.msg = colored_msg
+
+ return logging.Formatter.format(self, record)
+
+class MultiHandler(logging.Handler):
+
+ def __init__(self, dirname):
+ super(MultiHandler, self).__init__()
+ self.files = {}
+ self.dirname = dirname
+
+ def flush(self):
+ self.acquire()
+ try:
+ for fp in self.files.values():
+ fp.flush()
+ finally:
+ self.release()
+
+ def _get_or_open(self, key):
+ self.acquire()
+ try:
+ if key in self.files:
+ return self.files[key]
+ else:
+ file_path = os.path.join(self.dirname, "%s.log" % key)
+ if os.path.exists(file_path):
+ os.remove(file_path)
+ fp = open(file_path, "a")
+ self.files[key] = fp
+ return fp
+ finally:
+ self.release()
+
+ def deformat(self, msg):
+ import re
+ ansi_escape = re.compile(r'\x1b[^m]*m')
+
+ return ansi_escape.sub('', msg)
+
+ def emit(self, record):
+ try:
+ fp = self._get_or_open(record.processName)
+ msg = self.format(record)
+ #fp.write('%s\n' % self.deformat(msg).encode("utf-8"))
+ fp.write("%s\n" % str(msg))
+ except (KeyboardInterrupt, SystemExit):
+ raise
+ except UnicodeDecodeError:
+ pass
+ except:
+ self.handleError(record)
+
+
+class LogManager:
+
+ def __init__(self, logname="mTCT", log_format=\
+ '%(asctime)15s %(processName)18s #%(levelname).3s %(module) 18s:%(lineno)-4d %(message)s', \
+ dirname="/opt/tools/shell/tmp/logs"):
+ self._remove_logdir(dirname)
+ colorformatter1 = ColoredFormatter(formatter_message(log_format), \
+ "%Y-%m-%d_%H:%M:%S", False)
+
+ stderr_handler = logging.StreamHandler()
+ stderr_handler.setFormatter(colorformatter1)
+ logging.getLogger().addHandler(stderr_handler)
+
+ infoHandler = logging.FileHandler(dirname + "/info.log")
+ infoHandler.setLevel(logging.INFO)
+ infoHandler.setFormatter(colorformatter1)
+
+ debugHandler = logging.FileHandler(dirname + "/debug.log")
+ debugHandler.setLevel(logging.DEBUG)
+ debugHandler.setFormatter(colorformatter1)
+
+ errorHandler = logging.FileHandler(dirname + "/error.log")
+ errorHandler.setLevel(logging.ERROR)
+ errorHandler.setFormatter(colorformatter1)
+
+ warnHandler = logging.FileHandler(dirname + "/warning.log")
+ warnHandler.setLevel(logging.WARNING)
+ warnHandler.setFormatter(colorformatter1)
+
+ criticalHandler = logging.FileHandler(dirname + "/critical.log")
+ criticalHandler.setLevel(logging.CRITICAL)
+ criticalHandler.setFormatter(colorformatter1)
+
+ multi_handler = MultiHandler(dirname)
+ multi_handler.setFormatter(colorformatter1)
+ logging.getLogger().addHandler(multi_handler)
+
+ _logger = logging.getLogger(logname)
+ _logger.addHandler(infoHandler)
+ _logger.addHandler(debugHandler)
+ _logger.addHandler(errorHandler)
+ _logger.addHandler(warnHandler)
+ _logger.addHandler(criticalHandler)
+
+ _logger.setLevel('INFO')
+ self.logger = _logger
+
+ def _get_logger(self):
+ return self.logger
+
+ def _remove_logdir(self, dirname):
+ if os.path.exists(dirname):
+ shutil.rmtree(dirname)
+ if not os.path.exists(dirname):
+ os.makedirs(dirname, mode=0o777)
+
+ if not os.access(dirname, os.W_OK):
+ raise Exception("Directory %s not writeable" % dirname)
+
+
+LOGGER = LogManager()._get_logger()
--- /dev/null
+#!/usr/bin/python
+
+import time
+
+from .sdbmanager import SdbManager
+from .logmanager import LOGGER
+from multiprocessing import Process
+
+
+class NetstatMonitor(Process):
+
+ netstat_cmd = 'netstat -tan | grep %s'
+ deviceId = ""
+
+ def __init__(self, deviceId, devmgr):
+ Process.__init__(self)
+ self.daemon = True
+ self.name = "Netstat_%s" % deviceId.split('.')[-1].split(':')[0]
+ self.deviceId = deviceId
+ self.__suspend = True
+ self.devmgr = devmgr
+ self.recovery_lock = None
+ self.isFinish = False
+
+ def run(self):
+ LOGGER.debug("Starting NetstatLogger")
+ state_changed = False
+ wasConnected = True
+ while True:
+ if self.isFinish:
+ break
+ time.sleep(10)
+ exit_code, stdout, stderr = SdbManager.sdbCommand(\
+ self.netstat_cmd % self.deviceId, 3)
+ outLog = stdout.read()
+ netValues = self.parsingLogData(outLog)
+ isConnected = self.checkConnectState(netValues)
+ state_changed = isConnected is not wasConnected
+
+ if state_changed:
+ if isConnected:
+ LOGGER.info("Device connected")
+ self.device_recovered()
+ else:
+ LOGGER.error("Device disconnected")
+ self.reLoadDeviceList()
+ wasConnected = isConnected
+
+ def kill_netMonitor(self):
+ self.isFinish = True
+
+ def getThreadStatus(self):
+ return self.__suspend
+
+ def restartThread(self):
+ time.sleep(10)
+ LOGGER.info("Starting %s device monitor" % self.deviceId)
+ self.__suspend = False
+
+ def reLoadDeviceList(self):
+ LOGGER.debug('Netstat: reLoadDeviceList')
+ if not self.devmgr.loadDeviceList():
+ LOGGER.error('0 device is connected')
+
+ def parsingLogData(self, outLog):
+ outLog = outLog.rstrip()
+ resultLog = outLog.split(' ')
+ parsLog = []
+ for log in resultLog:
+ if len(log) != 0:
+ parsLog.append(log)
+
+ return parsLog
+
+ def setup_recovery(self, lock):
+ self.recovery_lock = lock
+
+ def device_recovered(self):
+ try:
+ self.recovery_lock.release()
+ except:
+ pass
+
+ def checkConnectState(self, netValues):
+ for val in netValues:
+ if val and val.find('ESTABLISHED') != -1:
+ return True
+
+ return False
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Tang, Shaofeng <shaofeng.tang@intel.com>
+
+import sys
+import os
+import re
+import platform
+import glob
+from optparse import *
+from constants import Constants
+from logmanager import LOGGER
+
+
+#show all available suites
+def _show_available_suites(option, opt_str, value, parser):
+ print "Test Suites:...\n"
+ os.chdir("/opt/tct/")
+ for t_version in glob.glob("tizen*"):
+ print "Tizen Version : %s" % t_version
+ package_dir = os.path.join(os.path.abspath(t_version), 'packages')
+ if not os.path.isdir(package_dir):
+ continue
+ os.chdir(package_dir)
+ for profile in glob.glob("*"):
+ if profile == 'pkg_infos':
+ continue
+ print " profile : %s" % profile
+ os.chdir(os.path.abspath(profile))
+ for files in glob.glob("*.zip"):
+ print " " + files[:-4]
+ os.chdir('../')
+ os.chdir('../../')
+ sys.exit(1)
+
+
+def _print_planfolder(option, opt_str, value, parser):
+ print "Plan folder: %s" % Constants.TCT_PLAN_FOLDER
+ os.system("tree %s" % Constants.TCT_PLAN_FOLDER)
+ sys.exit(1)
+
+
+def varnarg(option, opt_str, value, parser):
+ """ parser srg"""
+ value = []
+ for arg in parser.rargs:
+ if re.search('^--.+', arg) or re.search('^-[\D]', arg):
+ break
+ value.append(arg)
+
+ del parser.rargs[:len(value)]
+ setattr(parser.values, option.dest, value)
+
+
+class PlanGeneratorOptions:
+
+ def __init__(self):
+ self._j = os.path.join
+ self._e = os.path.exists
+ self._d = os.path.dirname
+ self._b = os.path.basename
+ self._abspath = os.path.abspath
+ self.testkit_dir = "/opt/testkit/lite"
+ self.LOG_DIR = self.testkit_dir
+ self.PID_FILE = self._j(self.LOG_DIR, "pid.log")
+ if not platform.system() == "Linux":
+ self.testkit_dir = self._d(self._abspath(__file__))
+ sys.path += [self._j(self.testkit_dir)]
+ self.testkit_dir = self._j(self.testkit_dir, "results")
+ #self.clean_context()
+ self.options = None
+ self.options = None
+ self.running_mode = None
+ self.USAGE = "tct-plan-generator [options] --output <somewhere/testplan.xml>\n\
+examples: \n\
+ tct-plan-generator -p mobile -o <somewhere>/testplan.xml\n\
+ tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder\n\
+ tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder --match '<regex>'\n\
+\n\
+ generate a test plan to include all suites in the local repository: \n\
+ tct-plan-generator -p mobile -o <somewhere>/testplan.xml\n\
+ generate a test plan to include all suites in the special repository: \n\
+ tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder\n\
+ generate a test plan to include the suites in the special repository which name is matched with 'webapi*.rpm': \n\
+ tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder --match 'webapi*.rpm'\n\
+ generate a test plan to include the suites in the special repository which name is matched with 'webapi*.rpm', and exclude the file 'webapi-tizen-push-tests-2.1.6-1.1.armv7l.rpm': \n\
+ tct-plan-generator -p mobile -o <somewhere>/testplan.xml -r <somewhere>/repository_folder --match 'webapi*.rpm' --unmatch push\n\
+\n\
+Note: \n\
+ 1) run command 'tct-plan-generator', it might not be able to locate related module, run command 'export PYTHONPATH=/usr/lib/python2.7/site-packages' to resolve this issue"
+
+ def print_usage(self):
+ print self.USAGE
+
+ def parse_options(self, argv):
+ option_list = [
+ make_option("-o", "--output", dest="testplan_file", \
+ action="callback", callback=varnarg, \
+ help="Specify the generating testplan in a XML file."),
+ make_option("-e", "--execute", dest="execute_type", \
+ action="callback", callback=varnarg, \
+ help="Specify the execute_type of testplan in a XML file."),
+ make_option("-r", "--repository", dest="repository_folder", \
+ action="callback", callback=varnarg, \
+ help="Specify the path of local repository."),
+ make_option("--tizen-version", dest="tizenversion", \
+ action="callback", callback=varnarg, \
+ help="Specify the name of tizen-version you want to run test. The tizen-version is defined in the local repository. and its path is '/opt/tct/'"),
+ make_option("-m", "--match", dest="match_regex", \
+ action="callback", callback=varnarg, \
+ help="The regex for matching filename."),
+ make_option("-p", "--profile", dest="test_profile", \
+ action="callback", callback=varnarg, \
+ help="The profile of the test plan."),
+ make_option("-u", "--unmatch", dest="unmatch_regex", \
+ action="callback", callback=varnarg, \
+ help="The regex for unmatching filename."),
+ make_option("--plan-list", dest="show_plan_folder", \
+ action="callback", callback=_print_planfolder, \
+ help="List all existed plan in the Plan folder. The plan folder is defined in the configure '/opt/tct/shell/CONF'"),
+ make_option("-a", "--all-suites", dest="show_suites", \
+ action="callback", callback=_show_available_suites, \
+ help="Show all available test-suites"),
+ ]
+ # detect non-params
+ if len(argv) == 1:
+ argv.append("-h")
+ PARSERS = OptionParser(option_list=option_list, usage=self.USAGE)
+ (self.options, args) = PARSERS.parse_args()
+
+ if self.options.tizenversion:
+ self.check_tizen_version()
+ else:
+ LOGGER.error("The default tizen version could not be set.")
+ sys.exit("No tizen version specified")
+
+ if not self.options.match_regex:
+ LOGGER.error("The default match_regex could not be set.")
+ sys.exit("No match regex specified. Use -m or --match option")
+
+ def check_tizen_version(self):
+ tizenversion = self.options.tizenversion[0]
+ VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d|^tizen_csharp_\d.\d"
+ pa = re.compile(VER_PATTERN, re.I)
+ ma = pa.match(tizenversion)
+ if ma is None:
+ LOGGER.error("A required \"/opt/tct/" + tizenversion + \
+ " could not be found.")
+ sys.exit("Invalid Tizen version. Tizen version must be in the form of tizen_(web|native|csharp)_#.#")
+ return False
+ return True
+
+ def get_repository_folder(self):
+ if (self.options.repository_folder is not None) and \
+ (self.options.repository_folder[0] is not None):
+ return self.options.repository_folder[0]
+ else:
+ return Constants.SUITES_REPOSITORY % self.get_tizenV()
+
+ def get_match_regex(self):
+ if (self.options.match_regex is not None) and \
+ (self.options.match_regex[0] is not None):
+ return self.options.match_regex[0]
+ else:
+ return Constants.DEFAULT_MATCH_REGEX
+
+ def get_plan_name(self):
+ if (self.options.testplan_file is not None) and \
+ (self.options.testplan_file[0] is not None):
+ name, ext = os.path.splitext(self.options.testplan_file[0])
+ return name.split("/")[-1]
+ else:
+ return Constants.DEFAULT_PLAN_NAME
+
+ def get_profile_name(self):
+ if (self.options.test_profile is not None) and \
+ (self.options.test_profile[0] is not None):
+ return self.options.test_profile[0]
+ else:
+ return Constants.DEFAULT_PROFILE_NAME
+
+ def get_execute_type(self):
+ if (self.options.execute_type is not None) and \
+ (self.options.execute_type[0] is not None):
+ return self.options.execute_type[0]
+ else:
+ return Constants.DEFAULT_EXECUTE_TYPE
+
+ def get_tizenV(self):
+ if (self.options.tizenversion is not None) and \
+ (self.options.tizenversion[0] is not None):
+ return self.options.tizenversion[0]
+ else:
+ print "Error: Please specify Tizen version with [--tizen-version] option"
+ sys.exit(1)
+
+ def get_output(self):
+ if (self.options.testplan_file is not None) and \
+ (self.options.testplan_file[0] is not None):
+ d = os.path.abspath(os.path.dirname(self.options.testplan_file[0]))
+ if not os.path.exists(d):
+ os.makedirs(d)
+ return os.path.abspath(self.options.testplan_file[0])
+ else:
+ return Constants.TCT_PLAN_FOLDER + "generated_plan.xml"
+
+ def get_unmatch_regex(self):
+ if (self.options.unmatch_regex is not None) and \
+ (self.options.unmatch_regex[0] is not None):
+ return self.options.unmatch_regex[0]
+ else:
+ return Constants.DEFAULT_UNMATCH_REGEX
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+#
+# Authors:
+# Tang, Shaofeng <shaofeng.tang@intel.com>
+
+from constants import Constants
+from xml.etree import ElementTree
+from logmanager import LOGGER
+import xml.etree.ElementTree as etree
+import os
+import os.path
+import sys
+import glob
+import re
+
+
+class SuitePackage:
+ def __init__(self, profile, file_name, launcher, category, auto_count, \
+ manual_count):
+ self.file = file_name
+ self.profile = profile
+ m = re.split(Constants.REGEX_FOR_SPLIT_PKG_NAME, file_name)
+ self.name = m[0]
+ self.auto_count = auto_count
+ self.manual_count = manual_count
+ self.total_count = auto_count + manual_count
+ self.launcher = launcher
+ self.category = category
+
+ def to_xml(self):
+ suite = ElementTree.Element('suite')
+ suite.set('name', self.name)
+ if self.launcher:
+ suite.set('launcher', self.launcher)
+
+ if self.category:
+ suite.set('category', self.category)
+
+ auto = ElementTree.Element('auto_tcn')
+ auto.text = str(self.auto_count)
+ suite.append(auto)
+ manual = ElementTree.Element('manual_tcn')
+ manual.text = str(self.manual_count)
+ suite.append(manual)
+ total = ElementTree.Element('total_tcn')
+ total.text = str(self.total_count)
+ suite.append(total)
+ rpm_name = ElementTree.Element('pkg_name')
+ rpm_name.text = self.profile + '/' + self.file
+ suite.append(rpm_name)
+
+ return suite
+
+
+class PlanRunner:
+
+ def __init__(self):
+ self.suites = {}
+ self.suite_paths = []
+ self.plan_name = Constants.DEFAULT_PLAN_NAME
+ self.profile = Constants.DEFAULT_PROFILE_NAME
+ self.execute_type = Constants.DEFAULT_EXECUTE_TYPE
+
+ def load_local_repo(self, path, tizenV, match, unmatch, plan_name, \
+ profile, execute_type):
+ try:
+ self.plan_name = plan_name
+ self.profile = profile
+ self.execute_type = execute_type
+ raw_paths = []
+ repos = ['common', profile]
+ for tp in repos:
+ repo = '/'.join([path, tp])
+ if not os.path.isdir(repo):
+ continue
+
+ os.chdir(repo)
+ for files in glob.glob("*" + match + "*"):
+ print "Matched File name: %s" % str(os.path.abspath(files))
+ if (unmatch is not None) and (re.search(unmatch, \
+ str(files))):
+ print "File %s is skipped with unmatch regex %s" \
+ % (str(files), unmatch)
+ else:
+ raw_paths.append(os.path.join(repo, str(files)))
+
+ if len(raw_paths) < 1:
+ sys.exit("Match regex: [%s] No matching suite package found." \
+ % match)
+
+ self.suite_paths = self._chooseProfile(raw_paths)
+ for files in self.suite_paths:
+ profile = os.path.basename(os.path.dirname(files))
+ auto, manual, launcher, category = \
+ self.get_count_launcher_category(\
+ os.path.basename(files), files)
+ suite = SuitePackage(profile, os.path.basename(files), \
+ launcher, category, auto, manual)
+ self.suites[suite.name] = suite
+ Constants.clean_unzip_file()
+ except Exception, e:
+ print "[ Error happen when reading the local repository," + \
+ " error: %s ]\n" % e
+
+ def _chooseProfile(self, path_suites):
+ suite_profiles = {}
+ filtered_suites = []
+ suite_repo = os.path.dirname(os.path.dirname(path_suites[0]))
+ for suite_path in path_suites:
+ suite_zipname = os.path.basename(suite_path)
+ sprofile = os.path.basename(os.path.dirname(suite_path))
+ if not suite_zipname in suite_profiles:
+ suite_profiles[suite_zipname] = []
+
+ suite_profiles[suite_zipname].append(sprofile)
+
+ for suiteName, suiteProfile in suite_profiles.items():
+ suite_name = "-".join(suiteName[:-4].split("-")[:-1])
+ if len(suiteProfile) == 1:
+ suite_profiles[suiteName] = suiteProfile[0]
+ continue
+
+ print "\nMultiple profiles for [%s] \
+ :\n----------------------------------------------" \
+ % suite_name
+
+ for profile_i in suiteProfile:
+ print " - %s" % profile_i
+
+ suite_profile = None
+ while not suite_profile in suiteProfile:
+ suite_profile = raw_input("\nChoose profile: ")
+
+ suite_profiles[suiteName] = suite_profile
+
+ check_profile = None
+ multiProfiles = False
+ for suiteName, suiteProfile in suite_profiles.items():
+ if suiteProfile != 'common':
+ if check_profile is not None and check_profile != suiteProfile:
+ multiProfiles = True
+
+ if check_profile is None:
+ check_profile = suiteProfile
+
+ filtered_suites.append(\
+ os.path.join(suite_repo, suiteProfile, suiteName))
+
+ if multiProfiles:
+ LOGGER.warning("WARNING: \
+ Multiple suites run with different profiles")
+
+ return filtered_suites
+
+ def get_count_launcher_category(self, filesname, filepath):
+ Constants.unzip_package(filepath)
+ m = re.split(Constants.REGEX_FOR_SPLIT_PKG_NAME, filesname)
+ name = m[0]
+ test_file = os.path.expanduser("~") + "/" + \
+ Constants.DEFAULT_PLAN_FILE + "/opt/" + name + "/tests.xml"
+ if not os.path.exists(test_file):
+ print("Can't find the test file : [%s]" % test_file)
+ return 0, 0, Constants.WRT_LAUNCHER_CMD, None
+
+ return self.__read_test_xml(test_file)
+
+ def __read_test_xml(self, test_file):
+ autocnt = manualcnt = 0
+ test_xml_temp = etree.parse(test_file)
+
+ for test_xml_temp_suite in test_xml_temp.getiterator('suite'):
+ suite_launcher = test_xml_temp_suite.get('launcher')
+ suite_category = test_xml_temp_suite.get('category')
+ autocnt = manualcnt = 0
+ for tset in test_xml_temp_suite.getiterator('set'):
+ set_autocnt, set_manualcnt = self.__get_set_casecnt(tset)
+ autocnt += set_autocnt
+ manualcnt += set_manualcnt
+
+ return autocnt, manualcnt, suite_launcher, suite_category
+
+ def __get_set_casecnt(self, tset):
+ set_autocnt = set_manualcnt = 0
+ for tcase in tset.getiterator('testcase'):
+ exetype = tcase.get('execution_type')
+ if exetype == "auto":
+ set_autocnt += 1
+ elif exetype == "manual":
+ set_manualcnt += 1
+
+ return set_autocnt, set_manualcnt
+
+ def to_xml(self, xml_name):
+ print "generating plan to %s" % xml_name
+ root = ElementTree.Element('ns3:testplan')
+ root.set('name', self.plan_name)
+ root.set('profile', self.profile)
+ root.set('xmlns', '')
+ root.set('xmlns:ns3', 'http://www.example.org/plan/')
+ element = ElementTree.Element('execute_type')
+ element.text = self.execute_type
+ root.append(element)
+ for suite_name in self.suites:
+ suite = self.suites[suite_name]
+ root.append(suite.to_xml())
+
+ Constants.indent(root)
+ tree = ElementTree.ElementTree()
+ tree._setroot(root)
+ tree.write(xml_name, encoding="utf-8")
--- /dev/null
+#!/usr/bin/python
+
+import os
+import threading
+from xml.etree import ElementTree
+
+from .logmanager import LOGGER
+from .result_summary import ResultSummary
+from .constants import Constants
+from .shellplanner import MultiRunnPlan
+
+
+class ResultManager:
+
+ #MultiRunnPlan instance
+ mrp = None
+
+ def __init__(self):
+ self.mrp = MultiRunnPlan.getInstance()
+ self.mrp.attach(self)
+ self.lock = threading.Lock()
+ self.summary_lock = threading.Lock()
+ self.plans = []
+
+ def importResult(self):
+ plan = None
+ merge_groups = {}
+ #plans = self.mrp.getPlanDict().values()[:]
+ plans = list(self.mrp.getPlanDict().values())[:]
+
+ for plan in plans:
+ tizenVer_buildId = "%s_%s" \
+ % (plan.getTizenVersion(), plan.getBuildId())
+
+ #if merge_groups.has_key(tizenVer_buildId):
+ if tizenVer_buildId in merge_groups:
+ continue
+
+ merge_group = []
+ for plan in plans:
+ if "%s_%s" % (plan.getTizenVersion(), plan.getBuildId()) \
+ == tizenVer_buildId:
+ merge_group.append(plan)
+ merge_groups[tizenVer_buildId] = merge_group
+
+ #folder path grouping
+ #return plans that have finished.
+ return merge_groups
+
+ def waitForFinishedPlans(self):
+ #self.plans = self.mrp.getPlanDict().values()[:]
+ p_list = list(self.mrp.getPlanDict().values())
+ self.plans = p_list[:]
+ while bool(self.mrp.getPlanDict()):
+ LOGGER.debug("waiting for lock")
+ self.lock.acquire()
+ LOGGER.debug("Lock acquired")
+ self.checkFinished()
+ LOGGER.debug("All plans finished")
+ self.print_result_summaries()
+
+ def update(self):
+ LOGGER.debug('waiting for summary lock')
+ self.summary_lock.acquire()
+ LOGGER.debug('summary lock acquired')
+ self.lock.release()
+ LOGGER.debug("lock released")
+
+ def checkFinished(self):
+ LOGGER.debug("Waiting for a plan to finish --> waiting for a lock")
+ self.lock.acquire()
+ LOGGER.debug("Notified: Plan finished. \
+ Check for auto summary merge. --> lock acquired")
+ finished_groups = []
+ merge_groups = self.importResult()
+ for tizenVer_buildId in merge_groups:
+ finished_groups.append(tizenVer_buildId)
+ for plan in merge_groups[tizenVer_buildId]:
+ if not plan.isFinished():
+ finished_groups.remove(tizenVer_buildId)
+ break
+ for group in finished_groups:
+ self.genSummary(merge_groups[group])
+ self.mrp.removePlans(merge_groups[group])
+ self.lock.release()
+ LOGGER.debug("lock released")
+ self.summary_lock.release()
+ LOGGER.debug("summary lock released")
+
+ def genSummary(self, plans):
+ summary_file = None
+ #browser = 'firefox'
+ if Constants.RERUNING_MODE and Constants.SCENARIO_MODE:
+ summary = ResultSummary(plans=plans)
+ summary_file = summary.rerun_genSummaryForScen()
+ summary.updateScenStatus()
+ elif len(plans) > 1:
+ LOGGER.debug("generate Summary for Scenario")
+ summary = ResultSummary(plans=plans)
+ summary.makeMergedFolder()
+ summary_file = summary.genSummaryForScen()
+ summary.genScenStatus()
+ elif len(plans) == 1:
+ summary_file = os.path.join(\
+ plans[0].getResultFolderPath(), 'summary.xml')
+ if summary_file is not None:
+ if not os.path.isfile(summary_file):
+ LOGGER.warning("Summary file [%s] does not exist" % summary_file)
+ '''
+ else:
+ try:
+ url_path = urlparse.urljoin('file:', \
+ urllib.pathname2url(summary_file))
+ webbrowser.get(browser).open(url_path, new=2)
+ except Exception, e:
+ LOGGER.error("[ Error: opening summary file with \
+ %s failed, error: %s ]\n" %(browser, e))
+ pass
+ '''
+
+ def print_result_summaries(self):
+ resultFolderPaths = []
+ tizenV = None
+ if self.plans:
+ scen_resultFolderPath = None
+ for plan in self.plans:
+ if tizenV is None:
+ tizenV = plan.getTizenVersion()
+
+ if plan.scen_resultFolderPath is None or \
+ not os.path.isdir(plan.scen_resultFolderPath):
+ resultFolderPath = plan.getResultFolderPath()
+ summary_xml = os.path.join(resultFolderPath, 'summary.xml')
+ self.print_result_summary(summary_xml)
+ resultFolderPaths.append(\
+ (plan.getPlanName(), resultFolderPath))
+ elif plan.scen_resultFolderPath != scen_resultFolderPath:
+ resultFolderPath = plan.getScenResultFolderPath()
+ scen_resultFolderPath = resultFolderPath
+ summary_xml = os.path.join(resultFolderPath, 'summary.xml')
+ self.print_result_summary(summary_xml)
+ resultFolderPaths.append(\
+ (plan.getScenName(), resultFolderPath))
+
+ distribute = " --distribute" if Constants.isDistMode() else ""
+ rerun_command = "tct-shell --tizen-version {0} --rerun-fail %s {1}".\
+ format(tizenV, distribute)
+ for result in resultFolderPaths:
+ LOGGER.info("[%s] Rerun command: %s" \
+ % (result[0], rerun_command % result[1]))
+
+ def print_result_summary(self, result_file):
+ if not os.path.isfile(result_file):
+ LOGGER.warning("Result_file [%s] does not exist" % result_file)
+ return
+ tree = ElementTree.parse(result_file)
+ root = tree.getroot()
+ suites = root.findall('suite')
+ total_cases = 0
+ pass_cases = 0
+ fail_cases = 0
+ block_cases = 0
+ na_cases = 0
+ for total_i in root.findall('suite/total_case'):
+ total_cases += int(total_i.text)
+ for pass_i in root.findall('suite/pass_case'):
+ pass_cases += int(pass_i.text)
+ for fail_i in root.findall('suite/fail_case'):
+ fail_cases += int(fail_i.text)
+ for block_i in root.findall('suite/block_case'):
+ block_cases += int(block_i.text)
+ for na_i in root.findall('suite/na_case'):
+ na_cases += int(na_i.text)
+
+ LOGGER.info("[Result: execute %d suites]" % len(suites))
+ LOGGER.info("[ total case number: %d ]" % total_cases)
+ if total_cases > 0:
+ LOGGER.info("[ Pass Rate: %.2f" \
+ % (float(pass_cases) * 100 / total_cases) + "% ]")
+ else:
+ LOGGER.info("[ Pass Rate: 0% ]")
+ LOGGER.info("[ PASS case number: %d ]" % pass_cases)
+ LOGGER.info("[ FAIL case number: %d ]" % fail_cases)
+ LOGGER.info("[ BLOCK case number: %d ]" % block_cases)
+ LOGGER.info("[ N/A case number: %d ]" % na_cases)
+ for suite in suites:
+ LOGGER.info(" Suite: %s" % suite.get("name"))
+ suite_total_cases = suite.find('total_case').text
+ suite_pass_cases = suite.find('pass_case').text
+ suite_fail_cases = suite.find('fail_case').text
+ suite_block_cases = suite.find('block_case').text
+ suite_na_cases = suite.find('na_case').text
+ suite_pass_rate = suite.find('pass_rate').text
+ LOGGER.info(" |---total case number: %s " % suite_total_cases)
+ LOGGER.info(" | |---Pass rate: %s " \
+ % suite_pass_rate + "%")
+ LOGGER.info(" | |---PASS case number: %s " \
+ % suite_pass_cases)
+ LOGGER.info(" | |---FAIL case number: %s " \
+ % suite_fail_cases)
+ LOGGER.info(" | |---BLOCK case number: %s " \
+ % suite_block_cases)
+ LOGGER.info(" | |---N/A case number: %s " \
+ % suite_na_cases)
--- /dev/null
+#!/usr/bin/python
+
+from xml.etree import ElementTree
+import os
+import glob
+import shutil
+import errno
+import copy
+from .constants import Constants
+from .logmanager import LOGGER
+
+DEBUG = True
+
+
+def ele_set(element, attrib, content):
+ if content:
+ element.set(attrib, content)
+
+
+def ele_find(ele, child):
+ if ele.find(child) is not None:
+ return ele.find(child)
+ else:
+ return ElementTree.Element(child)
+
+
+def copyfiledir(src, dst):
+ try:
+ shutil.copytree(src, dst)
+ return dst
+ except OSError as exc:
+ if exc.errno == errno.ENOTDIR:
+ shutil.copy(src, dst)
+ return dst
+ else:
+ raise
+
+
+class ResultSummary:
+ env = None
+ summary = None
+ capability = None
+ suites = []
+ planid = None
+ unpass = None
+
+ def __init__(self, plans=None, rerun_suiteFiles=None):
+ self.am_suiteFiles = []
+ self.result_suiteFiles = []
+ self.suiteFiles = {}
+ self.rerun_suiteFiles = rerun_suiteFiles
+ self.am_suites = []
+ self.suites = []
+ self.profile = None
+ self.deviceid = None
+ self.planid = None
+ self.plans = plans
+ self.planDict = {}
+ if plans:
+ headplan = plans[0]
+ self.head_profile = headplan.getProfile()
+ self.head_deviceid = headplan.getDeviceId()
+ self.scenid = headplan.getScenName()
+ self.scen_resultFolder = headplan.getScenResultFolderPath()
+ if len(plans) > 1:
+ for plan in plans[1:]:
+ plan.setScenResultFolderPath(self.scen_resultFolder)
+
+ self.env = self.ResEnvironment()
+ self.summary = self.ResSummary()
+ self.capability = self.ResCapabilities()
+
+ def genSummary(self, _resultFolder=None):
+ if Constants.RERUNING_MODE:
+ self.suiteFiles = self._rerun_findResultSuites_plan()
+ else:
+ self.suiteFiles = self._findResultSuites(_resultFolder)
+
+ for planFolder, plan in self.suiteFiles.items():
+ suiteResults_plan = []
+ for suite_am in plan.keys():
+ suiteResults_plan.append(suite_am + ".xml")
+
+ currPlan = self.planDict[planFolder]
+ self.profile = currPlan.getProfile()
+ self.deviceid = currPlan.getDeviceId()
+ self.suites = []
+ self.env = self.ResEnvironment()
+ self.summary = self.ResSummary()
+ self.capability = self.ResCapabilities()
+ self.planid = currPlan.getPlanName()
+ self.parse(suiteResults_plan)
+ self.summary_to_xml(os.path.join(planFolder, "summary.xml"))
+ if _resultFolder is None:
+ self.genPlanStatus(currPlan)
+ return
+
+ def genPlanStatus(self, plan):
+ root = ElementTree.Element('ns3:plan_status')
+ ele_set(root, 'xmlns:ns3', 'http://www.example.org/plan_status/')
+ ele_set(root, 'name', plan.getPlanName())
+ ele_set(root, 'profile', plan.getProfile())
+ ele_set(root, 'executeType', plan.getExecuteType().getCurrType())
+ ele_set(root, 'tizenVersion', plan.getTizenVersion())
+ device = ElementTree.Element('device')
+ ele_set(device, 'device_id', plan.getDeviceId())
+ ele_set(device, 'build_id', plan.getBuildId())
+ auto_tasks = ElementTree.Element('auto_tasks')
+ manual_tasks = ElementTree.Element('manual_tasks')
+ if plan.getExecuteType().getCurrType() == "Auto":
+ for suite in plan.getSuites():
+ executed = ElementTree.Element('executed')
+ executed.text = suite.getSuiteName()
+ auto_tasks.append(executed)
+ elif plan.getExecuteType().getCurrType() == "Manual":
+ for suite in plan.getSuites():
+ executed = ElementTree.Element('executed')
+ executed.text = suite.getSuiteName()
+ manual_tasks.append(executed)
+ elif plan.getExecuteType().getCurrType() == "All":
+ for suite in plan.getSuites():
+ executed = ElementTree.Element('executed')
+ executed.text = suite.getSuiteName()
+ auto_tasks.append(executed)
+ manual_tasks.append(executed)
+
+ root.append(device)
+ root.append(auto_tasks)
+ root.append(manual_tasks)
+
+ Constants.indent(root)
+ tree = ElementTree.ElementTree()
+ tree._setroot(root)
+ tree.write(os.path.join(plan.getResultFolderPath(), \
+ "plan_status.xml"), encoding="UTF-8")
+
+ def genScenStatus(self):
+ root = ElementTree.Element('scen_status')
+ ele_set(root, 'scenario_name', self.scenid)
+ for plan in self.plans:
+ plan_root = ElementTree.Element('plan')
+ ele_set(plan_root, 'name', plan.getPlanName())
+ ele_set(plan_root, 'result_folder', plan.getResultFolderPath())
+ ele_set(plan_root, 'has_unpass_tc', str(plan.getUnpass()))
+ device = ElementTree.Element('device')
+ ele_set(device, 'device_id', plan.getDeviceId())
+ ele_set(device, 'build_id', plan.getBuildId())
+ plan_root.append(device)
+ root.append(plan_root)
+ Constants.indent(root)
+ tree = ElementTree.ElementTree()
+ tree._setroot(root)
+ tree.write(os.path.join(self.scen_resultFolder, \
+ "scenario_status.xml"), encoding="UTF-8")
+ LOGGER.info("SENARIO_STATUS TO XML: writing into %s" \
+ % os.path.join(self.scen_resultFolder, "scenario_status.xml"))
+
+ def updateScenStatus(self):
+ scenstat = os.path.join(self.scen_resultFolder, 'scenario_status.xml')
+ if not os.path.isfile(scenstat):
+ LOGGER.error("scenario_status.xml should be present in \
+ [%s]. Not Found" % self.scen_resultFolder)
+ raise
+ xml_tree = ElementTree.parse(scenstat)
+ root = xml_tree.getroot()
+ for plan in root.findall('plan'):
+ for rerun_plan in self.plans:
+ if plan.get('name') == rerun_plan.getPlanName():
+ ele_set(plan, 'has_unpass_tc', str(rerun_plan.getUnpass()))
+
+ tree = ElementTree.ElementTree()
+ tree._setroot(root)
+ tree.write(scenstat, encoding="UTF-8")
+ LOGGER.info("UPDATING SENARIO_STATUS TO XML: writing into %s" \
+ % scenstat)
+
+ def prepareRerun(self, result):
+ suiteFiles = {}
+ suitePkgs = {}
+ scen_resultFolderPath = None
+ if os.path.isdir(result):
+ if os.path.isfile(os.path.join(result, "plan_status.xml")):
+ suiteFiles = self.prepareRerun_Plan(result)
+ elif os.path.isfile(os.path.join(result, "scenario_status.xml")):
+ suiteFiles = self.prepareRerun_Scen(result)
+ Constants.setScenMode(True)
+ Constants.setDistMode(False)
+ scen_resultFolderPath = result
+ elif os.path.isfile(result):
+ suiteFiles = self.prepareRerun_Suite(result)
+ else:
+ LOGGER.warning("%s result does not exist" % result)
+ raise
+
+ for planFolder, plan in suiteFiles.items():
+ plan_status = os.path.join(planFolder, "plan_status.xml")
+ LOGGER.debug("plan folder path = %s" % planFolder)
+ if not os.path.isfile(plan_status):
+ LOGGER.warning("%s does not exist" % plan_status)
+ raise
+ xml_tree = ElementTree.parse(plan_status)
+ xml_root = xml_tree.getroot()
+ plan_name = xml_root.get('name')
+ executeType = xml_root.get('executeType')
+ profile = xml_root.get('profile')
+ if not profile:
+ LOGGER.warning("Couldn`t retrieve 'profile' attribute of plan_status.xml")
+ raise
+ tizenVersion = xml_root.get('tizenVersion')
+ device = ele_find(xml_root, 'device')
+ device_id = device.get('device_id')
+ build_id = device.get('build_id')
+ suite_pkgs = []
+ for suite in plan:
+ suiteName = os.path.basename(suite)
+ suite_pkg_name = None
+ profiles = [profile, "common"]
+ for prof in profiles:
+ suite_pkg_repo = os.path.join(Constants.SUITES_REPOSITORY \
+ % tizenVersion, prof)
+ if not os.path.isdir(suite_pkg_repo):
+ continue
+ os.chdir(suite_pkg_repo)
+ for suite_pkg in glob.glob("%s*.zip" % suiteName):
+ suite_pkg_name = os.path.abspath(suite_pkg)
+ if suite_pkg_name is not None:
+ suite_pkgs.append(suite_pkg_name)
+ break
+ if suite_pkg_name is None:
+ LOGGER.warning("[%s] suite does not exist." % (suiteName))
+ yesorno = None
+ while not (yesorno in ['y', 'n']):
+ yesorno = input(\
+ "Continue without this suite? [y/n]")
+ if yesorno == 'n':
+ LOGGER.warning("please check the default suite \
+ repository: %s[profile]/" \
+ % Constants.SUITES_REPOSITORY \
+ % "[tizen_version]")
+ raise
+ suitePkgs[planFolder] = [[plan_name, executeType, profile, \
+ tizenVersion, device_id, build_id, \
+ scen_resultFolderPath], suite_pkgs]
+ return suitePkgs
+
+ def prepareRerun_Suite(self, result):
+ suiteFiles = {}
+ planFolder = os.path.dirname(result)
+ suiteFiles[planFolder] = {}
+ suiteFiles[planFolder][result[:-4]] = result
+ return self.genRerunFile(suiteFiles)
+
+ def prepareRerun_Plan(self, result):
+ suiteFiles = {}
+ suiteFiles[result] = {}
+ os.chdir(result)
+ for suite in glob.glob("*.xml"):
+ if 'auto' in suite or 'manual' in suite or 'rerun' in suite \
+ or 'status.xml' in suite or suite == 'summary.xml':
+ continue
+ suiteFile = os.path.abspath(suite)
+ suiteFiles[result][suiteFile[:-4]] = suiteFile
+ return self.genRerunFile(suiteFiles)
+
+ def prepareRerun_Scen(self, result):
+ suiteFiles = {}
+ planResultFolders = []
+ scen_status = os.path.join(result, "scenario_status.xml")
+ xml_tree = ElementTree.parse(os.path.join(scen_status))
+ xml_root = xml_tree.getroot()
+ for xml_plan in xml_root.findall('plan'):
+ if xml_plan.get('has_unpass_tc') == "True":
+ planResultFolders.append(xml_plan.get('result_folder'))
+
+ for planResult in planResultFolders:
+ suiteFiles.update(self.prepareRerun_Plan(planResult))
+
+ return suiteFiles
+
+ def genRerunFile(self, rerun_suiteFiles):
+ if not bool(rerun_suiteFiles):
+ LOGGER.debug("No suite results exist...")
+ raise
+ filtered_suiteFiles = copy.deepcopy(rerun_suiteFiles)
+ self.env = self.ResEnvironment()
+ self.summary = self.ResSummary()
+ self.capability = self.ResCapabilities()
+ self.env.isNull = False
+ self.summary.isNull = False
+ self.capability.isNull = False
+ for planFolder, plan in rerun_suiteFiles.items():
+ for suite_am in plan.keys():
+ self.suites = []
+ result_file = suite_am + ".xml"
+ if os.path.isfile(result_file):
+ self.parse([result_file])
+ if not self.rerun_to_xml(suite_am + ".rerun.xml"):
+ del filtered_suiteFiles[planFolder][suite_am]
+ return filtered_suiteFiles
+
+ def checkResults(self):
+ self.suiteFiles = self._findResultSuites()
+ NotRunSuites = []
+ for planFolder, plan in self.suiteFiles.items():
+ currPlan = self.planDict[planFolder]
+ self.profile = currPlan.getProfile()
+ self.deviceid = currPlan.getDeviceId()
+ for suite_path, suite_am in plan.items():
+ if len(suite_am) < 1:
+ NotRunSuites.append(os.path.basename(suite_path))
+ LOGGER.error("No test results returned from lite: %s", \
+ os.path.basename(suite_path))
+
+ return NotRunSuites
+
+ def genResults(self):
+ self.suiteFiles = self._findResultSuites()
+ NotRunSuites = []
+ for planFolder, plan in self.suiteFiles.items():
+ currPlan = self.planDict[planFolder]
+ self.profile = currPlan.getProfile()
+ self.deviceid = currPlan.getDeviceId()
+ for suite_path, suite_am in plan.items():
+ if len(suite_am) < 1:
+ NotRunSuites.append(os.path.basename(suite_path))
+ LOGGER.critical("No test results returned from lite: %s", \
+ os.path.basename(suite_path))
+ continue
+ if '__auto_skip' in suite_am:
+ suite_am.remove('__auto_skip')
+ if '__manual_skip' in suite_am:
+ suite_am.remove('__manual_skip')
+ if len(suite_am) < 1:
+ LOGGER.warning("Test results not returned from lite \
+ (No manual or auto testcases): %s", \
+ os.path.basename(suite_path))
+ continue
+
+ self.env = self.ResEnvironment()
+ self.summary = self.ResSummary()
+ self.capability = self.ResCapabilities()
+ self.suites = []
+ self.parse(suite_am)
+ if Constants.RERUNING_MODE:
+ dst = suite_path + "_rerun_result_tmp.xml"
+ tmp_dst = Constants.getTempPath(dst)
+ self.result_to_xml(tmp_dst)
+ self.mergeRerunResults(suite_path + ".xml", tmp_dst)
+ os.remove(tmp_dst)
+ else:
+ self.result_to_xml(suite_path + ".xml")
+
+ currPlan.setUnpass(self.getUnpass())
+ return
+
+ def getUnpass(self):
+ return self.unpass
+
+ def parse(self, suiteFiles):
+ unpass = False
+ suite_count = 0
+ for suiteFile in suiteFiles:
+ LOGGER.debug("ABOUT TO PARSE %s" % suiteFile)
+ if not Constants.checkFileExists(suiteFile):
+ LOGGER.warning("[%s] not found" % suiteFile)
+ continue
+ if not suiteFile.split("/")[-1].find("tct-") > -1:
+ if not suiteFile.split("/")[-1].find(".Tests") > -1:
+ continue
+ xml_tree = ElementTree.parse(suiteFile)
+ xml_root = xml_tree.getroot()
+ if self.env.isNull:
+ self.env.parse(ele_find(xml_root, 'environment'))
+ if self.env.tct_profile is None:
+ self.env.tct_profile = self.profile
+ if self.summary.isNull:
+ self.summary.parse(ele_find(xml_root, 'summary'))
+ else:
+ self.summary.merge_time(ele_find(xml_root, 'summary'))
+
+ suite_summary = ele_find(xml_root, 'summary')
+ suite_start_at = ele_find(suite_summary, 'start_at').text
+ suite_end_at = ele_find(suite_summary,'end_at').text
+
+ suite = self.ResSuite(suite_start_at, suite_end_at)
+ ele_suite = ele_find(xml_root, 'suite')
+ suite.parse(ele_suite)
+ if suite.name is None:
+ suite.name = Constants.getSuiteNameFromFile(\
+ os.path.basename(suiteFile))
+ self.suites.append(suite)
+ if suite.getUnpass():
+ LOGGER.debug("[%s] has at least one unpassed testcase" \
+ % str(suite.name))
+ unpass = True
+ suite_count += 1
+ if suite_count < 1:
+ LOGGER.warning("No suite results to summarize")
+ return
+
+ if self.capability.isNull:
+ dev_cap = Constants.LOCAL_CAPABILITY_PATH % self.env.device_id
+ if not os.path.isfile(dev_cap):
+ LOGGER.error("Device capability does not exist for device: \
+ [%s]" % self.env.device_id)
+ else:
+ xml_captree = ElementTree.parse(\
+ Constants.LOCAL_CAPABILITY_PATH % self.env.device_id)
+ xml_caproot = xml_captree.getroot()
+ self.capability.parse(xml_caproot)
+ self.unpass = unpass
+ return
+
+ def mergeresult_parse(self, src1, src2, priority="FAIL"):
+ xml_tree1 = ElementTree.parse(src1)
+ xml_tree2 = ElementTree.parse(src2)
+ xml_root1 = xml_tree1.getroot()
+ xml_root2 = xml_tree2.getroot()
+ self.suites = []
+ if self.env.isNull:
+ self.env.parse(ele_find(xml_root1, 'environment'))
+ if self.env.tct_profile is None:
+ self.env.tct_profile = self.profile
+
+ if self.summary.isNull:
+ self.summary.parse(ele_find(xml_root1, 'summary'))
+
+ for suite1 in xml_root1.findall('suite'):
+ suite2 = None
+ for lookformatch in xml_root2.findall('suite'):
+ if lookformatch.get('name') == suite1.get('name'):
+ suite2 = lookformatch
+ break
+
+ suite_summary = ele_find(xml_root1, 'summary')
+ suite_start_at = ele_find(suite_summary, 'start_at').text
+ suite_end_at = ele_find(suite_summary, 'end_at').text
+
+ suite_obj = self.ResSuite(suite_start_at, suite_end_at)
+
+ if suite2 is None:
+ self.suites.append(suite_obj.parse(suite1))
+ else:
+ self.suites.append(suite_obj.mergeresult_parse(\
+ suite1, suite2, priority))
+
+ if self.capability.isNull:
+ dev_cap = Constants.LOCAL_CAPABILITY_PATH % self.env.device_id
+ if not os.path.isfile(dev_cap):
+ LOGGER.warning("Device capability does not exist for device: \
+ [%s]" % self.env.device_id)
+ else:
+ xml_captree = ElementTree.parse(\
+ Constants.LOCAL_CAPABILITY_PATH % self.env.device_id)
+ xml_caproot = xml_captree.getroot()
+ self.capability.parse(xml_caproot)
+ return self
+
+ def result_to_xml(self, dest):
+ self.copy_style(dest)
+ decl_root = ElementTree.Element(None)
+ decl1 = ElementTree.PI('xml-stylesheet', \
+ 'type="text/xsl" href="./style/testresult.xsl"')
+ decl1.tail = "\n"
+ '''
+ decl2 = ElementTree.PI('xml-stylesheet', \
+ 'type="text/xsl" href="testresult.xsl"')
+ decl2.tail = "\n"
+ '''
+ decl_root.append(decl1)
+ #decl_root.append(decl2)
+ root = ElementTree.Element('test_definition')
+ root.append(self.env.to_xml())
+ root.append(self.summary.to_xml())
+ for suite in self.suites:
+ root.append(suite.result_to_xml())
+ Constants.indent(root)
+ decl_root.append(root)
+ tree = ElementTree.ElementTree()
+ tree._setroot(decl_root)
+ LOGGER.debug("ABOUT TO WRITE RESULTS INTO %s\n" % dest)
+ tree.write(dest, encoding="UTF-8")
+ LOGGER.info("RESULTS TO XML: writing into %s\n" % dest)
+
+ def rerun_to_xml(self, dest):
+ root = ElementTree.Element('test_definition')
+ for suite in self.suites:
+ root.append(suite.result_to_xml(fail_only=True))
+ hasUnpass = False
+ for suite in root.findall('suite'):
+ if list(suite) != []:
+ hasUnpass = True
+ if not hasUnpass:
+ return False
+ Constants.indent(root)
+ tree = ElementTree.ElementTree()
+ tree._setroot(root)
+ LOGGER.debug("ABOUT TO WRITE RERUN INTO %s\n" % dest)
+ tree.write(dest, encoding="UTF-8")
+ LOGGER.info("RERUN TO XML: writing into %s\n" % dest)
+ return True
+
+ def summary_to_xml(self, dest):
+ self.copy_style(dest)
+ decl_root = ElementTree.Element(None)
+ decl1 = ElementTree.PI('xml-stylesheet', \
+ 'type="text/xsl" href="./style/summary.xsl"')
+ decl1.tail = "\n"
+ decl_root.append(decl1)
+ root = ElementTree.Element('result_summary')
+ ele_set(root, 'plan_name', self.planid)
+ root.append(self.env.to_xml())
+ root.append(self.summary.to_xml())
+ root.append(self.capability.to_xml())
+ for suite in self.suites:
+ root.append(suite.summary_to_xml())
+ Constants.indent(root)
+ decl_root.append(root)
+ tree = ElementTree.ElementTree()
+ tree._setroot(decl_root)
+ LOGGER.debug("ABOUT TO WRITE SUMMARY INTO %s\n" % dest)
+ tree.write(dest, encoding="UTF-8")
+ LOGGER.info("SUMMARY TO XML: writing into %s\n" % dest)
+
+ def _findResultSuites(self, _resultFolder=None):
+ if Constants.RERUNING_MODE:
+ auto_suffix = Constants.RERUN_AUTO_RESULT_SUFFIX
+ manual_suffix = Constants.RERUN_MANUAL_RESULT_SUFFIX
+ else:
+ auto_suffix = Constants.AUTO_RESULT_SUFFIX
+ manual_suffix = Constants.MANUAL_RESULT_SUFFIX
+ suiteFiles = {}
+ self.planDict = {}
+ for plan in self.plans:
+ plan_resultFolder = None
+ if _resultFolder is None:
+ plan_resultFolder = plan.getResultFolderPath()
+ else:
+ plan_resultFolder = _resultFolder
+
+ suiteFiles[plan_resultFolder] = {}
+ self.planDict[plan_resultFolder] = plan
+ for suite in plan.getSuites():
+ mergedsuite = os.path.join(plan_resultFolder, suite.suiteName)
+ suiteFiles[plan_resultFolder][mergedsuite] = []
+ autosuite = mergedsuite + auto_suffix
+ manualsuite = mergedsuite + manual_suffix
+ if suite.getNoAuto():
+ suiteFiles[plan_resultFolder][mergedsuite]\
+ .append('__auto_skip')
+ if suite.getNoManual():
+ suiteFiles[plan_resultFolder][mergedsuite]\
+ .append('__manual_skip')
+ if os.path.isfile(autosuite):
+ suiteFiles[plan_resultFolder][mergedsuite]\
+ .append(autosuite)
+ if os.path.isfile(manualsuite):
+ suiteFiles[plan_resultFolder][mergedsuite]\
+ .append(manualsuite)
+ return suiteFiles
+
+ def _rerun_findResultSuites_plan(self):
+ suiteFiles = {}
+ plan_resultFolder = self.plans[0].getResultFolderPath()
+ suiteFiles[plan_resultFolder] = {}
+ os.chdir(plan_resultFolder)
+ for suiteFile in glob.glob("*.xml"):
+ if 'auto.xml' in suiteFile or 'manual.xml' in suiteFile \
+ or 'rerun.xml' in suiteFile or 'status.xml' \
+ in suiteFile or suiteFile == 'summary.xml':
+ continue
+ suiteFiles[plan_resultFolder][suiteFile[:-4]] = []
+ return suiteFiles
+
+ def _rerun_findResultSuites_scen(self):
+ suiteFiles = {}
+ scen_resultFolder = self.scen_resultFolder
+ suiteFiles[scen_resultFolder] = {}
+ os.chdir(scen_resultFolder)
+ for suiteFile in glob.glob("*.xml"):
+ if 'auto.xml' in suiteFile or 'manual.xml' in suiteFile \
+ or 'rerun.xml' in suiteFile or 'status.xml' \
+ in suiteFile or suiteFile == 'summary.xml':
+ continue
+ suiteFiles[scen_resultFolder][suiteFile[:-4]] = []
+ return suiteFiles
+
+ def _not_in_use_rerun_findResultSuites_scen(self, scen_status):
+ suiteFiles = {}
+ xml_scenstat = ElementTree.parse(scen_status)
+ root = xml_scenstat.getroot()
+ for plan in root.findall('plan'):
+ plan_resultFolder = plan.get('result_folder')
+ suiteFiles[plan_resultFolder] = []
+ os.chdir(plan_resultFolder)
+ for suiteFile in glob.glob("*.xml"):
+ if 'auto.xml' in suiteFile or 'manual.xml' in suiteFile \
+ or 'rerun.xml' in suiteFile or 'status.xml' \
+ in suiteFile or suiteFile == 'summary.xml':
+ continue
+ suiteFiles[plan_resultFolder].append(suiteFile)
+ return suiteFiles
+
+ #return folderPath
+ def makeMergedFolder(self):
+ #create mergeFolder
+ if Constants.RERUNING_MODE and Constants.SCENARIO_MODE:
+ if not os.path.isdir(self.scen_resultFolder):
+ LOGGER.warning("RERUN: cannot find original result folder : \
+ [%s]" % self.scen_resultFolder)
+ else:
+ os.mkdir(self.scen_resultFolder, mode=0o777)
+ return
+
+ def suiteCopyFiles(self):
+ self.suites = []
+ self.suiteFiles = self._findResultSuites()
+ suiteResults_scen = []
+ for planFolder, plan in self.suiteFiles.items():
+ for suite_am in plan.keys():
+ resultFile = suite_am + ".xml"
+ if not os.path.isfile(resultFile):
+ continue
+ dest = os.path.join(self.scen_resultFolder, \
+ os.path.basename(resultFile))
+ if os.path.isfile(dest):
+ self.mergeSuiteResults(dest, resultFile)
+ continue
+ copyfiledir(resultFile, dest)
+ suiteResults_scen.append(dest)
+ return suiteResults_scen
+
+ def _rerunReplaceResults(self, suiteFiles):
+ updated_check = []
+ for planFolder, plan in suiteFiles.items():
+ for suite_am in plan.keys():
+ resultFile = suite_am + ".xml"
+ if not os.path.isfile(resultFile):
+ continue
+ dest = os.path.join(self.scen_resultFolder, \
+ os.path.basename(resultFile))
+ if os.path.isfile(dest):
+ if suite_am in updated_check:
+ self.mergeSuiteResults(dest, resultFile)
+ else:
+ self.mergeRerunResults(dest, resultFile)
+ updated_check.append(suite_am)
+ else:
+ LOGGER.warning("The original result xml does not exist \
+ in the scenario file. File: [%s]" % dest)
+
+ def genSummaryForScen(self):
+ self.deviceid = self.head_deviceid
+ self.profile = self.head_profile
+ self.planid = self.scenid
+ suiteFiles = self.suiteCopyFiles()
+ self.suites = []
+ self.parse(suiteFiles)
+ dest = os.path.join(self.scen_resultFolder, 'summary.xml')
+ self.summary_to_xml(dest)
+ return dest
+
+ def rerun_genSummaryForScen(self):
+ self._rerunReplaceResults(self._findResultSuites())
+ suiteFiles = self._rerun_findResultSuites_scen()
+ for scenFolder, scen in suiteFiles.items():
+ suiteResults_scen = []
+ for suite_am in scen.keys():
+ suiteResults_scen.append(suite_am + ".xml")
+ self.suites = []
+ self.parse(suiteResults_scen)
+ dest = os.path.join(self.scen_resultFolder, 'summary.xml')
+ self.summary_to_xml(dest)
+ return dest
+
+ def mergeRerunResults(self, src1, src2):
+ self.mergeSuiteResults(src1, src2, priority="PASS")
+
+ def mergeSuiteResults(self, src1, src2, priority="FAIL"):
+ self.suites = []
+ self.env = self.ResEnvironment()
+ self.summary = self.ResSummary()
+ self.capability = self.ResCapabilities()
+ self.mergeresult_parse(src1, src2, priority)
+ self.result_to_xml(src1)
+ return
+
+ def copy_style(self, dest):
+ styleFolder = os.path.join(os.path.dirname(dest), 'style')
+ if not os.path.isdir(styleFolder):
+ copyfiledir(Constants.STYLE_FOLDER, styleFolder)
+
+ def fetch_logs(self, dest):
+ return
+
+ class ResEnvironment:
+ def __init__(self):
+ self.other = None
+ self.build_id = None
+ self.tct_version = None
+ self.tct_profile = None
+ self.device_id = None
+ self.device_model = None
+ self.device_name = None
+ self.host = None
+ self.manufacturer = None
+ self.resolution = None
+ self.screen_size = None
+ self.isNull = True
+
+ def parse(self, env):
+ self.build_id = env.get('build_id')
+ #should be added to Constants ..............
+ self.tct_profile = env.get('tct_profile')
+ self.tct_version = Constants.get_tct_binaryV()
+ self.device_id = env.get('device_id')
+ self.device_model = env.get('device_model')
+ self.device_name = env.get('device_name')
+ self.host = env.get('host')
+ self.manufacturer = env.get('manufacturer')
+ self.resolution = env.get('resolution')
+ self.screen_size = env.get('screen_size')
+ self.other = ele_find(env, 'other')
+ self.isNull = False
+
+ def to_xml(self):
+ env = ElementTree.Element('environment')
+ ele_set(env, 'build_id', self.build_id)
+ ele_set(env, 'tct_version', self.tct_version)
+ ele_set(env, 'tct_profile', self.tct_profile)
+ ele_set(env, 'device_id', self.device_id)
+ if self.device_model is None:
+ ele_set(env, 'device_model', "None")
+ else:
+ ele_set(env, 'device_model', self.device_model)
+ ele_set(env, 'device_name', self.device_name)
+ ele_set(env, 'host', self.host)
+ ele_set(env, 'manufacturer', self.manufacturer)
+ ele_set(env, 'resolution', self.resolution)
+ ele_set(env, 'screen_size', self.screen_size)
+ other = ElementTree.Element('other')
+ env.append(other)
+ #other needs to be added.....
+ return env
+
+ class ResSummary:
+ def __init__(self):
+ self.isNull = True
+ self.test_plan_name = None
+ self.start_at = None
+ self.end_at = None
+
+ def parse(self, summary):
+ self.test_plan_name = summary.get('test_plan_name')
+ self.start_at = ele_find(summary, 'start_at').text
+ self.end_at = ele_find(summary, 'end_at').text
+ self.isNull = False
+
+ def merge_time(self, summary):
+ start_at2 = ele_find(summary, 'start_at').text
+ end_at2 = ele_find(summary, 'end_at').text
+ if self.start_at and start_at2:
+ self.start_at = min(self.start_at, start_at2)
+ if self.end_at and end_at2:
+ self.end_at = max(self.end_at, end_at2)
+
+ def to_xml(self):
+ summary = ElementTree.Element('summary')
+ ele_set(summary, 'test_plan_name', self.test_plan_name)
+ start_at = ElementTree.Element('start_at')
+ if self.start_at:
+ start_at.text = self.start_at
+ summary.append(start_at)
+ end_at = ElementTree.Element('end_at')
+ if self.end_at:
+ end_at.text = self.end_at
+ summary.append(end_at)
+ return summary
+
+ class ResCapabilities:
+
+ def __init__(self):
+ self.isNull = True
+ self.capList = []
+
+ def parse(self, caps):
+ for xml_cap in caps.findall('capability'):
+ cap = self.ResCapability()
+ cap.parse(xml_cap)
+ self.capList.append(cap)
+ self.isNull = False
+
+ def to_xml(self):
+ caps = ElementTree.Element('capabilities')
+ for cap in self.capList:
+ caps.append(cap.to_xml())
+ return caps
+
+ class ResCapability:
+ def __init__(self):
+ self.name = None
+ self.support = None
+ self.typ = None
+
+ def parse(self, cap):
+ self.name = cap.get('name')
+ self.support = cap.get('support')
+ self.typ = cap.get('type')
+
+ def to_xml(self):
+ cap = ElementTree.Element('capability')
+ ele_set(cap, 'name', self.name)
+ ele_set(cap, 'support', self.support)
+ ele_set(cap, 'type', self.typ)
+ return cap
+
+ class ResSuite:
+
+ def __init__(self, start_at="", end_at=""):
+ self.name = None
+ self.category = None
+ self.launcher = None
+ self.total_case = None
+ self.pass_case = None
+ self.pass_rate = None
+ self.fail_case = None
+ self.fail_rate = None
+ self.block_case = None
+ self.block_rate = None
+ self.na_case = None
+ self.na_rate = None
+ self.suite_set = []
+ self.unpass = None
+ self.start_at = start_at
+ self.end_at = end_at
+
+ def getUnpass(self):
+ return self.unpass
+
+ def mergeresult_parse(self, suite1, suite2, priority="FAIL"):
+ self.name = suite1.get('name')
+ self.category = suite1.get('category')
+ self.launcher = suite1.get('launcher')
+ for suite_set1 in suite1.findall('set'):
+ suite_set2 = None
+ for lookformatch in suite2.findall('set'):
+ if lookformatch.get('name') == suite_set1.get('name'):
+ suite_set2 = lookformatch
+ break
+
+ if suite_set2 is None:
+ self.suite_set.append(self.Set().parse(suite_set1))
+ else:
+ self.suite_set.append(self.Set().mergeresult_parse(\
+ suite_set1, suite_set2, priority))
+
+ return self
+
+ def parse(self, suite):
+ unpass = False
+ self.name = suite.get('name')
+ self.category = suite.get('category')
+ self.launcher = suite.get('launcher')
+ for suite_set in suite.findall('set'):
+ setparser = self.Set()
+ self.suite_set.append(setparser.parse(suite_set))
+ if setparser.getUnpass():
+ unpass = True
+ self.unpass = unpass
+ total_cnt = 0
+ pass_cnt = 0
+ fail_cnt = 0
+ block_cnt = 0
+ na_cnt = 0
+ for suite_set in suite.findall('set'):
+ for tc in suite_set.findall('testcase'):
+ result = tc.get('result')
+ total_cnt += 1
+ if result == "PASS":
+ pass_cnt += 1
+ elif result == "FAIL":
+ fail_cnt += 1
+ elif result == "BLOCK":
+ block_cnt += 1
+ elif result == "N/A":
+ na_cnt += 1
+ self.total_case = str(total_cnt)
+ if total_cnt == 0:
+ if self.name is not None:
+ LOGGER.warning("No testcases in the suite: [%s]" \
+ % self.name)
+ #prevent division by zero
+ total_cnt = 1
+ self.pass_case = str(pass_cnt)
+ self.pass_rate = "%.2f" % (float(pass_cnt) / \
+ float(total_cnt) * 100)
+ self.fail_case = str(fail_cnt)
+ self.fail_rate = "%.2f" % (float(fail_cnt) / \
+ float(total_cnt) * 100)
+ self.block_case = str(block_cnt)
+ self.block_rate = "%.2f" % (float(block_cnt) / float(total_cnt) \
+ * 100)
+ self.na_case = str(na_cnt)
+ self.na_rate = "%.2f" % (float(na_cnt) / float(total_cnt) * 100)
+
+ return self
+
+ def result_to_xml(self, fail_only=False):
+ suite = ElementTree.Element('suite')
+ ele_set(suite, 'category', self.category)
+ ele_set(suite, 'launcher', self.launcher)
+ ele_set(suite, 'name', self.name)
+ for suite_set in self.suite_set:
+ checkset = suite_set.to_xml(fail_only)
+ if checkset.find('testcase') is not None:
+ suite.append(suite_set.to_xml(fail_only))
+ return suite
+
+ def summary_to_xml(self):
+ suite = ElementTree.Element('suite')
+ ele_set(suite, 'name', self.name)
+
+ start_at_case = ElementTree.Element('start_at')
+ if self.start_at:
+ start_at_case.text = self.start_at
+
+ end_at_case = ElementTree.Element('end_at')
+ if self.end_at:
+ end_at_case.text = self.end_at
+
+ total_case = ElementTree.Element('total_case')
+ if self.total_case:
+ total_case.text = self.total_case
+
+ pass_case = ElementTree.Element('pass_case')
+ if self.pass_case:
+ pass_case.text = self.pass_case
+ pass_rate = ElementTree.Element('pass_rate')
+ if self.pass_rate:
+ pass_rate.text = self.pass_rate
+ fail_case = ElementTree.Element('fail_case')
+ if self.fail_case:
+ fail_case.text = self.fail_case
+ fail_rate = ElementTree.Element('fail_rate')
+ if self.fail_rate:
+ fail_rate.text = self.fail_rate
+ block_case = ElementTree.Element('block_case')
+ if self.block_case:
+ block_case.text = self.block_case
+ block_rate = ElementTree.Element('block_rate')
+ if self.block_rate:
+ block_rate.text = self.block_rate
+ na_case = ElementTree.Element('na_case')
+ if self.na_case:
+ na_case.text = self.na_case
+ na_rate = ElementTree.Element('na_rate')
+ if self.na_rate:
+ na_rate.text = self.na_rate
+
+ suite.append(start_at_case)
+ suite.append(end_at_case)
+ suite.append(total_case)
+ suite.append(pass_case)
+ suite.append(pass_rate)
+ suite.append(fail_case)
+ suite.append(fail_rate)
+ suite.append(block_case)
+ suite.append(block_rate)
+ suite.append(na_case)
+ suite.append(na_rate)
+ return suite
+
+ class Set:
+ def __init__(self):
+ self.name = None
+ self.set_debug_msg = None
+ self.testcase = []
+ self.capabilities = []
+ self.unpass = None
+
+ def getUnpass(self):
+ return self.unpass
+
+ def parse(self, suite_set):
+ unpass = False
+ self.name = suite_set.get('name')
+ self.set_debug_msg = suite_set.get('set_debug_msg')
+ capabilities = ele_find(suite_set, 'capabilities')
+ for cap in capabilities.findall('capability'):
+ self.capabilities.append(self.Capability().parse(cap))
+ for testcase in suite_set.findall('testcase'):
+ tcparser = self.Testcase()
+ self.testcase.append(tcparser.parse(testcase))
+ if tcparser.getUnpass():
+ unpass = True
+ self.unpass = unpass
+ return self
+
+ def mergeresult_parse(self, suite_set1, \
+ suite_set2, priority="FALSE"):
+ self.name = suite_set1.get('name')
+ self.set_debug_msg = suite_set1.get('set_debug_msg')
+ capabilities = suite_set1.find('capabilities')
+ capabilities = ele_find(suite_set1, 'capabilities')
+ for cap in capabilities.findall('capability'):
+ self.capabilities.append(self.Capability().parse(cap))
+ for testcase1 in suite_set1.findall('testcase'):
+ testcase2 = None
+ for lookformatch in suite_set2.findall('testcase'):
+ if lookformatch.get('id') == testcase1.get('id'):
+ testcase2 = lookformatch
+ break
+ if testcase2 is None:
+ self.testcase.append(self.Testcase().parse(testcase1))
+ else:
+ self.testcase.append(\
+ self.Testcase().mergeresult_parse(\
+ testcase1, testcase2, priority))
+ return self
+
+ def to_xml(self, fail_only):
+ suite_set = ElementTree.Element('set')
+ ele_set(suite_set, 'name', self.name)
+ ele_set(suite_set, 'set_debug_msg', self.set_debug_msg)
+ capabilities = ElementTree.Element('capabilities')
+ for cap in self.capabilities:
+ capabilities.append(cap.to_xml())
+ if len(self.capabilities) > 0:
+ suite_set.append(capabilities)
+ for testcase in self.testcase:
+ tc = testcase.to_xml(fail_only)
+ if tc is not None:
+ suite_set.append(tc)
+ return suite_set
+
+ class Capability:
+ def __init__(self):
+ self.name = None
+
+ def parse(self, cap):
+ self.name = cap.get('name')
+ return self
+
+ def to_xml(self):
+ cap = ElementTree.Element('capability')
+ ele_set(cap, 'name', self.name)
+ return cap
+
+ class Testcase:
+ def __init__(self):
+ self.Id = None
+ self.component = None
+ self.execution_type = None
+ self.priority = None
+ self.purpose = None
+ self.result = None
+ self.test_script_entry = None
+ self.actual_result = None
+ self.start = None
+ self.end = None
+ self.stdout = None
+ self.stderr = None
+ self.unpass = None
+ self.onload_delay = None
+
+ def getUnpass(self):
+ return self.unpass
+
+ def parse(self, tc):
+ self.Id = tc.get('id')
+ self.component = tc.get('component')
+ self.execution_type = tc.get('execution_type')
+ self.priority = tc.get('priority')
+ self.purpose = tc.get('purpose')
+ self.result = tc.get('result')
+ self.onload_delay = tc.get('onload_delay')
+ self.test_script_entry = ele_find(\
+ ele_find(tc, 'description'),\
+ 'test_script_entry').text
+ self.actual_result = ele_find(\
+ ele_find(tc, 'result_info'), \
+ 'actual_result').text
+ self.start = ele_find(ele_find(tc, 'result_info'),\
+ 'start').text
+ self.end = ele_find(\
+ ele_find(tc, 'result_info'), 'end').text
+ self.stdout = ele_find(ele_find(tc, 'result_info'),\
+ 'stdout').text
+ self.stderr = ele_find(ele_find(tc, 'result_info'),\
+ 'stderr').text
+ if self.result != "PASS":
+ self.unpass = True
+ return self
+
+ def mergeresult_parse(self, tc1, tc2, priority="FAIL"):
+ self.Id = tc1.get('id')
+ self.component = tc1.get('component')
+ self.execution_type = tc1.get('execution_type')
+ self.priority = tc1.get('priority')
+ self.purpose = tc1.get('purpose')
+ self.onload_delay = tc1.get('onload_delay')
+ result1 = tc1.get('result')
+ result2 = tc2.get('result')
+ if priority == "FAIL":
+ if result1 == "FAIL":
+ tc = tc1
+ elif result2 == "FAIL":
+ tc = tc2
+ elif result1 == "BLOCK":
+ tc = tc1
+ elif result2 == "BLOCK":
+ tc = tc2
+ elif result1 == "N/A":
+ tc = tc1
+ elif result2 == "N/A":
+ tc = tc2
+ else:
+ tc = tc1
+ if priority == "PASS":
+ tc = tc2
+ self.result = tc.get('result')
+ self.test_script_entry = ele_find(\
+ ele_find(tc, 'description'),\
+ 'test_script_entry').text
+ self.actual_result = ele_find(\
+ ele_find(tc, 'result_info'), \
+ 'actual_result').text
+ self.start = ele_find(ele_find(tc, 'result_info'), \
+ 'start').text
+ self.end = ele_find(ele_find(tc, 'result_info'), \
+ 'end').text
+ self.stdout = ele_find(ele_find(tc, 'result_info'), \
+ 'stdout').text
+ self.stderr = ele_find(ele_find(tc, 'result_info'), \
+ 'stderr').text
+ return self
+
+ def to_xml(self, fail_only):
+ if fail_only and self.result == "PASS":
+ return
+ tc = ElementTree.Element('testcase')
+ ele_set(tc, 'component', self.component)
+ ele_set(tc, 'execution_type', self.execution_type)
+ ele_set(tc, 'id', self.Id)
+ ele_set(tc, 'priority', self.priority)
+ ele_set(tc, 'purpose', self.purpose)
+ ele_set(tc, 'onload_delay', self.onload_delay)
+ if not fail_only:
+ ele_set(tc, 'result', self.result)
+ description = ElementTree.Element('description')
+ tse = ElementTree.Element('test_script_entry')
+ if self.test_script_entry:
+ tse.text = self.test_script_entry
+ description.append(tse)
+ tc.append(description)
+ if fail_only:
+ return tc
+ result_info = ElementTree.Element('result_info')
+ actual_result = ElementTree.Element('actual_result')
+ if self.actual_result:
+ actual_result.text = self.actual_result
+ start = ElementTree.Element('start')
+ if self.start:
+ start.text = self.start
+ end = ElementTree.Element('end')
+ if self.end:
+ end.text = self.end
+ stdout = ElementTree.Element('stdout')
+ if self.stdout:
+ stdout.text = self.stdout
+ stderr = ElementTree.Element('stderr')
+ if self.stderr:
+ stderr.text = self.stderr
+ result_info.append(actual_result)
+ result_info.append(start)
+ result_info.append(end)
+ result_info.append(stdout)
+ result_info.append(stderr)
+ tc.append(result_info)
+ return tc
--- /dev/null
+#!/usr/bin/python
+
+import os
+import re
+import sys, traceback
+import glob
+from constants import Constants
+from xml.etree import ElementTree
+import xml.etree.ElementTree as etree
+from Tkinter import *
+import tkMessageBox
+from optparse import *
+from devicemanager import DeviceManager
+from logmanager import LOGGER
+
+def vanarg(option, opt_str, value, parser):
+ value = []
+ for arg in parser.rargs:
+ if re.search('^--.+', arg) or re.search('^-[\D]', arg):
+ break
+ value.append(arg)
+ del parser.rargs[:len(value)]
+ setattr(parser.values, option.dest, value)
+
+def printPlans_Devices(option, opt_str, value, parser):
+ printPlanList()
+ printDeviceList()
+ sys.exit(1)
+
+def printPlanList():
+ print "\nAvaiable Plans:...\n"
+ folder = Constants.TCT_PLAN_FOLDER
+ os.chdir(folder)
+ for files in glob.glob("*.xml"):
+ print files[:-4]
+
+def printDeviceList():
+ print "\nConnected Devices:...\n"
+ dmi = DeviceManager.getInstance()
+ dmi.loadDeviceList()
+ devices = dmi.getSdbDeviceList()
+ for dev in devices:
+ dev._printDevInfo()
+ if len(devices) < 1:
+ print "No Connected Devices"
+
+class ScenarioGeneratorOptions:
+ def __init__(self):
+ self._j = os.path.join
+ self._e = os.path.exists
+ self._d = os.path.dirname
+ self._b = os.path.basename
+ self._abspath = os.path.abspath
+ self.options = None
+ self.running_mode = None
+ self.USAGE = ""
+
+ def parse_options(self, argv):
+ option_list = [
+ make_option("--folderpath", "-f", dest = "plansrcfolder", \
+ action="callback", callback=vanarg, \
+ help="Specify the plan source directory"),
+ make_option("-o", "--output", dest="testscen_file", \
+ action="callback", callback=vanarg, \
+ help="Specify the generating testscen in a XML file."),
+ make_option("-d", "--default", dest="default", \
+ action="store_true", help="Default setting"),
+ make_option("-p", "--plan", dest="plan", action="callback", \
+ callback=vanarg, help="Make list of sets that match a \
+ plan with a device and tizen version : \
+ [plan_file],[device],[tizenversion]"),
+ make_option("--list", dest="lst", action="callback", \
+ callback=printPlans_Devices, help="List all existing \
+ plans and connected devices")
+ ]
+ if len(argv) == 1:
+ argv.append("-h")
+ PARSERS = OptionParser(option_list=option_list, usage=self.USAGE)
+
+ (self.options, args) = PARSERS.parse_args()
+
+ if self.options.default is not None:
+ if self.options.plansrcfolder is not None or \
+ self.options.testscen_file is not None or \
+ self.options.plan is not None:
+ sys.exit("options: conflict")
+
+ def get_scen_name(self):
+ if (self.options.testscen_file is not None) and \
+ (self.options.testscen_file[0] is not None):
+ name, ext = os.path.splitext(self.options.testscen_file[0])
+ return name.split("/")[-1]
+ else:
+ return Constants.DEFAULT_SCEN_NAME
+
+ def get_plansrc_folder(self):
+ if (self.options.plansrcfolder is not None) and \
+ (self.options.plansrcfolder[0] is not None):
+ return self.options.plansrcfolder[0]
+ else:
+ return Constants.TCT_PLAN_FOLDER
+
+ def get_output(self):
+ if (self.options.testscen_file is not None) and \
+ (self.options.testscen_file[0] is not None):
+ d = os.path.abspath(os.path.dirname(self.options.testscen_file[0]))
+ if not os.path.exists(d):
+ os.makedirs(d)
+ return os.path.abspath(self.options.testscen_file[0])
+ else:
+ d = os.path.abspath(Constants.TCT_SCEN_FOLDER)
+ if not os.path.exists(d):
+ os.makedirs(d)
+ return Constants.TCT_SCEN_FOLDER + "generated_scen.xml"
+
+ def get_planlist_args(self):
+ if self.options.plan is not None:
+ plans = []
+ dmi = DeviceManager.getInstance()
+ dmi.loadDeviceList()
+ for plan in self.options.plan:
+ if len(plan.split(',')) != 3:
+ sys.exit("[--plan]: Wrong format. See --help for correct \
+ format")
+ plan_name = plan.split(',')[0]
+ dev_id = plan.split(',')[1]
+ tizenVer = plan.split(',')[2]
+ dev = dmi.getDevice(dev_id)
+ if dev is None:
+ sys.exit("Device: [%s] is not connected" % dev_id)
+ if not os.path.isfile(os.path.join(self.get_plansrc_folder(),\
+ "%s.xml" % plan_name)):
+ sys.exit("Plan: [%s] does not exist in the plan source \
+ folder : [%s]" % (plan_name, \
+ self.get_plansrc_folder()))
+ self.check_tizen_version(tizenVer)
+ plans.append([plan_name, [dev.devName, dev.devId, \
+ dev.devType], tizenVer])
+ return plans
+
+ def check_tizen_version(self, tizenversion):
+ VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d|^tizen_csharp_\d.\d"
+ pa = re.compile(VER_PATTERN, re.I)
+ ma = pa.match(tizenversion)
+ if ma is None:
+ LOGGER.error("A required \"/opt/tct/" + tizenversion + "\" could \
+ not be found.")
+ sys.exit("Invalid Tizen version. Tizen version must be in the form\
+ of tizen_(web|native|csharp)_#.#")
+
+ def getPlanList(self):
+ folder = self.get_plansrc_folder()
+ os.chdir(folder)
+ planList = []
+ for files in glob.glob("*.xml"):
+ planList.append(files[:-4])
+ return planList
+
+ def getDeviceList(self):
+ deviceList = []
+ dmi = DeviceManager.getInstance()
+ dmi.loadDeviceList()
+ devices = dmi.getSdbDeviceList()
+ for dev in devices:
+ deviceList.append([dev.devName, dev.devId, dev.devType])
+ if len(deviceList) < 1:
+ print "No Device Attached"
+ sys.exit("Exit: No Connected Devices")
+ return deviceList
--- /dev/null
+#!/usr/bin/python
+
+from constants import Constants
+from xml.etree import ElementTree
+from tctshell.gui.main_window import MainWindow
+import os,os.path
+import sys
+from logmanager import LOGGER
+
+class ScenPlan:
+
+ def __init__(self, folder, name, device, version):
+ self.name = name
+ self.device = device
+ self.version = version
+ self.folder = folder
+
+ def to_xml(self):
+ plan = ElementTree.Element('plan')
+ plan.set('name', self.name)
+ device = ElementTree.Element('device')
+ device.set('name', self.device[0])
+ device.set('id', self.device[1])
+ device.set('type', self.device[2])
+ plan.append(device)
+ version = ElementTree.Element('version')
+ version.text = self.version
+ plan.append(version)
+ path = ElementTree.Element('path')
+ name = "#".join(self.name.split("#")[:-1])
+ path.text = os.path.join(self.folder, "%s.xml" %name)
+ plan.append(path)
+ return plan
+
+class ScenarioRunner:
+
+ def __init__(self):
+ self.plans = {}
+ self.scen_name = Constants.DEFAULT_SCEN_NAME
+
+ def load_local_repo(self, planlist_args, path, scen_name, plan_list, dev_list):
+ self.scen_name = scen_name
+ count = 0
+ if planlist_args is None:
+ scenario = self.getPlanInfo(plan_list, dev_list)
+ else:
+ scenario = planlist_args
+ for plans in scenario:
+ count += 1
+ plan = ScenPlan(path, plans[0], plans[1], plans[2])
+ plan.name += "#%d" % count
+ self.plans[plan.name] = plan
+
+ def getPlanInfo(self, planList, deviceList):
+ mw = MainWindow("Scenario Generator")
+ mw.getActionFrame()
+ mw.importData(planList, deviceList, os.listdir("/opt/tct/"))
+ mw.run()
+ scenData = mw.getScenData()
+ if len(scenData) < 1:
+ LOGGER.error("No correct scenario data given.\nExiting...")
+ raise
+ return mw.getScenData()
+
+ def to_xml(self, xml_name):
+ root = ElementTree.Element('ns3:testscenario')
+ root.set('name', self.scen_name)
+ root.set('xmlns', '')
+ root.set('xmlns:ns3', 'http://www.example.org/plan/')
+
+ for plan_name in self.plans:
+ plan = self.plans[plan_name]
+ root.append(plan.to_xml())
+ Constants.indent(root)
+ tree = ElementTree.ElementTree()
+ tree._setroot(root)
+ if os.path.basename(xml_name) == "generated_scen.xml":
+ i = 0
+ while os.path.isfile(xml_name):
+ i += 1
+ if xml_name[-5] == "]":
+ xml_name = "[".join(xml_name.split("[")[:-1])+"[%d].xml" % i
+ else:
+ xml_name = xml_name[:-4]+"[%d].xml" % i
+ LOGGER.info("generating scenario to %s" % xml_name)
+ tree.write(xml_name, xml_declaration=True, encoding="utf-8")
+
--- /dev/null
+#!/usr/bin/python
+
+import subprocess
+import time
+import os
+import sys
+from .constants import Constants
+from .logmanager import LOGGER
+from .exception import DevNotFoundErr
+
+
+class SdbManager:
+
+ @staticmethod
+ def hostLiteCommand(command, failct=None):
+ LOGGER.info(command)
+ proc = subprocess.Popen(command, \
+ shell=True, \
+ bufsize=0, \
+ stdin=subprocess.PIPE, \
+ stdout=subprocess.PIPE, \
+ stderr=subprocess.PIPE)
+
+ curr_fail = 0
+ while True:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+
+ output = proc.stdout.readline()
+ if output:
+ output = output.strip().decode('utf-8')
+ LOGGER.info(output)
+ if output.find("all tasks for testkit lite are accomplished, goodbye") > -1:
+ return True
+ elif output.find("error: protocol fault: no status") > -1:
+ LOGGER.error(output)
+ return False
+ elif output.find("error: target offline") > -1:
+ LOGGER.error(output)
+ return False
+ elif output.find("error: target not found") > -1:
+ LOGGER.error(output)
+ return False
+ elif output.find("error: get too many errors, stop current set") > -1:
+ LOGGER.error(output)
+ return False
+ elif output.find("test app no response, hang or not launched") > -1:
+ LOGGER.error(output)
+ elif output.find("get server status timeout, please check device") > -1:
+ LOGGER.error(output)
+ return False
+ elif output.find("failed to install widget") > -1:
+ LOGGER.error(output)
+
+ if failct and int(failct) > 0:
+ if output.lower().find('execute case:') > -1 and \
+ (output.lower().find('fail') > -1 or \
+ output.lower().find('block') > -1):
+ curr_fail += 1
+ if int(failct) == curr_fail:
+ return False
+ return True
+
+ @staticmethod
+ def hostRecLiteCommand(command):
+ LOGGER.info(command)
+ proc = subprocess.Popen(command, shell=True, \
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+ while True:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+ output = proc.stdout.readline()
+ if output:
+ output = output.strip().decode('utf-8')
+ LOGGER.info(output)
+ if output.find("all tasks for testkit lite are accomplished, goodbye") > -1:
+ return True
+ return True
+
+ @staticmethod
+ def hostCommand(command, timeout=90):
+ LOGGER.info(command)
+ outs = None
+ errs = None
+ proc = None
+ try:
+ proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, \
+ stderr=subprocess.PIPE)
+ outs, errs = proc.communicate(timeout=timeout)
+ except subprocess.TimeoutExpired:
+ exc = sys.exc_info()
+ raise exc[1].with_traceback(exc[2])
+ except Exception:
+ exc = sys.exc_info()
+ raise exc[1].with_traceback(exc[2])
+
+ if outs:
+ outs = outs.decode("utf-8")
+ if errs:
+ errs = errs.decode("utf-8")
+
+ if outs:
+ LOGGER.info(outs)
+ if SdbManager.is_target_offline(outs):
+ raise DevNotFoundErr("None")
+
+ if errs:
+ LOGGER.error(errs)
+ if SdbManager.is_target_offline(errs):
+ raise DevNotFoundErr("None")
+
+ return True
+
+ @staticmethod
+ def hostCommandwithResult(command, timeout=90):
+ LOGGER.info(command)
+ try:
+ proc = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, \
+ stderr=subprocess.PIPE)
+ outs, errs = proc.communicate(timeout=timeout)
+ except subprocess.TimeoutExpired:
+ exc = sys.exc_info()
+ raise exc[1].with_traceback(exc[2])
+ except Exception:
+ exc = sys.exc_info()
+ raise exc[1].with_traceback(exc[2])
+
+ if outs:
+ outs = outs.decode(encoding="utf-8")
+ if errs:
+ errs = errs.decode("utf-8")
+
+ return outs
+
+ @staticmethod
+ def sdbCommand(command, timeout=90):
+ LOGGER.info(command)
+
+ outs = None
+ errs = None
+ proc = None
+ try:
+ proc = subprocess.Popen(command, \
+ shell=True, \
+ bufsize=0, \
+ stdin=subprocess.PIPE, \
+ stdout=subprocess.PIPE, \
+ stderr=subprocess.PIPE)
+ outs, errs = proc.communicate(timeout=timeout)
+ except subprocess.TimeoutExpired:
+ exc = sys.exc_info()
+ raise exc[1].with_traceback(exc[2])
+ except Exception:
+ exc = sys.exc_info()
+ raise exc[1].with_traceback(exc[2])
+
+ if outs:
+ outs = outs.decode("utf-8")
+ if errs:
+ errs = errs.decode("utf-8")
+
+ return outs, errs
+
+ @staticmethod
+ def _checkDevIdExists(_devid):
+ if len(_devid) < 0:
+ LOGGER.error("The '%s' device Id exists error" % _devid)
+ return False
+ return True
+
+ @staticmethod
+ def sdbPush(_devid, local, remote):
+ FAIL_LOG = "sdb -s %s push failed" % _devid
+ if SdbManager._checkDevIdExists(_devid) is False:
+ raise DevNotFoundErr(_devid)
+ if Constants.checkFileExists(local) is False:
+ LOGGER.warning("File exists error:%s" % local)
+ return False
+
+ push_cmd = Constants.SDB_PUSH % _devid + " " + local + " " + remote
+ outLog, errLog = SdbManager.sdbCommand(push_cmd)
+
+ if errLog:
+ LOGGER.error(FAIL_LOG)
+ LOGGER.error(str(errLog))
+ if SdbManager.is_target_offline(errLog):
+ raise DevNotFoundErr(_devid)
+ return False
+ if outLog:
+ LOGGER.info(str(outLog))
+ return True
+
+ @staticmethod
+ def sdbPull(_devid, remote, local):
+ FAIL_LOG = "sdb -s %s pull failed" % _devid
+ if SdbManager._checkDevIdExists(_devid) is False:
+ raise DevNotFoundErr(_devid)
+
+ rmtFileCheck_cmd = Constants.SDB_SHELL % _devid + " " \
+ + Constants.FILE_FOUND_SCRIPT % remote
+ outLog, errLog = SdbManager.sdbCommand(rmtFileCheck_cmd)
+
+ if errLog:
+ LOGGER.error(FAIL_LOG)
+ LOGGER.error(str(errLog))
+ if SdbManager.is_target_offline(errLog):
+ raise DevNotFoundErr(_devid)
+ return False
+ if outLog:
+ LOGGER.info(str(outLog))
+
+ pull_cmd = Constants.SDB_PULL % _devid + " " + remote + " " + local
+ outLog, errLog = SdbManager.sdbCommand(pull_cmd)
+
+ if errLog:
+ LOGGER.error(FAIL_LOG)
+ LOGGER.error(str(errLog))
+ return False
+ if outLog:
+ LOGGER.info(str(outLog))
+
+ if Constants.checkFileExists(local) is False:
+ return False
+ return True
+
+ @staticmethod
+ def sdbShell(_devid, cmd, timeout=90):
+ FAIL_LOG = "sdb -s %s shell failed" % _devid
+ if SdbManager._checkDevIdExists(_devid) is False:
+ raise DevNotFoundErr(_devid)
+
+ shell_cmd = Constants.SDB_SHELL % _devid + " " + cmd
+ outLog, errLog = SdbManager.sdbCommand(shell_cmd, timeout)
+
+ if errLog:
+ LOGGER.error(FAIL_LOG)
+ LOGGER.error(str(errLog))
+ if SdbManager.is_target_offline(errLog):
+ raise DevNotFoundErr(_devid)
+ return None
+ if outLog:
+ LOGGER.info(str(outLog))
+ return outLog
+
+ @staticmethod
+ def sdbRootOn(_devid):
+ FAIL_LOG = "sdb -s %s root on failed" % _devid
+ if SdbManager._checkDevIdExists(_devid) is False:
+ raise DevNotFoundErr(_devid)
+ root_cmd = Constants.SDB_ROOT_ON % _devid
+ outLog, errLog = SdbManager.sdbCommand(root_cmd, 20)
+
+ if errLog:
+ LOGGER.error(FAIL_LOG)
+ LOGGER.error(str(errLog))
+ if SdbManager.is_target_offline(errLog):
+ raise DevNotFoundErr(_devid)
+ return False
+ if outLog:
+ LOGGER.info(str(outLog))
+
+ checkLog = SdbManager.sdbShell(_devid, 'whoami')
+ if checkLog and checkLog.find('root') != -1:
+ LOGGER.info('root on')
+ else:
+ LOGGER.error(FAIL_LOG)
+
+ @staticmethod
+ def sdbDevices():
+ FAIL_LOG = "sdb devices failed"
+ dev_cmd = Constants.SDB_DEVICES
+ outLog, errLog = SdbManager.sdbCommand(dev_cmd, 5)
+
+ if errLog:
+ LOGGER.error(FAIL_LOG)
+ LOGGER.error(str(errLog))
+ return None
+ if outLog:
+ LOGGER.info(str(outLog))
+ return outLog
+
+ @staticmethod
+ def getCapabilityBack(deviceId, tizenVer):
+ remote = Constants.getDEVICE_CAPABILITY_PATH(tizenVer)
+ local = Constants.LOCAL_CAPABILITY_PATH % deviceId
+ return SdbManager.sdbPull(deviceId, remote, local)
+
+ @staticmethod
+ def recoveryDevice(_tizenV, _deviceid):
+ if _tizenV:
+ tinycmd = "python " + Constants.DEVICE_HEALTH_CMD % _tizenV + \
+ " --check --proc=tinyweb --deviceid=" + _deviceid
+ stubcmd = "python " + Constants.DEVICE_HEALTH_CMD % _tizenV + \
+ " --check --proc=testkit-stub --deviceid=" + _deviceid
+ outLog, errLog = SdbManager.sdbCommand(tinycmd)
+ if errLog: LOGGER.error(str(errLog))
+ if outLog: LOGGER.info(str(outLog))
+
+ outLog, errLog = SdbManager.sdbCommand(stubcmd)
+ if errLog: LOGGER.error(str(errLog))
+ if outLog: LOGGER.info(str(outLog))
+
+ @staticmethod
+ def checkDirExist(_devid, _dirname):
+ lscmd = "ls -al " + _dirname
+ outLog = SdbManager.sdbShell(_devid, lscmd)
+ if outLog and outLog.find("No such file or directory") > -1:
+ return False
+ elif outLog is None:
+ return False
+ return True
+
+ @staticmethod
+ def findDumpPath(_devid):
+ find_cmd = "sdb -s %s shell cat /etc/tizen-platform.conf | grep TZ_SYS_CRASH_ROOT" % _devid
+ outLog, errLog = SdbManager.sdbCommand(find_cmd)
+
+ if not outLog:
+ return None
+
+ result = outLog.split('\n')
+ LOGGER.debug(str(result))
+ if len(result) < 2:
+ LOGGER.error("Cannot parsing Crash dump path")
+ return None
+ else:
+ crash_root = result[0].split('=')[1].strip()
+ dump = result[1].split('=')[1].replace('${TZ_SYS_CRASH_ROOT}', '').strip()
+ return crash_root + dump
+
+ @staticmethod
+ def resetDumpFiles(_devid):
+ dumpPath = SdbManager.findDumpPath(_devid)
+ if dumpPath is None:
+ return False
+ if SdbManager.checkDirExist(_devid, dumpPath):
+ rmcmd = "rm -f " + dumpPath + "/*"
+ SdbManager.sdbShell(_devid, rmcmd)
+
+ @staticmethod
+ def deleteDumpFiles(_devid, dump_files):
+ dumpPath = SdbManager.findDumpPath(_devid)
+ if dumpPath is None:
+ return False
+ if SdbManager.checkDirExist(_devid, dumpPath):
+ for file in dump_files:
+ rmcmd = "rm -f " + dumpPath + "/" + file
+ SdbManager.sdbShell(_devid, rmcmd)
+
+ @staticmethod
+ def exportDumpFiles(_devid, _resultDir):
+ dumpPath = SdbManager.findDumpPath(_devid)
+ if dumpPath is None:
+ return False
+ isExist = SdbManager.checkDirExist(_devid, dumpPath)
+ if isExist:
+ if not os.path.exists(_resultDir):
+ os.makedirs(_resultDir)
+ chk_crash_mgr_cmd = "ps -ef | grep -v grep | grep crash-manager"
+ while True:
+ outs = SdbManager.sdbShell(_devid, chk_crash_mgr_cmd)
+ if outs is None:
+ break
+ else:
+ wait_time = 10
+ for loop in range(wait_time):
+ LOGGER.info("Waiting for crash-manager {0}...".\
+ format(wait_time - loop))
+ time.sleep(1)
+
+ remote = dumpPath
+ res = SdbManager.sdbPull(_devid, remote, _resultDir)
+ if res:
+ dump_files = []
+ for file in os.listdir(_resultDir):
+ dump_files.append(file)
+ return dump_files
+ else:
+ LOGGER.error("Not Found crash dump directory : %s" % dumpPath)
+
+ @staticmethod
+ def is_target_offline(log):
+ if log:
+ if str(log).find('target not found') > -1 or \
+ str(log).find('target offline') > -1:
+ return True
+ else:
+ return False
+ return False
--- /dev/null
+#!/usr/bin/python
+
+import os
+import configparser
+import string
+import json
+
+from .logmanager import LOGGER
+from .sdbmanager import SdbManager
+from .constants import Constants
+from xml.etree import ElementTree
+
+class Guider:
+ _conf_prompts = []
+ deviceIds = []
+
+ def __init__(self, plan, deviceIds=None):
+ if deviceIds is None:
+ self.deviceIds = [plan.getDeviceId()]
+ else:
+ self.deviceIds = deviceIds
+ self.deviceId = self.deviceIds[0]
+ self.tizenVer = plan.getTizenVersion()
+ self.stubPort = plan.getStubPort()
+ self.manual_items = {}
+ self.conf_items = {}
+ self.suites = {}
+
+ for suite in plan.getSuites():
+ self.suites[suite.getSuiteName()] = suite
+
+ self.conf_file = Constants.PRE_CONF_HOST_INI % self.deviceId
+
+ def init_items(self):
+ self._fill_items()
+ self._read_conf()
+ self.read(self.conf_file)
+
+ def read(self, filename):
+ LOGGER.debug("reading %s file" % filename)
+ try:
+ fp = open(filename)
+ except IOError:
+ LOGGER.warning("open file fail...")
+
+ self._read(fp, filename)
+ fp.close()
+
+ def _read(self, fp, fpname):
+ lineno = 0
+ comment = None;
+ prompts = []
+ while True:
+ line = fp.readline()
+ if not line:
+ break
+ lineno = lineno + 1
+ # comment or blank line?
+ if line.strip() == '':
+ continue
+ if line.split(None, 1)[0].lower() == 'rem' and line[0] in "rR":
+ # no leading whitespace
+ continue
+ if line[0] in '#;':
+ comment = line;
+ continue
+ if line[0] in '[':
+ comment = None;
+ continue
+ if line.find('='):
+ linelist = line.split('=')
+ prompts.append((linelist[0], comment))
+ self._conf_prompts = prompts
+
+ def _read_conf(self):
+ parser = configparser.ConfigParser()
+ parser.read(self.conf_file)
+ for section in parser.sections():
+ if not section:
+ continue
+ opts = {}
+ for n, v in parser.items(section):
+ if n:
+ opts[n] = v
+ self.conf_items[section] = opts
+
+ def _fill_items(self):
+ command = "cat " + Constants.PRE_CONF_HOST_XML % self.deviceId
+ result = SdbManager.hostCommandwithResult(command)
+ if result is None :
+ LOGGER.warning("Obtain tct_testconfig content error...")
+ self._exit(0)
+
+ xml_tree = ElementTree.fromstring(result)
+
+ for set in ElementTree.Element.findall(xml_tree, "suite/set"):
+ module_name = ElementTree.Element.get(set, "name", None)
+ if module_name:
+ descs = []
+ for desc in ElementTree.Element.findall(set, "testcase/description/steps/step/step_desc"):
+ if desc is not None:
+ descs.append(desc.text)
+ self.manual_items[module_name] = descs
+
+ def is_update_config(self, pkg_name):
+ #if self.conf_items.has_key(pkg_name):
+ if pkg_name in self.conf_items:
+ return True
+ return False
+
+ def get_confs(self, pkg_name):
+ return self.conf_items.get(pkg_name)
+
+ def _update_portenv(self):
+ #read json
+ for devId in self.deviceIds:
+ if os.path.isfile(Constants.PORT_CONF_HOST_JSON % devId) :
+ fread = open(Constants.PORT_CONF_HOST_JSON % devId, "r")
+ port_data = json.loads(fread.read())
+ fread.close()
+
+ port_data[0]['STUB_PORT'] = self.stubPort
+ fwrite = open(Constants.PORT_CONF_HOST_JSON % devId,"w")
+ json.dump(port_data, fwrite,indent = 4)
+ fwrite.close()
+ else :
+ LOGGER.warning("Not Found %s config file" % Constants.PORT_CONF_HOST_JSON % devId)
+ raise
+
+ def setup_manual_env(self):
+ self._show_manual_setup()
+ self._show_overall_infos()
+ self._update_json()
+ self._push_preconfigure()
+ if self.tizenVer.find("native") > -1:
+ self._update_txt()
+ self._push_tc_config()
+
+ def setup_default_env(self):
+ self._update_portenv()
+ self._push_portconfigure()
+
+ def _push_preconfigure(self):
+ for devId in self.deviceIds:
+ local = Constants.PRE_CONF_HOST_JSON % devId
+ remote = Constants.getTCT_PRE_CONF_DEVICE_JSON(self.tizenVer)
+ SdbManager.sdbPush(devId, local, remote)
+
+ def _push_portconfigure(self):
+ for devId in self.deviceIds:
+ local = Constants.PORT_CONF_HOST_JSON % devId
+ remote = Constants.getTCT_PORT_CONF_DEVICE_JSON(self.tizenVer)
+ SdbManager.sdbPush(devId, local, remote)
+
+ def _push_tc_config(self):
+ for devId in self.deviceIds:
+ local = Constants.NAT_CONF_HOST_TXT % devId
+ remote = Constants.NAT_CONF_DEVICE_TXT
+ SdbManager.sdbPush(devId, local, remote)
+
+ def _filter_suits(self, items):
+ keys = set()
+ if self.suites and items:
+ suit_keys = set(self.suites.keys())
+ item_keys = set(items.keys())
+ keys = keys|(suit_keys & item_keys)
+ return list(keys)
+
+ def _show_manual_setup(self):
+ keys = self._filter_suits(self.manual_items)
+ if not keys:
+ LOGGER.debug("No any pre-configure to be configured.")
+ return
+
+ LOGGER.info("\nHi,guys, before the start, there are some pre-configures must be provided,"
+ "and you just should input (Y)es or simply press Enter if your test environment "
+ "has met the request, otherwise, please input (N)o and the program will exit.")
+
+ LOGGER.info("Device Id : %s " % str(self.deviceIds))
+
+ for module in keys:
+ descs = self.manual_items.get(module)
+ if descs:
+ LOGGER.info("")
+ LOGGER.info("Module: %s" % module)
+ LOGGER.info("")
+ i = 1
+ for desc in descs:
+ LOGGER.info('(%r) %s' % (descs.index(desc) + 1, desc))
+ i += i
+ result = True
+ while result:
+ answer = input("\nHave you set the device as descriped above? [Yes/No]: ")
+ if answer and (answer.lower() == "no" or answer.lower() == "n"):
+ LOGGER.warning("\nYour environment can't meet the test's request. Exit...")
+ self._exit(0)
+ if answer and (answer.lower() == "yes" or answer.lower() == "y"):
+ result = False
+ LOGGER.info("")
+
+ def _show_overall_infos(self):
+ keys = self._filter_suits(self.conf_items)
+ if not keys:
+ LOGGER.debug("No conf params are needed here.")
+ return
+
+ LOGGER.info("Overall needed configure is as below, please confirm:\n")
+ index = 1
+ for k,p in self._conf_prompts:
+ for pkg in keys:
+ v = self._get_value(pkg, k)
+ if v is not None:
+ LOGGER.info ('{i}. {p}'.format(i = index, p = p))
+ LOGGER.info('{0: <30}{v}'.format(k + ":", v = v))
+ index += 1
+ LOGGER.info("\nIf needed, please update %s file. " % (Constants.PRE_CONF_HOST_INI % str(self.deviceIds)))
+ result = True
+ while result:
+ next_step = input("Continue to run test? [Yes/No]: ")
+ if next_step and (next_step.lower() == "n" or next_step.lower() == "no"):
+ self._exit(0)
+ if next_step and (next_step.lower() == "yes" or next_step.lower() == "y"):
+ result = False
+ LOGGER.info("OK! All is well. Let's go ahead...")
+
+ def _exit(self, code=None):
+ LOGGER.info("Bye-bye ^_^")
+ if code is None:
+ code = 0
+ raise
+
+ def _get_value(self, section, opt):
+ #if self.conf_items.has_key(section):
+ if section in self.conf_items:
+ vs = self.conf_items.get(section)
+ #if vs and vs.has_key(opt.lower()):
+ if vs and opt.lower() in vs:
+ return vs.get(opt.lower())
+ return None
+
+ def _update_json(self):
+ for devId in self.deviceIds:
+ self._read_conf()
+ list = []
+ dic = {}
+ for value in self.conf_items.values():
+ for k,v in value.items():
+ dic[k.upper()] = v
+ list.append(dic)
+ fp = open(Constants.PRE_CONF_HOST_JSON % devId,"w")
+ json.dump(list, fp,indent = 4)
+
+ def _update_txt(self):
+ for devId in self.deviceIds:
+ self._read_conf()
+ dic = {}
+
+ tc_conf_file = open(Constants.NAT_CONF_HOST_TXT % devId, "w")
+ for value in self.conf_items.values():
+ for k,v in value.items():
+ dic[str.upper(k)] = v
+
+ for k, v in dic.items():
+ tc_conf_file.write(k+"="+v+"\n")
+
+ tc_conf_file.close()
+
--- /dev/null
+#!/usr/bin/python
+
+import shutil
+import os
+import datetime
+
+from multiprocessing import Lock
+
+from .constants import Constants
+from .sdbmanager import SdbManager
+from .logmanager import LOGGER
+from .exception import DevNotFoundErr
+
+
+class MultiRunnPlan(object):
+ INSTANCE = None
+ runningPlans = {}
+ _observers = []
+
+ def __init__(self):
+ self._observers = []
+ if MultiRunnPlan.INSTANCE is not None:
+ raise Exception('A TestSingleton instance already exists')
+
+ @classmethod
+ def getInstance(cls):
+ if cls.INSTANCE is None:
+ cls.INSTANCE = MultiRunnPlan()
+ return cls.INSTANCE
+
+ def attach(self, observer):
+ if not observer in self._observers:
+ self._observers.append(observer)
+ else:
+ LOGGER.debug("The observer already exists")
+
+ def detach(self, observer):
+ if observer in self._observers:
+ self._observers.remove(observer)
+ else:
+ LOGGER.debug("[DEBUG] The observer does not exist")
+
+ def notify(self):
+ LOGGER.debug(" MultiRunnPlan Notify ")
+ for observer in self._observers:
+ observer.update()
+
+ #param string plan id
+ #param TctShellPlan plan
+ def addPlan(self, planid, plan):
+ if planid:
+ self.runningPlans[planid] = plan
+ else:
+ self.runningPlans['test'] = plan
+
+ #return int
+ def getPlansSize(self):
+ return len(self.runningPlans)
+
+ def removePlans(self, plans):
+ for plan in plans:
+ self.runningPlans.pop(plan.name, None)
+
+ def clearPlans(self):
+ self.runningPlans.clear()
+
+ #return dictionary
+ def getPlanDict(self):
+ return self.runningPlans
+
+ #Param TctShellPlan
+ #return bool
+ def isSelectedDevAvailable(self, plan):
+ currDevId = plan.getDeviceId()
+ runnDevs = self.getRunnDevice()
+ for rDev in runnDevs:
+ if rDev == currDevId:
+ LOGGER.debug("%s currently occupied with other plans." \
+ % currDevId)
+ return False
+
+ LOGGER.debug("%s is now available" % currDevId)
+ return True
+
+ #return String[]
+ def getRunnDevice(self):
+ runDev = []
+ for rplan in self.runningPlans.values():
+ if rplan.isRunning() == True:
+ runDev.append(rplan.getDeviceId())
+ return runDev
+
+ def printRunnPlan(self):
+ for rplan in self.runningPlans.values():
+ LOGGER.debug("Name : %s , isStart : %s" \
+ % (rplan.getPlanName(), rplan.isRunning()))
+
+ def setCurrPlanRunning(self, plan):
+ currPlanName = plan.getPlanName()
+ for rPlan in self.runningPlans.values():
+ if rPlan.getPlanName() == currPlanName:
+ rPlan.setRunning(True)
+ return True
+ return False
+
+
+class TctShellPlan:
+ resultFolderPath = ""
+ isRun = False
+ isFinish = False
+ isRerun = False
+
+ #PARAM name = Full_web_mobile#1(primary key)
+ #PARAM deviceid = '0000d81b00006200'
+ #PARAM profile = 'mobile' or 'wearable' or 'tv'
+ #PARAM executeType = ExecuteType class
+ #PARAM suites = TctShellSuite []
+ #PARAM tizenVer = 'tizen_web_2.4'
+ #PARAM resultFolderPath = '/opt/tct/tizen_web_2.4/shell/result/'
+ #PARAM stubPort = 8000
+ def __init__(self, name, devmgr, deviceId, profile, executeType, suites, \
+ tizenVer, resultFolderPath, stubPort=8000, scen_name=None):
+ self.suites = []
+ self.name = name
+ self.devmgr = devmgr
+ self.deviceId = deviceId
+ self.buildId = None
+ self.profile = profile
+ self.executeType = executeType
+ self.unpass = None
+ self.scen_name = scen_name
+ for suite in suites:
+ LOGGER.info("List: suite's name = %s" % str(suite.getSuiteName()))
+ self.suites.append(suite)
+ self.tizenVer = tizenVer
+ self.resultFolderPath = resultFolderPath
+ self.expectedTime = 0
+ self.scen_resultFolderPath = None
+ self.stubPort = stubPort
+ self.planLock = Lock()
+ if self.resultFolderPath is None:
+ folderName = self.name + "_" + \
+ datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S.%f')
+ self.resultFolderPath = Constants.RESULT_FOLDER \
+ % (self.tizenVer, folderName)
+
+ def acquire(self):
+ self.planLock.acquire(True)
+
+ def release(self):
+ self.planLock.release()
+
+ def addExpectedTime(self, etime):
+ self.expectedTime += etime
+
+ def addSuite(self, suite):
+ self.suites.append(suite)
+
+ def getPlanName(self):
+ return self.name
+
+ def getProfile(self):
+ return self.profile
+
+ def getSuites(self):
+ return self.suites
+
+ def getDeviceId(self):
+ return self.deviceId
+
+ def setDeviceId(self, deviceId):
+ self.acquire()
+ if self.deviceId is None:
+ LOGGER.debug("plan [%s] now has device ID [%s]" \
+ % (self.getPlanName(), deviceId))
+ self.deviceId = deviceId
+ self.release()
+
+ def getBuildId(self):
+ if not self.buildId:
+ dev = self.devmgr.getDevice(self.deviceId)
+ if dev:
+ self.buildId = dev.getDeviceBuildId()
+
+ return self.buildId
+
+ def isRunning(self):
+ return self.isRun
+
+ def setRunning(self, run):
+ self.isRun = run
+
+ def isFinished(self):
+ return self.isFinish
+
+ def isReRunning(self):
+ return self.isRerun
+
+ def setRerunning(self, rerun):
+ self.isRerun = rerun
+
+ def getExecuteType(self):
+ return self.executeType
+
+ def getStubPort(self):
+ return self.stubPort
+
+ def getTizenVersion(self):
+ return self.tizenVer
+
+ def setFinished(self):
+ self.isFinish = True
+ MRP_i = MultiRunnPlan.getInstance()
+ MRP_i.notify()
+
+ def getUnpass(self):
+ return self.unpass
+
+ def setUnpass(self, unpass):
+ if self.unpass is None or self.unpass == False:
+ self.unpass = unpass
+
+ def getResultFolderPath(self):
+ '''
+ self.acquire()
+ if self.resultFolderPath is None:
+ LOGGER.error("make result dir path============")
+ folderName = self.name + "_" + \
+ datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S.%f')
+ self.resultFolderPath = Constants.RESULT_FOLDER \
+ % (self.tizenVer, self.getBuildId(), folderName)
+ self.release()
+ '''
+ return self.resultFolderPath
+
+ #info get Tmp Folder path in device
+ #return String
+ def getDevTctTmpPath(self):
+ return Constants.getDEVICE_SUITE_TARGET(self.tizenVer) + "tmp/"
+
+ def getScenName(self):
+ return self.scen_name
+
+ def setScenResultFolderPath(self, path):
+ self.scen_resultFolderPath = path
+
+ def getScenResultFolderPath(self):
+ self.acquire()
+ if not self.scen_resultFolderPath and self.getScenName():
+ folderName = "scenario_" + self.getScenName() + '_' \
+ + datetime.datetime.now().strftime('%Y-%m-%d_%H:%M:%S.%f')
+ self.scen_resultFolderPath = Constants.RESULT_FOLDER \
+ % (self.tizenVer, self.getBuildId(), folderName)
+ self.release()
+ return self.scen_resultFolderPath
+
+ def setup_distribute(self):
+ self.devmgr.loadDeviceList()
+ runningDevs = self.devmgr.getSdbDeviceList()
+ if len(runningDevs) < 1:
+ LOGGER.error("No device connected for distribute mode")
+ return False
+ LOGGER.info("Plan [%s] will be distributed to %d devices: %s" \
+ % (self.name, len(runningDevs), \
+ str([dev.devId for dev in runningDevs])))
+ self.deviceId = None
+ self.sortSuites()
+ return True
+
+ def sortSuites(self):
+ sorted_suites = []
+ suites = self.getSuites()
+ connection_suite = None
+ for suite in suites:
+ suite_name = suite.getSuiteName()
+ if suite_name == 'tct-connection-native-utc':
+ connection_suite = suite
+ continue
+
+ autoCount = int(suite.getAutoNum())
+ category = suite.category
+ if category and category.find('Runtime') > -1:
+ etime = autoCount * (Constants.SUITE_TEST_EXPECTED_TIME + 2)
+ else:
+ etime = (autoCount * 2) + Constants.SUITE_TEST_EXPECTED_TIME
+
+ suite.setExpectedTime(etime)
+ sorted_suites.append(suite)
+ sorted_suites.sort(key=lambda x: x.expectedTime, reverse=True)
+ if connection_suite:
+ sorted_suites.append(connection_suite)
+
+ self.suites = sorted_suites
+
+
+class TctShellSuite:
+ #PARAM suiteName = 'tct-capability-tests'
+ #PARAM tcName = 'caps_displayresolution'
+ #PARAM auto_num = 12
+ #PARAM manual_num = 15
+ #PARAM suite_pkg_name = 'common/tct-capability-tests-2.4.zip'
+ #PARAM launcher = 'WRTLauncher'
+ #PARAM category = 'Compliance'
+ #PARAM tizenV = 'tizen_web_2.4'
+ def __init__(self, suiteName, tcName, auto_num, manual_num, \
+ suite_pkg_name, launcher, category, tizenV, skip_count, skip_tc, \
+ devmgr, pre_test, post_test, is_make_ne=0):
+ self.suiteName = suiteName
+ self.tcName = tcName
+ self.auto_num = auto_num
+ self.manual_num = manual_num
+ self.suite_pkg_name = suite_pkg_name
+ self.launcher = launcher
+ #category can be None
+ self.category = category
+ self.tizenV = tizenV
+ self.expectedTime = 0
+ self.runErrorStatus = False
+ self.noAuto = False
+ self.noManual = False
+ self.skip_count = skip_count
+ self.skip_tc = skip_tc
+ self.devmgr = devmgr
+ self.pre_test = pre_test
+ self.post_test = post_test
+ self.is_make_ne = is_make_ne
+
+ def _liteCommand(self, deviceId, resultFolder, extype, \
+ tcName, isRerun, stubPort, isSkip=None, reverse_tests=None):
+ lcmd = ""
+ if self.tizenV and \
+ (self.tizenV.find("web") > -1 or self.tizenV.find("csharp") > -1):
+ lcmd += Constants.LITE_CMD2 + " "
+ else:
+ lcmd += Constants.LITE_CMD1 + " "
+
+ # -- priority
+ if Constants.PRIORITY_VALUE:
+ lcmd += Constants.PRIORITY
+
+ lcmd += Constants.LITE_DEVICE_PARAM + " "
+
+ if isSkip:
+ lcmd += 'None' + " "
+ elif self.is_make_ne != 0:
+ lcmd += 'NE:{}_{}'.format(str(self.is_make_ne), \
+ str(deviceId)) + " "
+ else:
+ lcmd += str(deviceId) + " "
+
+ if isRerun:
+ lcmd += Constants.LOCAL_PRE
+ lcmd += os.path.join(resultFolder, \
+ self.suiteName + Constants.RERUN_SUFFIX) + " "
+ elif reverse_tests is not None:
+ lcmd += Constants.LOCAL_PRE
+ lcmd += reverse_tests + " "
+ else:
+ if self.tizenV.find('csharp') > -1 or self.tizenV.find('web') > -1 or deviceId is None:
+ lcmd += Constants.LOCAL_PRE
+ lcmd += (Constants.LOCAL_SHELL_TEMP_PATH % deviceId)
+ lcmd += "opt/" + self.suiteName + "/"
+ lcmd += Constants.DEVICE_SUITE_DEF + " "
+ else:
+ lcmd += Constants.DEVICE_PRE
+ lcmd += Constants.getDEVICE_SUITE_FOLDER(self.tizenV)
+ lcmd += self.suiteName + "/"
+ lcmd += Constants.DEVICE_SUITE_DEF + " "
+
+ lcmd += extype.toLiteParam() + " "
+ lcmd += Constants.LITE_NON_ACTIVE_PARAM + " "
+
+ if tcName is not None:
+ lcmd += Constants.TESTCASE_ID + " "
+ lcmd += tcName + " "
+
+ lcmd += "--tizen-version" + " "
+ lcmd += self.tizenV + " "
+
+ lcmd += "--stub-port" + " "
+ lcmd += str(stubPort) + " "
+
+ if self.skip_tc:
+ lcmd += "--skip-tc "
+ for tc in self.skip_tc:
+ lcmd += str(tc)
+ lcmd += " "
+
+ if self.tizenV and (self.tizenV.find("web") > -1 or self.tizenV.find('csharp') > -1):
+ lcmd += Constants.EXT_TYPE_PARAM + " "
+ lcmd += Constants.COMM_TYPE_PARAM + " "
+ lcmd += Constants.ENV_TYPE_PARAM + " "
+ else:
+ lcmd += Constants.LITE_E_PARAM + " "
+
+ if deviceId:
+ lcmd += Constants.LITE_CAPABILITY_PARAM + " "
+ lcmd += Constants.LOCAL_CAPABILITY_PATH % deviceId + " "
+
+ lcmd += Constants.LITE_OUTPUT_PARAM
+ lcmd += os.path.join(resultFolder, self.suiteName)
+
+ if isRerun:
+ if extype.getCurrType() == ExecuteType.e_manual:
+ lcmd += Constants.RERUN_MANUAL_RESULT_SUFFIX + " "
+ else:
+ lcmd += Constants.RERUN_AUTO_RESULT_SUFFIX + " "
+
+ lcmd += " --rerun"
+ else:
+ if extype.getCurrType() == ExecuteType.e_manual:
+ lcmd += Constants.MANUAL_RESULT_SUFFIX + " "
+ else:
+ lcmd += Constants.AUTO_RESULT_SUFFIX + " "
+
+ return lcmd
+
+ def executePlanAuto(self, deviceId, resultFolder, tcName, isRerun, \
+ stubport):
+ self.executePlaninLite(deviceId, resultFolder, ExecuteType('Auto'), \
+ tcName, isRerun, stubport)
+
+ def executePlanManual(self, deviceId, resultFolder, tcName, isRerun, \
+ stubport):
+ self.executePlaninLite(deviceId, resultFolder, ExecuteType('Manual'), \
+ tcName, isRerun, stubport)
+
+ def executePlaninLite(self, deviceId, resultFolder, exeType, tcName, \
+ isRerun, stubport):
+ exCmd = self._liteCommand(deviceId, resultFolder, exeType, tcName, \
+ isRerun, stubport)
+
+ isPass = True
+ if deviceId:
+ isPass = SdbManager.hostLiteCommand(exCmd, self.skip_count)
+ else:
+ SdbManager.hostRecLiteCommand(exCmd)
+ return None
+
+ if isPass is False:
+ cmd = ""
+ if self.tizenV.find("native") > -1 or self.tizenV.find("2.4") > -1:
+ tests = Constants.getDEVICE_TESTS_FILE(self.tizenV) % self.suiteName
+ cmd = "ps aux | grep 'python /opt/testkit/lite[0-9].[0-9]/testkit-lite -f device:%s'" % tests
+ else:
+ tests = Constants.LOCAL_SHELL_TEMP_PATH % deviceId + "opt/" + self.suiteName + "/tests.xml"
+ cmd = "ps aux | grep 'python /opt/testkit/lite[0-9].[0-9]/testkit-lite -f %s'" % tests
+
+ result = str(SdbManager.hostCommandwithResult(cmd))
+ grep_lines = result.split('\n')
+ for line in grep_lines:
+ if line and len(line) > 0 and line.find(self.suiteName) > -1:
+ proc_id = line.split()[1]
+ SdbManager.hostCommand('kill -9 %s' % proc_id)
+ if self.tizenV and (self.tizenV.find("web") > -1 or self.tizenV.find("csharp") > -1):
+ exCmd = self._liteCommand(deviceId, resultFolder, exeType, tcName, \
+ isRerun, stubport, True)
+ SdbManager.hostRecLiteCommand(exCmd)
+ else:
+ reverse_tests = self._naitve_installSuiteinHost()
+ exCmd = self._liteCommand(deviceId, resultFolder, exeType, tcName, \
+ isRerun, stubport, True, reverse_tests)
+ SdbManager.hostRecLiteCommand(exCmd)
+ LOGGER.error("[skip package : %s]" % self.suiteName)
+ break
+
+ def _native_installSuiteinHost(self):
+ hostTmpFolder = Constants.LOCAL_SHELL_TEMP_PATH % None
+ localSuitePath = Constants.SUITES_REPOSITORY \
+ % self.tizenV + self.suite_pkg_name
+ self._installSuiteinHost(None, localSuitePath, hostTmpFolder)
+ tmp_suite = hostTmpFolder + "opt/" + self.suiteName + "/tests.xml"
+ return tmp_suite
+
+ def getSuitePackageName(self):
+ return self.suite_pkg_name
+
+ def getSuiteName(self):
+ return self.suiteName
+
+ def getSuiteZipName(self):
+ suiteFile = self.suite_pkg_name.split('/')
+ return suiteFile[1]
+
+ def getSuiteFullPath(self):
+ return os.path.join(Constants.SUITES_REPOSITORY \
+ % self.tizenV, self.suite_pkg_name)
+
+ def checkExistSuiteFile(self):
+ return os.path.isfile(self.getSuiteFullPath())
+
+ def _fileCopy(self, src, destDir):
+ if not Constants.checkFileExists(src):
+ LOGGER.warning("The '%s' file exists error" % src)
+
+ if not os.path.exists(destDir):
+ os.makedirs(destDir, mode=0o777)
+
+ shutil.copy(src, destDir)
+
+ def getTestCase(self):
+ return self.tcName
+
+ def getAutoNum(self):
+ return self.auto_num
+
+ def getManualNum(self):
+ return self.manual_num
+
+ def getExpectedTime(self):
+ return self.expectedTime
+
+ def setExpectedTime(self, etime):
+ self.expectedTime = etime
+
+ def setRunErrorStatus(self, status):
+ self.runErrorStatus = status
+
+ def getNoAuto(self):
+ return self.noAuto
+
+ def getNoManual(self):
+ return self.noManual
+
+ def setNoAuto(self):
+ self.noAuto = True
+
+ def setNoManual(self):
+ self.noManual = True
+
+ def _sdb_recov(self, _devid):
+ LOGGER.error(_devid + " sdb disconnect")
+ self.devmgr.deleteFaultDevice(_devid)
+
+ def _installSuiteinHost(self, _devid, localSuitePath, hostTmpFolder):
+ if not os.path.exists(hostTmpFolder + "opt/" + self.suiteName \
+ + "/" + Constants.INSTALL_ZIP_W3):
+ # copy suite zip file
+ self._fileCopy(localSuitePath, hostTmpFolder)
+
+ # unzip suite zip file
+ unzip_cmd = Constants.UNZIP + " " + hostTmpFolder \
+ + self.getSuiteZipName() + " -d " + hostTmpFolder
+ SdbManager.hostCommand(unzip_cmd, 300)
+
+ if _devid:
+ try:
+ inst_cmd = "python " + hostTmpFolder + "opt/" + self.suiteName \
+ + "/" + Constants.INSTALL_ZIP_W3 + " -i -s " + _devid
+ SdbManager.hostCommand(inst_cmd, 300)
+ except DevNotFoundErr:
+ self._sdb_recov(_devid)
+ return False
+ except Exception:
+ return False
+
+ return True
+
+ def _installSuiteinTarget(self, _devid, localSuitePath, remoteTmpFolder):
+ try:
+ if not SdbManager.sdbPush(_devid, localSuitePath, remoteTmpFolder):
+ return False
+
+ unzip_cmd = Constants.UNZIP + " " + remoteTmpFolder \
+ + self.getSuiteZipName() + " -d " \
+ + remoteTmpFolder.replace("tmp/", "")
+
+ inst_cmd = remoteTmpFolder.replace("/tmp", "") + "opt/" \
+ + self.suiteName + "/" + Constants.INSTALL_ZIP_24
+
+ SdbManager.sdbShell(_devid, unzip_cmd, 300)
+ SdbManager.sdbShell(_devid, inst_cmd, 300)
+ except DevNotFoundErr:
+ self._sdb_recov(_devid)
+ return False
+ except Exception:
+ return False
+
+ return True
+
+ def installSuite(self, deviceId, remoteTmpFolder):
+ localSuitePath = Constants.SUITES_REPOSITORY \
+ % self.tizenV + self.suite_pkg_name
+ instResult = True
+
+ if self.tizenV.find("csharp") > -1 or \
+ self.tizenV.find("web") > -1 or deviceId is None:
+ hostTmpFolder = Constants.LOCAL_SHELL_TEMP_PATH % deviceId
+ instResult = self._installSuiteinHost(\
+ deviceId, localSuitePath, hostTmpFolder)
+ else:
+ instResult = self._installSuiteinTarget(\
+ deviceId, localSuitePath, remoteTmpFolder)
+
+ return instResult
+
+ def _unInstallSuiteInHost(self, _devid, hostTmpFolder):
+ suiteZipPath = hostTmpFolder + self.getSuiteZipName()
+ removeSuitezip = "rm -f " + suiteZipPath
+ SdbManager.hostCommand(removeSuitezip)
+
+ localSuitePath = Constants.SUITES_REPOSITORY % self.tizenV + self.suite_pkg_name
+ self._fileCopy(localSuitePath, hostTmpFolder)
+
+ unzip_cmd = Constants.UNZIP + " " + hostTmpFolder \
+ + self.getSuiteZipName() + " -d " + hostTmpFolder
+ SdbManager.hostCommand(unzip_cmd)
+
+ if _devid:
+ try:
+ unInstSuite = "python " + hostTmpFolder + "opt/" \
+ + self.suiteName + "/" + Constants.UNINSTALL_ZIP_W3 \
+ + " -s " + _devid
+ SdbManager.hostCommand(unInstSuite,300)
+ except DevNotFoundErr:
+ self._sdb_recov(_devid)
+ return False
+ except Exception:
+ return False
+
+ def _unInstallSuiteInTarget(self, _devid, remoteFolder):
+ try:
+ removeSuite = "rm -f " + remoteFolder + self.getSuiteZipName()
+ unInstSuite = remoteFolder.replace("/tmp", "") + "opt/" \
+ + self.suiteName + "/" + Constants.UNINSTALL_ZIP_24
+
+ SdbManager.sdbShell(_devid, removeSuite, 300)
+ SdbManager.sdbShell(_devid, unInstSuite, 300)
+ except DevNotFoundErr:
+ self._sdb_recov(_devid)
+ return False
+ except Exception:
+ return False
+
+ def runPreTestScript(self, _devid):
+ if self.pre_test:
+ LOGGER.debug("run pre-test script: {}".format(self.pre_test))
+ SdbManager.hostRecLiteCommand('bash {} {} {}'.format(self.pre_test, _devid, self.suiteName))
+
+
+ def runPostTestScript(self, _devid):
+ if self.post_test:
+ LOGGER.debug("run post-test script: {}".format(self.post_test))
+ SdbManager.hostRecLiteCommand('bash {} {} {}'.format(self.post_test, _devid, self.suiteName))
+
+ def unInstallSuite(self, deviceId, remoteFolder):
+ if self.tizenV.find("csharp") > -1 or self.tizenV.find("web") > -1 or deviceId is None:
+ hostTmpFolder = Constants.LOCAL_SHELL_TEMP_PATH % deviceId
+ self._unInstallSuiteInHost(deviceId, hostTmpFolder)
+ else:
+ self._unInstallSuiteInTarget(deviceId, remoteFolder)
+
+ def sdbCheckSuite(self, _devid, suiteName):
+ LOGGER.info("Entering checkSuiteExisted(String suiteName : %s)" \
+ % suiteName)
+ try:
+ if self.tizenV and float(self.tizenV.split('_')[-1]) >= 3.0:
+ rep_suiteName = suiteName.replace("tct-", "")
+ host_check_cmd = "su - owner -c \"app_launcher -l | grep %s\"" \
+ % rep_suiteName
+ output = SdbManager.sdbShell(_devid, host_check_cmd)
+ if output and output.find(rep_suiteName) > -1:
+ return True
+ else:
+ return False
+ else:
+ check_cmd = "wrt-launcher -l | grep " + suiteName
+ resultMsg = SdbManager.sdbShell(_devid, check_cmd)
+ if resultMsg and len(resultMsg) > 0:
+ return True
+ else:
+ return False
+ except DevNotFoundErr:
+ self._sdb_recov(_devid)
+ return False
+ except Exception:
+ return False
+
+
+class ExecuteType:
+ e_all = "All"
+ e_auto = "Auto"
+ e_manual = "Manual"
+
+ currType = ""
+
+ def __init__(self, extype):
+ self.currType = extype
+
+ @classmethod
+ def createExecuteType(self, extype):
+ executeType = None
+ if self.e_all.lower() == extype.lower():
+ executeType = ExecuteType(self.e_all)
+ elif self.e_auto.lower() == extype.lower():
+ executeType = ExecuteType(self.e_auto)
+ elif self.e_manual.lower() == extype.lower():
+ executeType = ExecuteType(self.e_manual)
+
+ return executeType
+
+ #return String
+ def toLiteParam(self):
+ if self.currType == self.e_auto:
+ return " -A"
+ elif self.currType == self.e_manual:
+ return " -M"
+ else:
+ return ""
+
+ #return String
+ def getCurrType(self):
+ return self.currType
--- /dev/null
+#!/usr/bin/python
+
+import threading
+import time
+from .shellplanner import *
+from .result_summary import ResultSummary
+from .logmanager import LOGGER
+from .sdbmanager import SdbManager
+
+
+class PlanExecutor(threading.Thread):
+ plan = None
+ autoworker = None
+ maualworker = None
+ thCounter = ""
+
+ #Param TctshellPlan
+ def __init__(self, plan, threadCounter, isPreconSet, devmgr):
+ LOGGER.debug("Creating PlanExecutor, with [plan]: " \
+ + plan.getPlanName())
+ self.plan = plan
+ threading.Thread.__init__(self)
+ self.name = plan.getPlanName()
+ self.tcCounter = threadCounter
+ self.threadLock = threading.Lock()
+ self.isPreconSet = isPreconSet
+ self.devmgr = devmgr
+
+ def run(self):
+ time.sleep(1)
+ LOGGER.debug("Starting PlanExecutor")
+
+ self.threadLock.acquire()
+ self.checkWorkerStatus()
+ LOGGER.debug("setStartTest()")
+ self.setStartTest()
+ self.threadLock.release()
+
+ exeType = self.plan.getExecuteType()
+ if exeType.getCurrType() == ExecuteType.e_auto:
+ self.autoworker = AutoSuiteWorker(self.plan, self.devmgr)
+ self.autoworker.auto_test()
+
+ elif exeType.getCurrType() == ExecuteType.e_manual:
+ self.manualworker = ManualSuiteWorker(self.plan)
+ self.manualworker.manual_test()
+
+ else:
+ self.autoworker = AutoSuiteWorker(self.plan, self.devmgr)
+ self.autoworker.auto_test()
+
+ self.manualworker = ManualSuiteWorker(self.plan)
+ self.manualworker.manual_test()
+
+ SdbManager.exportDumpFiles(self.plan.getDeviceId(), \
+ self.plan.getResultFolderPath() + "/dump/")
+
+ summary = ResultSummary(plans=[self.plan])
+ summary.genResults()
+ summary.genSummary()
+ self.setFinishedTest()
+
+ def checkWorkerStatus(self):
+ multiPlanIns = MultiRunnPlan.getInstance()
+ while True:
+ if multiPlanIns.isSelectedDevAvailable(self.plan):
+ break
+ else:
+ time.sleep(5)
+
+ def setStartTest(self):
+ multiPlanIns = MultiRunnPlan.getInstance()
+ multiPlanIns.setCurrPlanRunning(self.plan)
+
+ def setFinishedTest(self):
+ self.plan.setRunning(False)
+ self.plan.setFinished()
+
+
+class AutoSuiteWorker:
+ plan = None
+
+ def __init__(self, plan, devmgr):
+ self.plan = plan
+ self.deviceId = self.plan.getDeviceId()
+ self.devmgr = devmgr
+
+ def auto_test(self):
+ deviceId = self.deviceId
+ suites = self.plan.getSuites()
+ remTmpDir = self.plan.getDevTctTmpPath()
+ resultFolder = self.plan.getResultFolderPath()
+ isRerun = self.plan.isReRunning()
+ stubPort = self.plan.getStubPort()
+
+ for counter, suite in enumerate(suites):
+ if not self._checkDeviceStatus():
+ self._auto_test_inhost(suites[counter:])
+ break
+
+ if suite.getAutoNum() is None or int(suite.getAutoNum()) == 0:
+ suite.setNoAuto()
+ LOGGER.warning('Suite : %s , AutoNum : 0' \
+ % (suite.getSuiteName()))
+ continue
+
+ if suite.checkExistSuiteFile() == False:
+ LOGGER.error("The %s file Exist error" \
+ % suite.getSuiteFullPath())
+ continue
+ suiteName = suite.getSuiteName()
+ LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
+
+ LOGGER.info('Checking if the suite ' + suiteName \
+ + 'is installed already.')
+ if suite.sdbCheckSuite(deviceId, suiteName):
+ LOGGER.info('The suite ' + suiteName \
+ + ' is existed. uninstalling')
+ LOGGER.info('Uninstalling the existed suite ' + suiteName)
+ suite.unInstallSuite(deviceId, remTmpDir)
+
+ LOGGER.info('Uploading the suite ' + suiteName)
+ LOGGER.info('Installing the suite ' + suiteName)
+ suite.installSuite(deviceId, remTmpDir)
+ LOGGER.info('Executing the suite ' + suiteName \
+ + ' in testkit-lite.')
+ suite.executePlanAuto(deviceId, resultFolder, \
+ suite.getTestCase(), isRerun, stubPort)
+
+ LOGGER.info('removing the suite pkg file of the suite ' \
+ + suiteName)
+ LOGGER.info('Uninstalling the suite ' + suiteName)
+ suite.unInstallSuite(deviceId, remTmpDir)
+
+ LOGGER.info("Finished to execute all auto test-cases")
+
+ def _auto_test_inhost(self, suites):
+ deviceId = None
+ remTmpDir = self.plan.getDevTctTmpPath()
+ resultFolder = self.plan.getResultFolderPath()
+ isRerun = self.plan.isReRunning()
+ stubPort = self.plan.getStubPort()
+
+ for suite in suites:
+ if suite.getAutoNum() is None or int(suite.getAutoNum()) == 0:
+ suite.setNoAuto()
+ LOGGER.warning('Suite : %s , AutoNum : 0' \
+ % (suite.getSuiteName()))
+ continue
+
+ suiteName = suite.getSuiteName()
+ LOGGER.info('Uploading the suite ' + suiteName)
+ LOGGER.info('Installing the suite ' + suiteName)
+ suite.installSuite(deviceId, remTmpDir)
+ LOGGER.info('Executing the suite ' + suiteName \
+ + ' in testkit-lite.')
+ suite.executePlanAuto(deviceId, resultFolder, \
+ suite.getTestCase(), isRerun, stubPort)
+
+ LOGGER.info('removing the suite pkg file of the suite ' \
+ + suiteName)
+ LOGGER.info('Uninstalling the suite ' + suiteName)
+ suite.unInstallSuite(deviceId, remTmpDir)
+
+ LOGGER.debug("current suite Auto count : %s " % suite.getAutoNum())
+ LOGGER.info("Finished to execute auto suite: [%s]" % suiteName)
+
+ def _checkDeviceStatus(self):
+ time_waited = 0
+ reboot_tried = False
+ while True:
+ if not self.devmgr.isDeviceAvailable(self.deviceId):
+ if time_waited >= Constants.NO_WORKERS_TIMEOUT:
+ LOGGER.error("Rebooting timeout device : %s" \
+ % self.deviceId)
+ return False
+ if reboot_tried:
+ waiting_time = 10
+ else:
+ waiting_time = Constants.RECOVERY_TIME
+ LOGGER.error("Please reboot device : %s" % self.deviceId)
+ time.sleep(waiting_time)
+ time_waited += waiting_time
+ reboot_tried = True
+ else:
+ break
+ return True
+
+
+class ManualSuiteWorker:
+ plan = None
+
+ def __init__(self, plan):
+ self.plan = plan
+
+ def manual_test(self):
+ deviceId = self.plan.getDeviceId()
+ suites = self.plan.getSuites()
+ resultFolder = self.plan.getResultFolderPath()
+ remTmpDir = self.plan.getDevTctTmpPath()
+ isRerun = self.plan.isReRunning()
+ stubPort = self.plan.getStubPort()
+ for suite in suites:
+ if suite.getManualNum() is None or int(suite.getManualNum()) == 0:
+ suite.setNoManual()
+ LOGGER.warning('Suite : %s , ManualNum : 0' \
+ % (suite.getSuiteName()))
+ continue
+ if suite.checkExistSuiteFile() == False:
+ LOGGER.error("The %s file Exist error" % self.getSuiteFullPath)
+ continue
+ suiteName = suite.getSuiteName()
+ LOGGER.debug("current suite Manual count : %s " \
+ % suite.getManualNum())
+
+ LOGGER.info('Checking if the suite ' + suiteName \
+ + 'is installed already.')
+ if suite.sdbCheckSuite(deviceId, suiteName):
+ LOGGER.info('The suite ' + suiteName \
+ + ' is existed. uninstalling')
+ LOGGER.info('Uninstalling the existed suite ' + suiteName)
+ suite.unInstallSuite(deviceId, remTmpDir)
+
+ LOGGER.info('Uploading the suite ' + suiteName)
+ LOGGER.info('Installing the suite ' + suiteName)
+
+ suite.installSuite(deviceId, remTmpDir)
+ LOGGER.info('Executing the suite ' + suiteName \
+ + ' in testkit-lite.')
+ suite.executePlanManual(deviceId, resultFolder, \
+ suite.getTestCase(), isRerun, stubPort)
+
+ LOGGER.info('removing the suite pkg file of the suite ' \
+ + suiteName)
+ LOGGER.info('Uninstalling the suite ' + suiteName)
+ suite.unInstallSuite(deviceId, remTmpDir)
+
+ LOGGER.info("Finished to execute all manual test-cases")
--- /dev/null
+#!/usr/bin/python
+
+import os
+import sys
+import glob
+from optparse import *
+from .constants import Constants
+import xml.etree.ElementTree as etree
+from .shellplanner import ExecuteType
+from .devicemanager import DeviceManager
+from .logmanager import LOGGER
+
+
+#show all available suites
+def show_available_suites(option, opt_str, value, parser):
+ LOGGER.info("Test Suites:...\n")
+ repos = Constants.ALL_PROFILES
+ repos.append('common')
+ repos.append('common-iot')
+ os.chdir(Constants.TCT_HOME)
+ versions = sorted(glob.glob("tizen_*"))
+ for ver in versions:
+ LOGGER.info("version : %s" % ver)
+ for tp in repos:
+ LOGGER.info(" profile : %s" % tp)
+ if not os.path.isdir(Constants.SUITES_REPOSITORY % (ver) + tp):
+ continue
+ os.chdir(Constants.SUITES_REPOSITORY % (ver) + tp)
+ zips = sorted(glob.glob("*.zip"))
+ for files in zips:
+ #without ".zip"
+ LOGGER.info(" %s" % files[:-4])
+ sys.exit(1)
+
+
+def show_result_files():
+ os.chdir(Constants.TCT_HOME)
+ LOGGER.info("\n *Result Folder Absolute Path*")
+ versions = sorted(glob.glob("tizen_*"))
+ for ver in versions:
+ if not os.path.isdir("/opt/tct/%s/shell/result/" % ver):
+ continue
+ os.chdir("/opt/tct/%s/shell/result/" % ver)
+ buildids = sorted(glob.glob("*"))
+ for buildid in buildids:
+ if buildid == "latest" or buildid == "Untitled Folder":
+ continue
+ os.chdir(Constants.RESULT_REPO % (ver, buildid))
+ results = sorted(glob.glob("*"))
+ for result in results:
+ os.chdir(Constants.RESULT_REPO % (ver, buildid))
+ if not os.path.isdir(os.path.abspath(result)):
+ continue
+ LOGGER.info(" %s" % os.path.abspath(result))
+
+ LOGGER.info('')
+ sys.exit(1)
+
+
+def print_planfolder(option, opt_str, value, parser):
+ LOGGER.info("Shell plan folder path : \'%s\'" % Constants.TCT_PLAN_FOLDER)
+ ret = os.system("tree %s" % Constants.TCT_PLAN_FOLDER)
+ if ret:
+ LOGGER.error("The program \'tree\' is currently not installed. \
+You can install it by typing : apt-get install tree")
+ sys.exit(1)
+
+
+def print_resultfolder(option, opt_str, value, parser):
+ os.chdir(Constants.TCT_HOME)
+ for tizenV in glob.glob("tizen_*"):
+ resultFolder = (Constants.RESULT_REPO % (tizenV, ""))[:-1]
+ if os.path.isdir(resultFolder):
+ ret = os.system("tree -L 3 %s" % resultFolder)
+ if ret:
+ LOGGER.error("The program \'tree\' is currently not installed. \
+You can install it by typing : apt-get install tree")
+
+ show_result_files()
+ sys.exit(1)
+
+
+def invoke_sdb_devices(option, opt_str, value, parser):
+ os.system(Constants.SDB_DEVICES)
+ sys.exit(1)
+
+
+# version option
+def print_version(option, opt_str, value, parser):
+ LOGGER.info("TCTSHELL Version : %s " % Constants.TCT_VERSION)
+ sys.exit(0)
+
+
+def varnarg(option, opt_str, value, parser):
+ """ parser srg"""
+ value = []
+ import re
+ for arg in parser.rargs:
+ if re.search('^--.+', arg) or re.search('^-[\D]', arg):
+ break
+ value.append(arg)
+
+ del parser.rargs[:len(value)]
+ setattr(parser.values, option.dest, value)
+
+
+class IntentionType:
+ TestScenario = 0
+ TestPlan = 1
+ TestSuite = 2
+ TestCase = 3
+ AutoPlan = 4
+ DistPlan = 5
+ TestProfile = 6
+
+
+class ShellWrapper:
+ def __init__(self, devmgr):
+ self.devmgr = devmgr
+ self.running_mode = None
+ self.options = None
+ self.USAGE = "\n\
+ run examples: \n\
+ tct-shell --scenario <smoewhere>/scenario.xml\n\
+ tct-shell --testplan <somewhere>/testplan.xml\n\
+ tct-shell --test package1 package2 ... packageN\n\
+ tct-shell --test package1 --id caps_screenSizeNormal\n\
+ tct-shell --rerun-fail '<somewhere>/result_folder/\n\
+ \n\
+ show examples: \n\
+ tct-shell --help\n\
+ tct-shell --plan-list\n\
+ tct-shell --result-list\n\
+ tct-shell --device-lite\n\
+ tct-shell --all-suites\n\
+ \n\
+ Note: \n\
+ 1) Proxy settings should be disabled when execute webapi packages\n\
+ 2) run command 'tct-shell', it might not be able to locate related module, \n\
+ run command 'export PYTHONPATH=/usr/lib/python2.7/site-packages' to resolve this issue"
+
+ def print_usage(self):
+ print (self.USAGE)
+
+ def parse_options(self, argv):
+ option_list = [
+ make_option("--scenario", "-s", dest="scenario_file", \
+ action="callback", callback=varnarg, \
+ help="Specify the scenario.xml as the test plan."),
+ make_option("--testplan", "-p", dest="testplan_file", \
+ action="callback", callback=varnarg, \
+ help="Specify the testplan.xml as the test plan."),
+ make_option("--profile", "-f", dest="profile", action="callback", \
+ callback=varnarg, help="Specify testing profile. [mobile,wearable,tv]"),
+ make_option("--test", "-t", dest="suites", action="callback", \
+ callback=varnarg, help="Specify testing suites. If more than one suite is provided, list them all and separate them with whitespace"),
+ make_option("--id", dest="testcase_id", action="callback", \
+ callback=varnarg, help="Specify the ID of a test case to run"),
+ make_option("--rerun-fail", dest="fail_result_xml", \
+ action="callback", callback=varnarg,
+ help="Rerun all failed test cases, according to the specified XML."),
+ make_option("--distribute", dest="dist_mode",action="callback", callback=varnarg, \
+ help="Specify the testplan.xml for distributing a plan to multiple devices"),
+ make_option("--all", "-A", dest="all_tc", action="store_true", \
+ help="All test cases will be executed."),
+ make_option("--manual", "-M", dest="only_manual", \
+ action="store_true", help="Only manual test cases will be executed"),
+ make_option("--tizen-version", dest="tizenversion", \
+ action="callback", callback=varnarg, \
+ help="Specify the name of tizen-version. The tizen-version is defined in the local repository. and its path is '/opt/tct/'"),
+ make_option("--stub-port", dest="stubport", action="callback", \
+ callback=varnarg, help="Specify a port number. Network port used by the testkit-stub"),
+ make_option("--deviceid", "-d", dest="deviceid", \
+ action="callback", callback=varnarg, \
+ help="Set sdb device serial information."),
+ make_option("--dbutedevid", dest="dbutedevid", action="callback", callback=varnarg, help="Set sdb device serial information for distribute mode"),
+ make_option("--disable", dest="disable_preconfigure", action="store_false", default=True, help="disable the function of pre_configure"),
+ make_option("--output", "-o", dest="resultfile", \
+ action="callback", callback=varnarg,
+ help="Specify the output file for result XML. If more than one test xml file provided, results will be merged into this outputfile"),
+ make_option("--timeout", dest="run_timeout", action="callback", \
+ callback=varnarg, help="Set the end time of test (unit : minute"),
+ make_option("--skip-package", dest="skip_package", action="callback", \
+ callback=varnarg, help="Specify the package names for exclude from the test"),
+ make_option("--make-ne", dest="make_ne", action="callback", \
+ callback=varnarg, help="Spectify the package names for make NE of results"),
+ make_option("--skip-count", dest="skip_count", action="callback", \
+ callback=varnarg, help="Specify the fail/block/na count. The test is terminated when the same skip-count value and fail/block/na count on the result"),
+ make_option("--skip-tc", dest="skip_tc", action="callback", \
+ callback=varnarg, help="Specify the testcase id for exclude from the test"),
+ make_option("--version", dest="version_info", action="callback", \
+ callback=print_version, help="Show version information"),
+ make_option("--all-suites", dest="show_suites", \
+ action="callback", callback=show_available_suites,
+ help="Show all available test-suites in the local repository \'/opt/tct/\'"),
+ make_option("--plan-list", dest="show_plan_folder", \
+ action="callback", callback=print_planfolder,
+ help="List all existed plans in the Plan directory. The plan directory is defined in the configuration file named CONFIG, and its path is :'/opt/tools/shell/CONFIG'"),
+ make_option("--result-list", dest="show_all_result", \
+ action="callback", callback=print_resultfolder,
+ help="List all history results in the result directory. and its path is :'/opt/tct/{tizen-version}/shell/result/'"),
+ make_option("--device-list", dest="show_all_device", \
+ action="callback", callback=invoke_sdb_devices, \
+ help="List all connected devices. just same with 'sdb devices'"),
+ make_option("--log", "-l", dest="loglevel", action="callback", callback=varnarg,
+ help="Set Log level. Logs that are less severe than the level will be ignored. Log levels (in descending severity order): [CRITICAL, ERROR, WARNING, NOTSET, INFO, DEBUG]"),
+ make_option("--make-summary", dest="makesummary",\
+ action="callback", callback=varnarg, help="Specify the result folder. When the test is not abnomally terminated. you can create summary file use to this option"),
+ make_option("--tracking-dump", dest="trackingdump", action="callback", callback=varnarg,
+ help="Specify the file(dump) names expected (for distribute run mode). After tracking the file(dump) generated by test and exits the tct-shell tool"),
+ make_option("--pre-test", dest="pre_test", action="callback", \
+ callback=varnarg, help="Before running suite, run a given script before installing testsuite."),
+ make_option("--post-test", dest="post_test", action="callback", \
+ callback=varnarg, help="After running suite, run a given script before uninstalling testsuite.")
+ ]
+
+ # detect non-params
+ if len(argv) == 1:
+ argv.append("--help")
+
+ PARSERS = OptionParser(option_list=option_list, usage=self.USAGE)
+ (self.options, args) = PARSERS.parse_args()
+
+ #set log level (has to be done first to dislay logs)
+ if self.check_log_level():
+ if self.options.loglevel is None:
+ LOGGER.setLevel(Constants.LOG_LEVELS[Constants.DEFAULT_LOG_LEVEL])
+ else:
+ LOGGER.setLevel(Constants.LOG_LEVELS[self.options.loglevel[0]])
+
+ if self.is_dist_mode():
+ conflicts = ["--distribute"]
+ if self.options.deviceid is not None:
+ conflicts.append("--deviceid")
+ self.conflict_exit(conflicts)
+ Constants.setDistMode(True)
+
+ if self.is_testplan_mode():
+ conflicts = ["--testplan"]
+ if self.options.scenario_file is not None:
+ conflicts.append("--scenario")
+ if self.options.fail_result_xml is not None:
+ conflicts.append("--rerun-fail")
+ if self.options.profile is not None:
+ conflicts.append("--profile")
+ if self.options.suites is not None:
+ conflicts.append("--test")
+ if self.options.testcase_id is not None:
+ conflicts.append("--id")
+ self.conflict_exit(conflicts)
+ self.running_mode = Constants.RUNNING_MODE_PLAN
+
+ elif self.is_scenario_mode():
+ conflicts = ["--scenario"]
+ if self.options.dist_mode is not None:
+ conflicts.append("--distribute")
+ if self.options.fail_result_xml is not None:
+ conflicts.append("--rerun-fail")
+ if self.options.profile is not None:
+ conflicts.append("--profile")
+ if self.options.suites is not None:
+ conflicts.append("--test")
+ if self.options.testcase_id is not None:
+ conflicts.append("--id")
+ if self.options.deviceid is not None:
+ conflicts.append("--deviceid")
+ if self.options.makesummary is not None:
+ conflicts.append("--make-summary")
+ self.conflict_exit(conflicts)
+ self.running_mode = Constants.RUNNING_MODE_SCEN
+ Constants.setScenMode(True)
+
+ elif self.is_fail_rerun_mode():
+ conflicts = ["--rerun-fail"]
+ if self.options.profile is not None:
+ conflicts.append("--profile")
+ if self.options.suites is not None:
+ conflicts.append("--test")
+ if self.options.testcase_id is not None:
+ conflicts.append("--id")
+ if self.options.makesummary is not None:
+ conflicts.append("--make-summary")
+ self.conflict_exit(conflicts)
+ self.running_mode = Constants.RUNNING_MODE_RERUN
+ Constants.setRerunMode(True)
+ elif self.is_profile_mode():
+ conflicts = ["--profile"]
+ if self.options.suites is not None:
+ conflicts.append("--test")
+ if self.options.testcase_id is not None:
+ conflicts.append("--id")
+ self.conflict_exit(conflicts)
+ self.running_mode = Constants.RUNNING_MODE_PROFILE
+ elif self.is_suite_mode():
+ conflicts = ["--test"]
+ if self.options.profile is not None:
+ conflicts.append("--profile")
+ self.running_mode = Constants.RUNNING_MODE_SUITES
+
+ if self.options.all_tc and self.options.only_manual:
+ conflicts = ["--all", "--manual"]
+ self.conflict_exit(conflicts)
+
+ self.check_args_number()
+ self.check_args_exist()
+
+ if not self.options.tizenversion and not self.is_scenario_mode() and not self.is_fail_rerun_mode():
+ LOGGER.error("The default tizen version could not be set.")
+ conflicts = ["--tizen-version"]
+ conflicts.append(None)
+ self.conflict_exit(conflicts)
+
+ def conflict_exit(self, conflicts):
+ if conflicts == None or len(conflicts) <= 1:
+ return
+
+ os.system("tct-shell -h")
+ LOGGER.error("\ntct-shell: Conflicted options: %s" % conflicts)
+ raise
+
+ def check_args_exist(self):
+ opt = ""
+ if self.running_mode == Constants.RUNNING_MODE_PLAN and len(self.options.testplan_file) > 0:
+ if not Constants.checkFileExists(self.options.testplan_file[0]):
+ opt = "--testplan"
+ elif self.running_mode == Constants.RUNNING_MODE_SCEN and len(self.options.scenario_file) > 0:
+ if not Constants.checkFileExists(self.options.scenario_file[0]):
+ opt = "--scenario"
+ elif self.running_mode == Constants.RUNNING_MODE_RERUN and len(self.options.fail_result_xml) > 0:
+ if not Constants.checkFileExists(self.options.fail_result_xml[0]):
+ opt = "--rerun-fail"
+
+ if self.options.tizenversion and len(self.options.tizenversion) > 0:
+ if not self.check_tizen_version():
+ opt = "--tizen-version"
+
+ if self.options.stubport and len(self.options.stubport) > 0:
+ if not self.check_stub_port():
+ opt = "--stub-port"
+
+ if self.options.run_timeout and len(self.options.run_timeout) > 0:
+ if not self.check_run_timeout():
+ opt = "--timeout"
+
+ if self.options.skip_package and len(self.options.skip_package) > 0:
+ if not self.check_skip_package():
+ opt = "--skip-package"
+
+ if self.options.skip_count and len(self.options.skip_count) > 0:
+ if not self.check_skip_count():
+ opt = "--skip-count"
+
+ if self.options.skip_tc and len(self.options.skip_tc) > 0:
+ if not self.check_skip_tc():
+ opt = "--skip-tc"
+
+ if self.options.makesummary and len(self.options.makesummary) > 0:
+ if not self.check_makesummary():
+ opt = "--make-summary"
+
+ if self.options.trackingdump and len(self.options.trackingdump) > 0:
+ if not self.check_tracking_dump():
+ opt = "--tracking-dump"
+ if self.options.make_ne and len(self.options.make_ne) > 0:
+ if not self.check_make_ne():
+ opt = "--make-ne"
+ if self.options.pre_test and len(self.options.pre_test) > 0:
+ if not self.check_pre_test():
+ opt = "--pre-test"
+ if self.options.post_test and len(self.options.post_test) > 0:
+ if not self.check_post_test():
+ opt = "--post-test"
+
+ if len(opt) > 0:
+ os.system("tct-shell -h")
+ LOGGER.error("\ntct-shell: error: \"%s\" option requires a proper argument" % opt)
+ raise
+
+ def check_args_number(self):
+ opt = ""
+ if self.running_mode == Constants.RUNNING_MODE_PLAN and len(self.options.testplan_file) < 1:
+ opt = "--testplan"
+ elif self.running_mode == Constants.RUNNING_MODE_SCEN and len(self.options.scenario_file) < 1:
+ opt = "--scenario"
+ elif self.running_mode == Constants.RUNNING_MODE_RERUN and len(self.options.fail_result_xml) < 1:
+ opt = "--rerun-fail"
+ elif self.running_mode == Constants.RUNNING_MODE_PROFILE and len(self.options.profile) < 1:
+ opt = "--profile"
+ elif self.running_mode == Constants.RUNNING_MODE_SUITES and len(self.options.suites) < 1:
+ opt = "--test"
+ elif self.options.deviceid is not None and len(self.options.deviceid) < 1:
+ opt = "--deviceid"
+ elif self.options.testcase_id is not None and len(self.options.testcase_id) < 1:
+ opt = "--id"
+ elif self.options.tizenversion is not None and len(self.options.tizenversion) < 1:
+ opt = "--tizen-version"
+ elif self.options.stubport is not None and len(self.options.stubport) < 1:
+ opt = "--stub-port"
+ elif self.options.run_timeout is not None and len(self.options.run_timeout) < 1:
+ opt = "--timeout"
+ elif self.options.skip_package is not None and len(self.options.skip_package) < 1:
+ opt = "--skip-package"
+ elif self.options.skip_count is not None and len(self.options.skip_count) < 1:
+ opt = "--skip-count"
+ elif self.options.skip_tc is not None and len(self.options.skip_tc) < 1:
+ opt = "--skip-tc"
+ elif self.options.makesummary is not None and len(self.options.makesummary) < 1:
+ opt = "--make-summary"
+ elif self.options.trackingdump is not None and len(self.options.trackingdump) < 1:
+ opt = "--tracking-dump"
+ elif self.options.make_ne is not None and len(self.options.make_ne) < 1:
+ opt = "--make-ne"
+
+ if len(opt) > 0:
+ os.system("tct-shell -h")
+ LOGGER.error("\ntct-shell: error: \"%s\" option requires an argument" % opt)
+ raise
+
+ def check_log_level(self):
+ if self.options.loglevel is not None:
+ if len(self.options.loglevel) < 1:
+ os.system("tct-shell -h")
+ LOGGER.error("\ntct-shell: error: \"--log\" option requires an argument")
+ raise
+ else:
+ if not self.options.loglevel[0].upper() in ['NOTSET', 'CRITICAL', 'ERROR', 'WARNING', 'INFO', 'DEBUG']:
+ os.system("tct-shell -h")
+ LOGGER.error("\ntct-shell: error: \"--log\" option requires a proper argument.")
+ raise
+
+ return True
+
+ def check_tizen_version(self):
+ tizenversion = self.options.tizenversion[0]
+ if not Constants.checkFileExists(Constants.TCT_HOME + tizenversion):
+ LOGGER.error("A required \'/opt/tct/" + tizenversion + "\' could not be found.")
+ return False
+ else:
+ Constants.set_default_tizenV(tizenversion)
+ return True
+
+ def check_stub_port(self):
+ port = self.options.stubport[0]
+ portLen = len(port)
+ return port.isdigit() and (portLen > 3 and portLen < 6)
+
+ def check_run_timeout(self):
+ timeout = self.options.run_timeout[0]
+ timeoutLen = len(timeout)
+ return timeout.isdigit() and timeoutLen > 0
+
+ def check_skip_package(self):
+ packages = self.options.skip_package[0]
+ packLen = len(packages)
+ return packLen > 0
+
+ def check_skip_count(self):
+ count = self.options.skip_count[0]
+ countLen = len(count)
+ return count.isdigit() and countLen > 0
+
+ def check_skip_tc(self):
+ tc = self.options.skip_tc[0]
+ tcLen = len(tc)
+ return tcLen > 0
+
+ def check_tracking_dump(self):
+ dump_names = self.options.trackingdump[0]
+ dump_names_len = len(dump_names)
+ return dump_names_len > 0
+
+ def check_makesummary(self):
+ return os.path.exists(self.options.makesummary[0])
+
+ def check_make_ne(self):
+ packages = self.options.make_ne[0]
+ packLen = len(packages)
+ return packLen > 0
+
+ def check_pre_test(self):
+ script = self.options.pre_test[0]
+ return os.path.isfile(script)
+
+ def check_post_test(self):
+ script = self.options.post_test[0]
+ return os.path.isfile(script)
+
+ def getIntentionType(self):
+ if self.options.scenario_file is not None:
+ return IntentionType.TestScenario
+ elif self.options.testplan_file is not None:
+ return IntentionType.TestPlan
+ elif self.options.testcase_id is not None:
+ return IntentionType.TestCase
+ elif self.options.suites is not None:
+ return IntentionType.TestSuite
+ elif self.options.profile is not None:
+ return IntentionType.TestProfile
+ return -1
+
+ def get_scenfile(self):
+ return self.options.scenario_file[0]
+
+ def get_planfile(self):
+ if self.is_testplan_mode():
+ return self.options.testplan_file[0]
+
+ def get_profile(self):
+ return self.options.profile[0]
+
+ def get_result_for_rerun(self):
+ return self.options.fail_result_xml[0]
+
+ def get_plan_name(self):
+ plan_name = ""
+ if self.is_testplan_mode():
+ plan_name = os.path.basename(self.get_planfile())[:-4]
+ return plan_name
+
+ def get_scen_name(self):
+ if self.is_scenario_mode():
+ return os.path.basename(self.get_scenfile())[:-4]
+
+ def get_stubPort(self):
+ if self.options.stubport is None:
+ return '8000'
+ else:
+ return self.options.stubport[0]
+
+ def get_run_timeout(self):
+ if self.options.run_timeout is None:
+ return 1440 #24 hour
+ else:
+ return self.options.run_timeout[0]
+
+ def get_makesummarydir(self):
+ return self.options.makesummary[0]
+
+ def get_resultFolderPath(self):
+ if (self.options.resultfile is not None) and (self.options.resultfile[0] is not None):
+ return self.options.resultfile[0]
+
+ def get_deviceId(self):
+ self.devmgr.loadDeviceList()
+ devices = self.devmgr.getSdbDeviceList()
+ if self.options.deviceid:
+ for dev in devices:
+ if dev.devId == self.options.deviceid[0]:
+ return self.options.deviceid[0]
+ LOGGER.error("Error! [%s] device is not connected" % self.options.deviceid[0])
+ raise
+ elif not self.is_scenario_mode() and not self.is_make_summary_mode():
+ if len(devices) < 1:
+ LOGGER.error("No device is connected")
+ raise Exception('Device connection is required')
+ if len(devices) == 1:
+ LOGGER.info("Executing in device : %s" % devices[0].getDeviceId())
+ return devices[0].getDeviceId()
+ elif len(devices) > 1:
+ LOGGER.info("Connected Devices: ...\n")
+ for dev in devices:
+ dev._printDevInfo()
+ devId = input("Choose device id : ")
+ while not devId in [dev.getDeviceId() for dev in devices]:
+ devId = input("Invalid device id!\n\nChoose device id : \n")
+ LOGGER.info("Executing in device : %s" % devId)
+ return devId
+
+ def get_profile_name(self):
+ plan_file = None
+ profile_name = None
+ if self.is_testplan_mode():
+ plan_file = self.get_planfile()
+ if plan_file:
+ tree = etree.parse(plan_file)
+ root = tree.getroot()
+ if root.get('profile') is not None:
+ profile_name = root.get('profile')
+ return profile_name
+
+ def get_execute_type(self):
+ exe_t = None
+ if self.options.all_tc:
+ exe_t = ExecuteType.createExecuteType("All")
+ elif self.options.only_manual:
+ exe_t = ExecuteType.createExecuteType("Manual")
+ else:
+ exe_t = ExecuteType.createExecuteType("Auto")
+ return exe_t
+
+ def get_tizenV(self):
+ if (self.options.tizenversion is not None) and (self.options.tizenversion[0] is not None):
+ return self.options.tizenversion[0]
+
+ def _chooseProfile(self, path_suites):
+ suite_profiles = {}
+ for suite_path in path_suites:
+ suite_zipname = os.path.basename(suite_path)
+ sprofile = os.path.basename(os.path.dirname(suite_path))
+ if not suite_zipname in suite_profiles:
+ suite_profiles[suite_zipname] = []
+ suite_profiles[suite_zipname].append(sprofile)
+ for suiteName, suiteProfile in suite_profiles.items():
+ suite_name = "-".join(suiteName[:-4].split("-")[:-1])
+ if len(suiteProfile) == 1:
+ suite_profiles[suiteName] = suiteProfile[0]
+ continue
+ LOGGER.info("Multiple profiles for [%s] :" % suite_name)
+ for profile_i in suiteProfile:
+ LOGGER.info(" - %s" % profile_i)
+ suite_profile = None
+ while not suite_profile in suiteProfile:
+ suite_profile = input("\nChoose profile: ")
+ suite_profiles[suiteName] = suite_profile
+ return suite_profiles
+
+ def get_suites(self):
+ suites = []
+ filtered_suites = []
+ suite_repo = Constants.SUITES_REPOSITORY % self.get_tizenV()
+ if self.options.suites:
+ for suite_name in self.options.suites:
+ for profiles in os.listdir(suite_repo):
+ if profiles == "pkg_infos":
+ continue
+ for package in glob.glob(suite_repo + profiles + "/*.zip"):
+ if package.find(suite_name) > -1:
+ suites.append(package)
+ if (len(suites) < 1):
+ LOGGER.error("Error! [%s] suite does not exists" % suite_name)
+
+ suite_profiles = self._chooseProfile(suites)
+ check_profile = None
+ multiProfiles = False
+ for suiteName, suiteProfile in suite_profiles.items():
+ if suiteProfile != 'common':
+ if check_profile is not None and check_profile != suiteProfile:
+ multiProfiles = True
+ if check_profile is None:
+ check_profile = suiteProfile
+ filtered_suites.append(os.path.join(suite_repo, suiteProfile, suiteName))
+ if multiProfiles:
+ LOGGER.warning("WARNING: Multiple suites run with different profiles")
+ return filtered_suites
+
+ def get_profile_suites(self):
+ suites = []
+ suite_repo = Constants.SUITES_REPOSITORY % self.get_tizenV()
+ sel_profile = self.get_profile()
+ for profiles in os.listdir(suite_repo):
+ if profiles == "pkg_infos":
+ continue
+ if profiles in sel_profile or profiles == "common":
+ for package in sorted(glob.glob(suite_repo + profiles + "/*.zip")):
+ suites.append(os.path.join(suite_repo, profiles, package))
+
+ if len(suites) == 0:
+ LOGGER.error('Not found test suites')
+ return None
+
+ return suites
+
+ def get_testcase_id(self):
+ tc_id = ""
+ if self.options.testcase_id is not None:
+ #tc_id = " --id %s" % self.options.testcase_id[0] + " --debug"
+ tc_id = self.options.testcase_id[0]
+ return tc_id
+
+ def get_inst_suites(self):
+ suites = []
+ if self.options.instsuites:
+ for suite_str in self.options.instsuites:
+ suite_str_array = suite_str.split(" ")
+ for suite_name in suite_str_array:
+ suites.append(suite_name)
+ return suites
+
+ def get_uninst_suites(self):
+ suites = []
+ if self.options.uninstsuites:
+ for suite_str in self.options.uninstsuites:
+ suite_str_array = suite_str.split(" ")
+ for suite_name in suite_str_array:
+ suites.append(suite_name)
+ return suites
+
+ def get_running_mode(self):
+ return self.running_mode
+
+ def get_skip_package(self):
+ if self.options.skip_package is not None:
+ return self.options.skip_package
+
+ def get_skip_count(self):
+ if (self.options.skip_count is not None) and (self.options.skip_count[0] is not None):
+ return self.options.skip_count[0]
+
+ def get_skip_tc(self):
+ if self.options.skip_tc is not None:
+ return self.options.skip_tc
+
+ def get_tracking_dump(self):
+ if (self.options.trackingdump is not None) and (self.options.trackingdump[0] is not None):
+ return self.options.trackingdump[0]
+
+ def get_make_ne(self):
+ if self.options.make_ne is not None:
+ return self.options.make_ne
+
+ def get_pre_test(self):
+ if self.options.pre_test is not None:
+ return self.options.pre_test[0]
+
+ def get_post_test(self):
+ if self.options.post_test is not None:
+ return self.options.post_test[0]
+
+ def is_testplan_mode(self):
+ return self.options.testplan_file is not None
+
+ def is_scenario_mode(self):
+ return self.options.scenario_file is not None
+
+ def is_profile_mode(self):
+ return self.options.profile
+
+ def is_single_mode(self):
+ return self.options.testcase_id is not None
+
+ def is_enable_preconf_func(self):
+ return self.options.disable_preconfigure
+
+ def is_update_portconf_func(self):
+ return self.options.stubport is not None
+
+ def is_suite_mode(self):
+ return self.options.suites is not None
+
+ def is_fail_rerun_mode(self):
+ return self.options.fail_result_xml is not None
+
+ def is_make_summary_mode(self):
+ return self.options.makesummary is not None
+
+ def is_dist_mode(self):
+ return self.options.dist_mode is not None
+
+ def get_output_param(self):
+ return "-o %s" % self.get_output_file_name()
+
+ def fetch_logs(self, executors):
+ logs = {}
+ for executor in executors:
+ if executor.name == 'ResultManager':
+ continue
+ plan = executor.plan
+ scenFolder = plan.getScenResultFolderPath()
+ planFolder = plan.getResultFolderPath()
+ if not scenFolder in logs:
+ logs[scenFolder] = {}
+ if not planFolder in logs[scenFolder]:
+ logs[scenFolder][planFolder] = []
+ logs[scenFolder][planFolder].append(\
+ os.path.join(Constants.TCT_LOG_FOLDER, 'MainProcess.log'))
+ logs[scenFolder][planFolder].append(\
+ os.path.join(Constants.TCT_LOG_FOLDER, 'critical.log'))
+ logs[scenFolder][planFolder].append(\
+ os.path.join(Constants.TCT_LOG_FOLDER, 'debug.log'))
+ logs[scenFolder][planFolder].append(\
+ os.path.join(Constants.TCT_LOG_FOLDER, 'error.log'))
+ logs[scenFolder][planFolder].append(\
+ os.path.join(Constants.TCT_LOG_FOLDER, 'info.log'))
+ logs[scenFolder][planFolder].append(\
+ os.path.join(Constants.TCT_LOG_FOLDER, 'warning.log'))
+
+ if hasattr(executor, 'all_dev_threads'):
+ for autoPlanExecutor in executor.all_dev_threads:
+ logs[scenFolder][planFolder].append(\
+ os.path.join(Constants.TCT_LOG_FOLDER, '%s.log' % \
+ autoPlanExecutor.name))
+
+ logs[scenFolder][planFolder].append(\
+ os.path.join(Constants.TCT_LOG_FOLDER, 'E_%s.log' % \
+ autoPlanExecutor.name))
+
+ for scenFolder, plan_logs in logs.items():
+ for planFolder, thread_logs in plan_logs.items():
+ for src_logs in thread_logs:
+ Constants.move_log_file(src_logs, planFolder)
+ if scenFolder is not None and os.path.isdir(scenFolder):
+ Constants.move_log_file(src_logs, scenFolder)
+ #Constants.move_log_file(os.path.join(Constants.TCT_LOG_FOLDER, 'ResultManager.log'), planFolder)
+ #Constants.move_log_file(os.path.join(Constants.TCT_LOG_FOLDER, 'MainThread.log'), planFolder)
+ if scenFolder is not None and os.path.isdir(scenFolder):
+ pass
+ #Constants.move_log_file(os.path.join(Constants.TCT_LOG_FOLDER, 'ResultManager.log'), scenFolder)
+ #Constants.move_log_file(os.path.join(Constants.TCT_LOG_FOLDER, 'MainThread.log'), scenFolder)
+
+
+ def getDbuteDevIds(self):
+ return self.options.dbutedevid
+
+ def get_distribute_count(self):
+ if self.options.dist_mode and len(self.options.dist_mode) > 0:
+ return self.options.dist_mode[0]
--- /dev/null
+#!/usr/bin/python
+import os
+import configparser
+from multiprocessing import Process
+
+from .devicemanager import DeviceManager
+from .sdbmanager import SdbManager
+from .logmanager import LOGGER
+from .constants import Constants
+
+
+class TestEnvironment(Process):
+
+ tizenVer = None
+ deviceId = None
+
+ def __init__(self, tizenVer, deviceId, isPreconSet, queue, devmgr):
+ Process.__init__(self)
+ self.tizenVer = tizenVer
+ self.deviceId = deviceId
+ self.name = "E_{}".format(deviceId)
+ self.isPreconSet = isPreconSet
+ self.queue = queue
+ self.devmgr = devmgr
+
+ def run(self):
+ if not self.isPreconSet:
+ SdbManager.sdbRootOn(self.deviceId)
+ self._isDeviceReady()
+ if self.isPreconSet:
+ self._reset_health_res_indevice()
+
+ if not self._isHealthCheckPassed():
+ self.queue.put('Fail_Healthcheck')
+ return
+
+ if not self._isPreconfigPassed():
+ self.queue.put('Fail_Preconfig')
+ return
+
+ if not self._extractDeviceCapability():
+ self.queue.put('Fail_ExtractDeviceCapability')
+ return
+
+ #SdbManager.resetDumpFiles(self.deviceId)
+
+ def _isDeviceReady(self):
+ if self.deviceId:
+ return self.devmgr.isDeviceAvailable(self.deviceId)
+ else:
+ if self.devmgr.getDeviceSize() == 1:
+ return True
+ else:
+ LOGGER.error("No device is connected, \
+ please check or try to reconnect it again")
+ return False
+
+ def _reset_health_res_indevice(self):
+ tctDir = Constants.getDEVICE_SUITE_TARGET(self.tizenVer)
+
+ delsuitedir_cmd = "rm -rf " + tctDir + "opt/*"
+ deltmpdir_cmd = "rm -rf " + tctDir + "tmp/*"
+
+ SdbManager.sdbShell(self.deviceId, delsuitedir_cmd)
+ SdbManager.sdbShell(self.deviceId, deltmpdir_cmd)
+
+ def _read_health_check_ini(self):
+ parser = configparser.ConfigParser()
+ if not os.path.exists(\
+ Constants.HEALTH_CHECK_FILE_PATH % self.tizenVer):
+ LOGGER.warning("Can`t find the healthcheck.ini file...")
+ return
+
+ parser.read(Constants.HEALTH_CHECK_FILE_PATH % self.tizenVer)
+ for section in parser.sections():
+ if not section:
+ continue
+ values = []
+ for n, v in parser.items(section):
+ values.append(v.split(","))
+ return values
+
+ def _isHealthCheckPassed(self):
+ healtlist = self._read_health_check_ini()
+ if not healtlist:
+ return False
+ for l in healtlist:
+ if self.tizenVer.find("native") > -1 and l[1].find("tinyweb") > -1:
+ continue
+
+ getcap = ""
+ if self.tizenVer.find("native") > -1 and l[1].find("getCap") > -1:
+ getcap = "ngetCap"
+ else:
+ getcap = l[1].strip()
+
+ command = "python " + \
+ (Constants.DEVICE_HEALTH_CMD % self.tizenVer) \
+ + " " + "--deviceid " + self.deviceId \
+ + " --check" + " --procid=" + getcap
+ try:
+ outLog, errLog = SdbManager.sdbCommand(command, 180)
+ except Exception as ex:
+ LOGGER.error(str(ex))
+ return False
+ '''
+ if exit_code is None:
+ LOGGER.error("The device configuration \
+ is not right [Health Check : %s]." % l)
+ return False
+ '''
+ LOGGER.info(str(outLog))
+ if str(outLog).find('#ERROR#') > -1 or \
+ str(outLog).find('#WARNING#') > -1:
+ LOGGER.error(l[0].strip() + ": fail")
+ return False
+ else:
+ LOGGER.info(l[0].strip() + ": pass")
+ LOGGER.info("Return From isHealthCheckPassed, return value : True")
+ return True
+
+ def _extractDeviceCapability(self):
+ capa_file = Constants.LOCAL_CAPABILITY_PATH % self.deviceId
+ LOGGER.debug('capability path : %s' % capa_file)
+ if os.path.exists(capa_file):
+ os.remove(capa_file)
+
+ if not SdbManager.getCapabilityBack(self.deviceId, self.tizenVer):
+ LOGGER.error('Fail to extract the capability.xml from device : ' \
+ + Constants.getDEVICE_CAPABILITY_PATH(self.tizenVer))
+ return False
+
+ return True
+
+ def _isPreconfigPassed(self):
+ SdbManager.sdbPull(self.deviceId, \
+ Constants.getPRE_CONF_DEVICE_INI(self.tizenVer), \
+ Constants.PRE_CONF_HOST_INI % self.deviceId)
+ if Constants.checkFileExists(\
+ Constants.PRE_CONF_HOST_INI % self.deviceId) is False:
+ LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
+ % Constants.PRE_CONF_HOST_INI % self.deviceId)
+ return False
+
+ SdbManager.sdbPull(self.deviceId, \
+ Constants.getPRE_CONF_DEVICE_JSON(self.tizenVer), \
+ Constants.PRE_CONF_HOST_JSON % self.deviceId)
+ if Constants.checkFileExists(\
+ Constants.PRE_CONF_HOST_JSON % self.deviceId) is False:
+ LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
+ % Constants.PRE_CONF_HOST_JSON % self.deviceId)
+ return False
+
+ SdbManager.sdbPull(self.deviceId, \
+ Constants.getPRE_CONF_DEVICE_XML(self.tizenVer), \
+ Constants.PRE_CONF_HOST_XML % self.deviceId)
+ if Constants.checkFileExists(\
+ Constants.PRE_CONF_HOST_XML % self.deviceId) is False:
+ LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
+ % Constants.PRE_CONF_HOST_XML % self.deviceId)
+ return False
+
+ SdbManager.sdbPull(self.deviceId, \
+ Constants.getPORT_CONF_DEVICE_JSON(self.tizenVer), \
+ Constants.PORT_CONF_HOST_JSON % self.deviceId)
+ if Constants.checkFileExists(\
+ Constants.PORT_CONF_HOST_JSON % self.deviceId) is False:
+ LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
+ % Constants.PORT_CONF_HOST_JSON % self.deviceId)
+ return False
+
+ SdbManager.sdbPull(self.deviceId, \
+ Constants.getDEVICE_BUILD_INFO_PATH(self.tizenVer), \
+ Constants.LOCAL_BUILD_INFO_PATH % self.deviceId)
+ if Constants.checkFileExists(Constants.LOCAL_BUILD_INFO_PATH % \
+ self.deviceId) is False:
+ LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
+ % Constants.LOCAL_BUILD_INFO_PATH % self.deviceId)
+ return False
+
+ if self.tizenVer and self.tizenVer.find("native") > -1:
+ SdbManager.sdbPull(self.deviceId, \
+ Constants.getNAT_CONF_DEVICE_TXT(self.tizenVer), \
+ Constants.NAT_CONF_HOST_TXT % self.deviceId)
+ if Constants.checkFileExists(Constants.NAT_CONF_HOST_TXT \
+ % self.deviceId) is False:
+ LOGGER.error("The %s file does not exist. [ Preconfig Check]" \
+ % Constants.LOCAL_BUILD_INFO_PATH % self.deviceId)
+ return False
+
+ LOGGER.info("Return from isPreconfigPassed, return value : True")
+ return True
--- /dev/null
+#!/usr/bin/python
+import os
+import timeit
+from time import sleep
+tctshell_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+os.chdir(tctshell_path)
+
+plan_file = '/opt/tools/shell/plan/S_mobile_plan.xml'
+plan_file2 = '/opt/tools/shell/plan/2.4_mobileF.xml'
+
+start_plan = timeit.default_timer()
+os.system("./tct-shell -p %s --tizen-version tizen_web_2.4 -l DEBUG --disable" %plan_file2)
+stop_plan = timeit.default_timer()
+
+start_distribute = timeit.default_timer()
+os.system("./tct-shell --distribute %s --tizen-version tizen_web_2.4 -l DEBUG --disable" %plan_file2)
+stop_distribute = timeit.default_timer()
+
+start_autoplan = timeit.default_timer()
+#os.system('./tct-shell --autoplan %s --tizen-version tizen_web_2.4 -l DEBUG --disable' %plan_file2)
+stop_autoplan = timeit.default_timer()
+
+
+plan_time = stop_plan - start_plan
+autoplan_time = stop_autoplan - start_autoplan
+distribute_time = stop_distribute - start_distribute
+
+print "-"*50
+
+print "\nTest Plan Mode: %d\nAuto Plan Mode: %d\nDistribute Plan Mode: %d\n" %(plan_time, autoplan_time, distribute_time)
+
+print "-"*50
+
+
--- /dev/null
+#!/usr/bin/python
+
+import os, sys
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from logmanager import LOGGER
+from devicemanager import DeviceManager
+
+class TestConstants:
+
+ DEVICE_IDS = ['0000d81400006200', '0000d81b00006200', '00004e310000324d']
+ CONN_DEVICE_ID = None
+ TEST_TEMP_FOLDER = "/tempFiles/"
+ TEST_SUITE_FILE = "tct-capability-tests-2.4.zip"
+
+ @staticmethod
+ def checkConnectedDevice():
+ devIns = DeviceManager._getInstance()
+ devIns._loadDeviceList()
+
+ for devid in TestConstants.DEVICE_IDS:
+ if devIns._isDeviceAvailable(devid) == True:
+ TestConstants.CONN_DEVICE_ID = devid
+ break
+
+ if TestConstants.CONN_DEVICE_ID is None:
+ sys.exit("not connect device")
+ else:
+ LOGGER.info("connected " + TestConstants.CONN_DEVICE_ID)
+
+ @staticmethod
+ def checkTestResourceFile():
+ suiteFilePath = TestConstants.getAbsPath(TestConstants.TEST_TEMP_FOLDER \
+ + TestConstants.TEST_SUITE_FILE)
+ if os.path.exists(suiteFilePath):
+ LOGGER.info("checked %s file" % suiteFilePath)
+ else:
+ LOGGER.error("The '%s' file exists error" % suiteFilePath)
+
+ @staticmethod
+ def getAbsPath(fileName):
+ return os.path.dirname(os.path.abspath( __file__ )) + fileName
--- /dev/null
+#!/usr/bin/python
+
+import os, sys
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from devicemanager import *
+
+class TestDeviceManager:
+
+ def __init__(self):
+
+
+
--- /dev/null
+import os, sys
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+import threading
+from logmanager import LOGGER
+
+class TestLogManager:
+ def __init__(self):
+ LOGGER.setLevel('DEBUG')
+ self.thread1 = threading.Thread(target=self.thread_test, name="Sample_Thread_1")
+ self.thread2 = threading.Thread(target=self.thread_test, name="Sample_Thread_1")
+ self.thread3 = threading.Thread(target=self.thread_test, name="Sample_Thread_2")
+
+ def thread_test(self):
+ LOGGER.debug("thread starting")
+ for i in range(10):
+ LOGGER.debug("Counting from 0 to 9: %d" %i)
+
+ def start_test(self):
+ LOGGER.debug("Starting Main Test")
+ self.thread1.start()
+ self.thread1.join()
+ self.thread2.start()
+ self.thread3.start()
+
+if __name__ == "__main__":
+ testLog = TestLogManager()
+ testLog.start_test()
--- /dev/null
+#!/usr/bin/python
+
+import os, sys
+import time
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from netstatmonitor import *
+
+class TestNetstatLogger:
+
+ def __init__(self):
+ print ''
+
+
+if __name__ == "__main__":
+ print "====================== START TestNetstatLogger ========================"
+ netins = NetstatMonitor('10.113.74.133:26101')
+ netins.start()
+ time.sleep(2)
+ netins.waitThread()
+ time.sleep(2)
+ netins.restartThread()
+ print "====================== FINISH TestNetstatLogger ========================"
--- /dev/null
+#!/usr/bin/python
+import sys
+import os
+from Tkinter import *
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from gui.progress import Demo
+
+prog = Demo(Tk())
+prog.mainloop()
--- /dev/null
+#!/usr/bin/python
+
+import os, sys
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from usbmonitor import UsbMonitor
+from devicemanager import DeviceManager
+
+class Testusbmonitor:
+
+ def __init__(self):
+ self.usbins = None
+ self.devins = DeviceManager.getInstance()
+ print ''
+
+ def testThread(self):
+ self.usbins = UsbMonitor()
+ self.usbins.start()
+
+ def killThread(self):
+ self.usbins.finishThread()
+
+if __name__ == "__main__":
+ ins = Testusbmonitor()
+ ins.testThread()
+ raw_input()
+ ins.killThread()
--- /dev/null
+#!/usr/bin/python
+
+import os
+import glob
+
+plan_name = 'plan_rerun_test'
+scen_name = 'scen_rerun_test'
+tizenVer = 'tizen_web_2.4'
+
+tctshell_path = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+os.chdir(tctshell_path)
+print tctshell_path
+rerun_only = None
+while not rerun_only in ['y', 'n']:
+ rerun_only = raw_input("rerun_only? ")
+
+if rerun_only == 'n':
+ os.system('./tct-plan-generator -m tct-capability-tests --tizen-version %s -o /opt/tools/shell/plan/%s.xml' %(tizenVer, plan_name))
+
+ os.system('./tct-scen-generator -p %s,0000d81400006200,%s %s,0000d81b00006200,%s -o /opt/tools/shell/scen/%s.xml' %(plan_name, tizenVer, plan_name, tizenVer, scen_name))
+
+ os.system('./tct-shell -s /opt/tools/shell/scen/%s.xml -l DEBUG' %scen_name)
+
+ raw_input("Start rerun?")
+
+os.chdir('/opt/tct/%s/shell/result/Tizen-2.4.0_Mobile-TM1_20151015.2026' %tizenVer)
+
+for result in glob.glob("*%s*" %scen_name):
+ _result = os.path.abspath(result)
+ os.chdir(tctshell_path)
+ os.system('./tct-shell --rerun-fail %s -l DEBUG' %_result)
+ break
--- /dev/null
+
+F_mobile_plan: /opt/tools/shell/plan/F_mobile_plan.xml
+
+auto_plan: 3113 seconds
+
+distribute_plan: 2850 seconds
+
+distribute_plan: 2648 seconds
+
+-------------------------------------------------------
+
+2.4_mobileF: /opt/tct/tizen_web_2.4/manager/plan/2.4_mobileF.xml
+
+
+Test Plan Mode: 6757
+
+Distribute Plan Mode (3 devices) : 2384
+
+-------------------------------------------------------
--- /dev/null
+import os, sys
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from result_summary import ResultSummary
+from shellplanner import TctShellPlan, TctShellSuite, ExecuteType
+from logmanager import LOGGER
+
+LOGGER.setLevel("DEBUG")
+
+
+s1 = TctShellSuite('tct-3dtransforms-css3-tests' , '', '', '', '', '', '' ,'')
+s2 = TctShellSuite('tct-capability-tests' , '', '', '', '', '', '' ,'')
+s3 = TctShellSuite('tct-fonts-css3-tests' , '', '', '', '', '', '' ,'')
+s4 = TctShellSuite('tct-security-tcs-tests' , '', '', '', '', '', '' ,'')
+
+exe_t = ExecuteType.createExecuteType('Auto')
+
+p = TctShellPlan('tmp_name', '0000d85b00006200', 'prof', exe_t, [s1, s2, s3, s4], 'tizen_web_2.4', '/opt/tct/tizen_web_2.4/shell/result/Tizen-2.4.0_Mobile-TM1_20151015.2026/rerun_test_1#1_2016-02-12_21:13:23.364388')
+
+
+rs = ResultSummary([p])
+
+rs.genSummary()
+
+print p.getUnpass()
--- /dev/null
+#!/usr/bin/python
+
+import os, sys
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from sdbmanager import SdbManager
+from logmanager import LOGGER
+from test_constants import TestConstants
+
+class TestSdbManager:
+
+ def __init__(self):
+ TestConstants.checkConnectedDevice()
+ TestConstants.checkTestResourceFile()
+
+ self.deviceId = TestConstants.CONN_DEVICE_ID
+ self.suiteFilePath = TestConstants.getAbsPath(TestConstants.TEST_TEMP_FOLDER + \
+ TestConstants.TEST_SUITE_FILE)
+ self.suiteFile = TestConstants.TEST_SUITE_FILE
+
+ def testSdbPush(self):
+ local = self.suiteFilePath
+ remote = '/opt/usr/media/tct/tmp/'
+
+ SdbManager.sdbShell(self.deviceId, "rm -rf " + remote + self.suiteFile)
+ SdbManager.sdbPush(self.deviceId, local, remote)
+
+ def testSdbPull(self):
+ self.testSdbPush()
+
+ local = self.suiteFilePath + "-test"
+ SdbManager.hostCommand("rm -rf " + local)
+
+ remote = '/opt/usr/media/tct/tmp/' + self.suiteFile
+ SdbManager.sdbPull(self.deviceId, remote, local)
+
+ def testSdbShell(self):
+ SdbManager.sdbShell(self.deviceId, 'ls -l')
+
+ def testSdbRootOn(self):
+ SdbManager.sdbRootOn(self.deviceId)
+
+if __name__ == "__main__":
+ print "==================== START TestSDManager ====================="
+ ins = TestSdbManager()
+ ins.testSdbPush()
+ ins.testSdbPull()
+ ins.testSdbShell()
+ ins. testSdbRootOn()
+ print "==================== FINISH TestSDManager ====================="
+
--- /dev/null
+#!/usr/bin/python
+
+import os, sys
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from shellplanner import *
+from test_constants import *
+
+class TestShellPlanner:
+
+ def __init__(self):
+ self.devId1 = '0000d81b00006200'
+ self.devId2 = '0000d81400006200'
+ self.devId3 = '00004e310000324d'
+ self.devId4 = '0000d8f800006200'
+
+ #return TctShellPlan
+ def testInitShellPlan(self):
+ suite1 = TctShellSuite('tct-capability-tests', None, 15,0, \
+ 'common/tct-capability-tests-2.4.zip', 'WRTLauncher',\
+ 'Compliance', 'tizen_web_2.4', 8000)
+
+ '''
+ suite2 = TctShellSuite('tct-alarm-tizen-tests', None, 60,0, \
+ 'common/tct-alarm-tizen-tests-2.4.zip', 'WRTLauncher', \
+ 'Tizen Web Device APIs', 'tizen_web_2.4', 8000)
+
+ '''
+ suites = [suite1]
+
+ return TctShellPlan('testPlan1', self.devId2, 'mobile', ExecuteType('Auto'),suites, \
+ 'tizen_web_2.4', '/opt/tct/tizen_web_2.4/shell/result/testresult/')
+
+ def testInitShellPlan2(self):
+ suite1 = TctShellSuite('tct-capability-tests', None, 15,0, \
+ 'common/tct-capability-tests-2.4.zip', 'WRTLauncher',\
+ 'Compliance', 'tizen_web_2.4', 8000)
+
+ suite2 = TctShellSuite('tct-alarm-tizen-tests', None, 60,0, \
+ 'common/tct-alarm-tizen-tests-2.4.zip', 'WRTLauncher', \
+ 'Tizen Web Device APIs', 'tizen_web_2.4', 8000)
+
+ suites = [suite1, suite2]
+
+ return TctShellPlan('testPlan2', self.devId3, 'mobile', ExecuteType('Auto'),suites, \
+ 'tizen_web_2.4', '/opt/tct/tizen_web_2.4/shell/result/testresult/')
+
+
+ def testInitShellPlan3(self):
+ suite1 = TctShellSuite('tct-capability-tests', None, 15,0, \
+ 'common/tct-capability-tests-3.0.zip', 'WRTLauncher',\
+ 'Compliance', 'tizen_web_3.0', 8000)
+
+ suites = [suite1]
+
+ return TctShellPlan('testPlan3', self.devId3, 'mobile', ExecuteType('Auto'),suites, \
+ 'tizen_web_3.0', '/opt/tct/tizen_web_3.0/shell/result/testresult/')
+
+ def testInitShellPlan4(self):
+ suite1 = TctShellSuite('tct-capability-tests', None, 15,0, \
+ 'common/tct-capability-tests-2.4.zip', 'WRTLauncher',\
+ 'Compliance', 'tizen_web_2.4', 8000)
+
+ suites = [suite1]
+
+ return TctShellPlan('testPlan4', self.devId4, 'mobile', ExecuteType('Auto'),suites, \
+ 'tizen_web_2.4', '/opt/tct/tizen_web_2.4/shell/result/testresult/')
+
+
+ def testInstSuiteinHost(self):
+ plan1 = self.testInitShellPlan3()
+ suite = plan1.getSuites();
+ #suite[0].installSuite(plan1.getDeviceId(), plan1.getDevTctTmpPath())
+ suite[0].sdbCheckSuite(plan1.getDeviceId(), suite[0].getSuiteName())
+ #suite[0].unInstallSuite(plan1.getDeviceId(), plan1.getDevTctTmpPath())
+
+ def testInstSuiteinTarget(self):
+ plan1 = self.testInitShellPlan4()
+ suite = plan1.getSuites();
+ suite[0].installSuite(plan1.getDeviceId(), plan1.getDevTctTmpPath())
+ suite[0].sdbCheckSuite(plan1.getDeviceId(), suite[0].getSuiteName())
+ suite[0].unInstallSuite(plan1.getDeviceId(), plan1.getDevTctTmpPath())
+
+
+if __name__ == "__main__":
+ ins = TestShellPlanner()
+ ins.testInstSuiteinHost()
+ ins.testInstSuiteinTarget()
+
+
+
+
+
+
--- /dev/null
+#!/usr/bin/python
+
+import os, sys
+import time
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from test_shellplanner import *
+from shellworker import *
+
+class TestShellWorker:
+
+ def __init__(self):
+ print ''
+
+ def testInitPlanExecutor(self, plan, count):
+ return PlanExecutor(plan, 1)
+
+ def testRunPlanExecutor(self):
+ planner = TestShellPlanner()
+ plan1 = planner.testInitShellPlan()
+ multiins = MultiRunnPlan._getInstance()
+ multiins.addPlan(plan1.getPlanName(), plan1)
+
+ exe1 = self.testInitPlanExecutor(plan1, 1)
+ exe1.start()
+
+ def testCheckRunningPlan(self):
+ planner = TestShellPlanner()
+ plan1 = planner.testInitShellPlan()
+ plan2 = planner.testInitShellPlan2()
+ multiins = MultiRunnPlan._getInstance()
+ multiins.addPlan(plan1.getPlanName(), plan1)
+ multiins.addPlan(plan2.getPlanName(), plan2)
+
+ multiins.printRunnPlan()
+ multiins.setCurrPlanRunning(plan1)
+
+ multiins.printRunnPlan()
+
+ def testGetRunnDevice(self):
+ planner = TestShellPlanner()
+ plan1 = planner.testInitShellPlan()
+ plan2 = planner.testInitShellPlan2()
+ multiins = MultiRunnPlan._getInstance()
+ multiins.addPlan(plan1.getPlanName(), plan1)
+ multiins.addPlan(plan2.getPlanName(), plan2)
+
+ multiins.setCurrPlanRunning(plan1)
+ print multiins.getRunnDevice()
+
+ def testIsSelectedDevAvailable(self):
+ planner = TestShellPlanner()
+ plan1 = planner.testInitShellPlan()
+ plan2 = planner.testInitShellPlan2()
+ multiins = MultiRunnPlan._getInstance()
+ multiins.addPlan(plan1.getPlanName(), plan1)
+ multiins.addPlan(plan2.getPlanName(), plan2)
+
+ multiins.setCurrPlanRunning(plan1)
+ ins2 = MultiRunnPlan._getInstance()
+ print ins2.isSelectedDevAvailable(plan2)
+
+ def testCheckRecoveryDevice(self):
+ planner = TestShellPlanner()
+ ins = AutoSuiteWorker(planner)
+ print ins.checkRecoveryDevice('10.113.74.133:26101')
+
+
+if __name__ == "__main__":
+ ins = TestShellWorker()
+# ins.testRunPlanExecutor()
+# ins.testCheckRunningPlan()
+# ins.testGetRunnDevice()
+# ins.testIsSelectedDevAvailable()
+ ins.testCheckRecoveryDevice()
+
+
--- /dev/null
+#!/usr/bin/python
+
+import os, sys
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from new_shellwrapper import *
+
+wrapper = ShellWrapper()
+wrapper.parse_options(sys.argv)
--- /dev/null
+#!/usr/bin/python
+
+import os, sys
+
+sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
+
+from usbmonitor import UsbMonitor
+
+class Testusbmonitor:
+
+ def __init__(self):
+ self.usbins = None
+ print ''
+
+ def testThread(self):
+ self.usbins = UsbMonitor()
+ self.usbins.start()
+
+ def killThread(self):
+ self.usbins.finishThread()
+
+if __name__ == "__main__":
+ ins = Testusbmonitor()
+ ins.testThread()
+ raw_input()
+ ins.killThread()
--- /dev/null
+#!/usr/bin/python
+from result_summary import ResultSummary
+
+
+summary1 = ResultSummary("/opt/tct/tizen_web_2.4/manager/result/2016-01-12_15-10-43-526/tct-capability-tests.xml")
+summary1.unmarshal()
+'''
+try:
+ summary1.unmarshal()
+except Exception, e:
+ print "[ Error: reading suite result fail, error %s ]\n" % e
+'''
--- /dev/null
+#!/usr/bin/python
+
+import threading
+import subprocess
+import time
+
+from .logmanager import LOGGER
+from .commodule.killall import killall
+from multiprocessing import Process
+
+
+#class UsbMonitor(threading.Thread):
+class UsbMonitor(Process):
+ usb_cmd = 'tail -f /var/log/syslog | stdbuf -o0 grep usb'
+ isStop = False
+ LOGGER.setLevel('DEBUG')
+
+ def __init__(self, devmgr):
+ #threading.Thread.__init__(self)
+ Process.__init__(self)
+ self.daemon = True
+ self.name = "UsbMonitor"
+ self.devmgr = devmgr
+ self.proc = subprocess.Popen(self.usb_cmd, shell=True, \
+ stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+
+ self.recovery_locks = {}
+ self.curr_time = None
+
+ def set_currsec(self):
+ lt = time.localtime(time.time())
+ self.curr_time = lt.tm_sec + (lt.tm_min * 60) + (lt.tm_hour * 3600)
+
+ def run(self):
+ LOGGER.debug("Starting UsbMonitor.......")
+ self.set_currsec()
+ while True:
+ outs = self.proc.stdout.readline()
+ if outs:
+ outs = outs.strip().decode("utf-8")
+ for outLog in outs.split('\n'):
+ log_sp = outLog.split(' ')[2]
+ time_sp = log_sp.split(':')
+ tm_hour = int(time_sp[0])
+ tm_min = int(time_sp[1])
+ tm_sec = int(time_sp[2])
+ time_sp = (tm_hour * 3600) + (tm_min * 60) + tm_sec
+
+ if self.curr_time > time_sp:
+ continue
+
+ if self.isDisConnectUsb(outLog) or self.isConnectUsb(outLog):
+ self.reLoadDeviceList()
+
+ def reLoadDeviceList(self):
+ time.sleep(3)
+ ret = self.devmgr.loadDeviceList()
+ if not ret:
+ LOGGER.error('0 device is connected')
+ else:
+ for devId in self.recovery_locks.keys():
+ if self.devmgr.isDeviceAvailable(devId):
+ self.device_recovered(devId)
+
+ def isDisConnectUsb(self, sysLog):
+ if sysLog and sysLog.find('USB disconnect') > -1:
+ LOGGER.error(sysLog)
+ return True
+ else:
+ return False
+
+ def isConnectUsb(self, sysLog):
+ if sysLog.find('New USB device found') > -1:
+ LOGGER.debug(sysLog)
+ return True
+ else:
+ return False
+
+ def setup_recovery(self, devId, lock):
+ self.recovery_locks[devId] = lock
+
+ def device_recovered(self, devId):
+ try:
+ self.recovery_locks[devId].put(1, block=False)
+ except Exception as ex:
+ LOGGER.debug(str(ex))
+
+ def kill_usbmonitor(self):
+ killall(self.proc.pid)
--- /dev/null
+# -*- coding:utf-8 -*-
+import os
+import platform
+import shutil
+import stat
+import subprocess
+from optparse import OptionParser
+
+SDB_SERNO = "sdb"
+
+
+class CpFile:
+ sep = os.sep
+ TARGET_BASE_PATH = os.path.join(os.sep + "opt", "tools")
+ TARGET_BASE_LITE = os.path.join(os.sep + "opt", "testkit")
+
+ CURRENT_TARGET_BASE_PATH = ""
+ CURRENT_TARGET_LITE_PATH = ""
+ CURRENT_SOURCE_LITE_PATH = ""
+
+ #monkey
+ SOURCE_MONKEY_PATH = sep + "dev_event"
+ TARGET_MONKEY_PATH = sep + "dev_event"
+
+ #shell
+ SOURCE_SHELL_PATH = sep + "shell"
+ TARGET_SHELL_PATH = sep + "shell"
+ #manager
+ SOURCE_MANAGER_PATH = sep + "manager"
+ TARGET_MANAGER_PATH = sep + "manager"
+ #script
+ SOURCE_SCRIPT_PATH = ""
+ TARGET_SCRIPT_PATH = sep + "tools" + sep + "scripts"
+ #testkit1.0
+ SOURCE_TESTKIT_PATH1 = sep + "testkitlite1.0"
+ TARGET_TESTKIT_PATH1 = sep + "lite2.4"
+ #testkit2.0
+ SOURCE_TESTKIT_PATH2 = sep + "testkitlite2.0"
+ TARGET_TESTKIT_PATH2 = sep + "lite3.0"
+ #plugin
+ SOURCE_PLUGIN_PATH = sep + "plugin"
+ TARGET_PLUGIN_PATH = sep + "plugin"
+
+ def getCurrentOSBit(self):
+ return platform.architecture()
+
+ def setCurrentPath(self):
+ self.CURRENT_SOURCE_BASE_PATH = os.getcwd() + self.sep
+ self.CURRENT_TARGET_BASE_PATH = self.TARGET_BASE_PATH
+ self.CURRENT_TARGET_LITE_PATH = self.TARGET_BASE_LITE
+ print("current source base path =" + self.CURRENT_SOURCE_BASE_PATH)
+ print("current target base path =" + self.CURRENT_TARGET_BASE_PATH)
+
+ def cpSdb(self):
+ osInfo = self.getCurrentOSBit()
+ if (platform.system() == "Windows"):
+ if (str(osInfo[0]).find("64") != -1):
+ self.cpFile(
+ self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + "sdb" + self.sep + "sdb-64.exe",
+ self.CURRENT_TARGET_BASE_PATH + self.sep + "sdb.exe")
+ if (str(osInfo[0]).find("32") != -1):
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + self.sep \
+ + "sdb-32.exe", self.CURRENT_TARGET_BASE_PATH + \
+ self.sep + "sdb.exe")
+ else:
+ '''
+ # get status and output of the command
+ status, output = commands.getstatusoutput('lsof | \
+ grep /usr/bin/sdb')
+ # merge continuing spaces to one
+ collapsedOutput = ' '.join(output.split())
+ # split words
+ result = collapsedOutput.split(' ')
+ # get the process id of the sdb
+ if status is not 256 :
+ # find the word sdb
+ for x in range(0, result.__len__()):
+ if (result[x] == "sdb"):
+ break
+ # get the process id of the sdb
+ os.system('kill -9 ' + result[x+1])
+ '''
+ try:
+ '''
+ if(self.checkInstalledSdb()):
+ print("sdb install is not required")
+ return
+
+ print("sdb install")
+ '''
+ if (str(osInfo[0]).find("64") != -1):
+ self.cpFile(
+ self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
+ self.sep + "sdb-64",
+ self.CURRENT_TARGET_BASE_PATH + self.sep + "sdb")
+ self.cpFile(
+ self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
+ self.sep + "sdb-64",
+ "/usr/bin/" + "sdb")
+ if (str(osInfo[0]).find("32") != -1):
+ self.cpFile(
+ self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
+ self.sep + "sdb-32",
+ self.CURRENT_TARGET_BASE_PATH + self.sep + "sdb")
+ self.cpFile(
+ self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + "sdb" + \
+ self.sep + "sdb-32",
+ "/usr/bin/" + "sdb")
+ os.system("chmod -R 777 /usr/bin/sdb")
+ except:
+ pass
+
+ def get_cmd_result(self, command):
+ p = subprocess.Popen(command,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT)
+ return p.stdout.readline()
+
+ def checkInstalledSdb(self):
+ cmd = "sdb"
+ installedVer = ""
+ try:
+ output = str(self.get_cmd_result(cmd).split('\n')[0])
+ if output.find('Smart Development Bridge') > -1:
+ installedVer = output.split(' ')[3]
+ else:
+ raise
+ except:
+ print("sdb is not installed")
+ return False
+
+ osInfo = self.getCurrentOSBit()
+ if (str(osInfo[0]).find("32") != -1):
+ cmd = "sdb/sdb-32"
+ else:
+ cmd = "sdb/sdb-64"
+ toolVer = ""
+ try:
+ output = str(self.get_cmd_result(cmd).split('\n')[0])
+ if output.find('Smart Development Bridge') > -1:
+ toolVer = output.split(' ')[3]
+ else:
+ raise
+ except:
+ print("tool's sdb is not valid")
+ return True
+
+ print("installed sdb version : %s / tool's sdb version : %s" % (installedVer, toolVer))
+ installedSplit = installedVer.split('.')
+ toolSplit = toolVer.split('.')
+ hit = 0
+ for i in range(0, 3):
+ if(int(installedSplit[i]) > int(toolSplit[i])):
+ print("Higher version sdb is already installed : " + installedVer)
+ return True
+ if(int(installedSplit[i]) == int(toolSplit[i])):
+ hit += 1
+ continue
+ if(int(installedSplit[i]) < int(toolSplit[i])):
+ break
+ if(hit==3):
+ print("Same version sdb is already installed : " + installedVer)
+ return True
+
+ return False
+
+ def cpOtherFiles(self):
+ tct_mgr = "tct-mgr"
+ tct_shell = "tct-shell"
+ tct_monkey = "tct-monkey"
+ testkit_lite1 = "testkit-lite1.0"
+ testkit_lite2 = "testkit-lite2.0"
+ tct_config = "TCT_CONFIG"
+
+ if (platform.system() == "Windows"):
+ tct_mgr = "tct-mgr.bat"
+
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + tct_mgr, self.CURRENT_TARGET_BASE_PATH + \
+ self.sep + tct_mgr)
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + tct_shell, self.CURRENT_TARGET_BASE_PATH + \
+ self.sep + tct_shell)
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + tct_monkey, self.CURRENT_TARGET_BASE_PATH + \
+ self.sep + tct_monkey)
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + testkit_lite1, self.CURRENT_TARGET_BASE_PATH + \
+ self.sep + testkit_lite1)
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + testkit_lite2, self.CURRENT_TARGET_BASE_PATH + \
+ self.sep + testkit_lite2)
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SCRIPT_PATH + \
+ self.sep + tct_config, self.CURRENT_TARGET_BASE_PATH + \
+ self.sep + tct_config)
+
+ def cpOtherFilesToBinDir(self):
+ tct_mgr = "tct-mgr"
+ tct_shell = "tct-shell"
+ tct_monkey = "tct-monkey"
+ testkit_lite1 = "testkit-lite1.0"
+ testkit_lite2 = "testkit-lite2.0"
+
+ if (platform.system() != "Windows"):
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + \
+ tct_mgr, "/usr/bin/" + tct_mgr)
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + \
+ tct_shell, "/usr/bin/" + tct_shell)
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + \
+ tct_monkey, "/usr/bin/" + tct_monkey)
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + testkit_lite1,\
+ "/usr/bin/" + testkit_lite1)
+ self.cpFile(self.CURRENT_SOURCE_BASE_PATH + \
+ self.SOURCE_SCRIPT_PATH + self.sep + testkit_lite2,\
+ "/usr/bin/" + testkit_lite2)
+
+ try:
+ os.system("chmod -R 777 /usr/bin/" + tct_mgr)
+ os.system("chmod -R 777 /usr/bin/" + tct_shell)
+ os.system("chmod -R 777 /usr/bin/" + tct_monkey)
+ os.system("chmod -R 777 /usr/bin/" + testkit_lite1)
+ os.system("chmod -R 777 /usr/bin/" + testkit_lite2)
+ os.system("chmod -R 777 /usr/bin/sdb")
+ except:
+ pass
+
+ def cpTestKitLite(self):
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_TESTKIT_PATH1, \
+ self.CURRENT_TARGET_LITE_PATH + self.TARGET_TESTKIT_PATH1, \
+ "lite2.4")
+ for r, d, f in os.walk(self.CURRENT_TARGET_LITE_PATH + \
+ self.TARGET_TESTKIT_PATH1):
+ if (platform.system() != "Windows"):
+ os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_TESTKIT_PATH2,
+ self.CURRENT_TARGET_LITE_PATH + self.TARGET_TESTKIT_PATH2, \
+ "lite3.0")
+ for r, d, f in os.walk(self.CURRENT_TARGET_LITE_PATH + \
+ self.TARGET_TESTKIT_PATH2):
+ if (platform.system() != "Windows"):
+ os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+ def cpManager(self):
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_MANAGER_PATH,
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_MANAGER_PATH, \
+ "manager")
+ for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
+ self.TARGET_MANAGER_PATH):
+ if (platform.system() != "Windows"):
+ os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+ def cpShell(self):
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_SHELL_PATH,
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_SHELL_PATH, \
+ "shell")
+ for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
+ self.TARGET_SHELL_PATH):
+ if (platform.system() != "Windows"):
+ os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+ def cpMonkey(self):
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_MONKEY_PATH, \
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_MONKEY_PATH, \
+ "monkey")
+ for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
+ self.TARGET_MONKEY_PATH):
+ if (platform.system() != "Windows"):
+ os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+ def cpPlugin(self):
+ self.cpDir(self.CURRENT_SOURCE_BASE_PATH + self.SOURCE_PLUGIN_PATH,
+ self.CURRENT_TARGET_BASE_PATH + self.TARGET_PLUGIN_PATH, \
+ "plugin")
+ for r, d, f in os.walk(self.CURRENT_TARGET_BASE_PATH + \
+ self.TARGET_PLUGIN_PATH):
+ if (platform.system() != "Windows"):
+ os.chmod(r, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)
+
+ def cpFile(self, src, target):
+ if (not os.path.isfile(src)):
+ print(src + " is not a file")
+ return
+ path = os.path.dirname(target)
+ if (not os.path.isdir(path)):
+ os.makedirs(path)
+ shutil.copyfile(src, target)
+
+ def del_rw(self, action, name, exc):
+ if (platform.system() != "Windows"):
+ os.chmod(name, stat.S_IWRITE)
+ os.remove(name)
+
+ def cpDir(self, src, target, name):
+ if (os.path.isdir(src) and not os.path.exists(target)):
+ print("copy " + name + " dir start")
+ shutil.copytree(src, target)
+ print("copy " + name + " dir finish")
+ else:
+ if (not os.path.isdir(src)):
+ print("source " + name + " path is not a dir")
+ if (os.path.exists(target)):
+ print ("target " + name + " path is exists")
+ try:
+ shutil.rmtree(target, onerror=self.del_rw)
+ except Exception, data:
+ print Exception, ":", data
+
+ print ("target " + name + " dir destroyed")
+ try:
+ shutil.copytree(src, target)
+ except Exception, data:
+ print Exception, ":", data
+ print("copy " + name + " dir finish")
+
+ def clear(self):
+ self.setCurrentPath()
+ try:
+ shutil.rmtree(self.CURRENT_TARGET_BASE_PATH, onerror=self.del_rw)
+ except Exception, data:
+ print Exception, ":", data
+
+ def cp(self):
+ self.setCurrentPath()
+ self.cpShell()
+ self.cpManager()
+ self.cpMonkey()
+ self.cpOtherFiles()
+ self.cpTestKitLite()
+ self.cpPlugin()
+ self.cpOtherFilesToBinDir()
+ self.cpSdb()
+
+parser = OptionParser()
+parser.add_option("-i", "--install", dest="install", action="store_true", \
+ default=False, help="copy folders and file into os")
+parser.add_option("-p", "--purge", dest="clear", action="store_true", \
+ default=False, help="clear all files")
+
+(options, args) = parser.parse_args()
+if (options.install):
+ test = CpFile()
+ test.cp()
+elif(options.clear):
+ test = CpFile()
+ test.clear()
+else:
+ test = CpFile()
+ test.cp()
--- /dev/null
+#!/bin/bash
+
+THE_CLASSPATH=
+for i in `ls /opt/tools/manager/lib/*.jar`
+do
+ THE_CLASSPATH=${THE_CLASSPATH}:${i}
+done
+
+java -cp ${THE_CLASSPATH} org.tizen.tct.tool.mgr.TctGui "${@}"
+
--- /dev/null
+@echo off
+Setlocal EnableDelayedExpansion
+
+set classpath=
+for %%f in (/opt/tools/manager/lib/*.jar) do set classpath=!classpath!;/opt/tools/manager/lib/%%f
+
+echo ==================================================================================
+echo java_classpath = %classpath%
+java -cp %classpath% org.tizen.tct.tool.mgr.TctGui
+echo ==================================================================================
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+
+python /opt/tools/dev_event/tct-monkey "${@}"
--- /dev/null
+#!/bin/bash
+
+python3 /opt/tools/shell/tct-shell "${@}"
--- /dev/null
+#!/bin/bash
+
+python /opt/testkit/lite2.4/testkit-lite "${@}"
--- /dev/null
+#!/bin/bash
+
+python /opt/testkit/lite3.0/testkit-lite "${@}"
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+Dependency:
+=================
+python2.7 python-pip requests
+
+ sudo apt-get install python-pip
+ sudo pip install requests
+
+How to build:
+=================
+ Build from source code:
+ sudo python setup.py build
+
+How to install:
+=================
+ Install testkit lite from source code:
+ sudo python setup.py install
+
+How to use:
+=================
+ At first, install a test package or prepare one tests.xml file aligned with schema files: /opt/testkit/lite/xsd/testdefinition-syntax.xsd.
+
+ And then,
+ 1) You can run case on target:
+ For web test cases:
+ testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>'
+ For native test cases:
+ testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"
+
+ 2) You can run case in single mode :
+ For web test cases:
+ testkit-lite -f "<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>' --comm localhost
+ For native test cases:
+ testkit-lite -f "<somewhere>/<package_name>/tests.xml" --comm localhost
+
+ 3) You can select on parser engine to simply conduct one or more tests.xml on target:
+ testkit-lite -f device:"<somewhere>/<package_name1>/tests.xml ... <somewhere>/<package_namen>/tests.xml" -e 'WRTLauncher <package_name1> ... <package_namen>'
+
+ 4) If you want to execute both auto and manual tests:
+ testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"
+
+ 5) If you just want to execute manual tests:
+ testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -M
+
+ 6) If you just want to execute auto tests:
+ testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -A
+
+ 7) If you want to save test result to another file, by default it'll be under /opt/testkit/lite/latest:
+ testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -o <somewhere>/xxx.xml
+
+ 8) If you want to choose some filters:
+ testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --status level1 --type type1 ...
+
+ 9) If you want to run test according capability:
+ testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --capability capability.xml
+
+ 10) At last, you can freely compose the above parameters together:
+ testkit-lite -f <somewhere1>/tests.xml <somewhere2>/tests.xml -A --priority P1 --type type1 ...
+
+Get Results:
+=================
+
+ Test report will be generated as tests.result.xml
+ The result will be under /opt/testkit/lite/latest after execution, you can also check the history results in /opt/testkit/lite/yyyy-mm-dd-HH:MM:SS.NNNNNN.
+
+View Results:
+=================
+
+Test report can be viewed in HTML format, so the data in the xml result file looks more human friendly.
+
+Please follow the following steps to view test report:
+ 1) copy files: application.js back_top.png jquery.min.js testresult.xsl tests.css under directory /opt/testkit/lite/xsd/
+ 2) put the files from step 1) under the same directory as the xml result file
+ 3) open xml result file with a web browser(IE, Chrome or Firefox)
+
+Known Issues:
+=================
+N/A
--- /dev/null
+[public_version]
+version=TESTKIT1_3.0
+[internal_version]
+version=TESTKIT1_3.0.1-151106
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Yuanyuan,Zou <zouyuanx@intel.com>
+
+
+SUBDIRS = impl
+
+commoduledir = /usr/lib/python2.7/dist-packages/commodule
+dist_commodule_SCRIPTS = *.py
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Liu,chengtao <chengtaox.liu@intel.com>
+""" The shell command executor module"""
+
+import os
+import sys
+import time
+import subprocess
+from datetime import datetime
+
+from .killall import killall
+from .str2 import str2str
+
+
+def shell_command(cmd, timeout=15):
+ """shell communication for quick return in sync mode"""
+ proc = subprocess.Popen(cmd,
+ shell=True,
+ bufsize=0,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ stdin=subprocess.PIPE)
+ time_cnt = 0
+ exit_code = None
+ while time_cnt < timeout:
+ exit_code = proc.poll()
+ if not exit_code is None:
+ break
+ time_cnt += 0.2
+ time.sleep(0.2)
+
+ if exit_code is None:
+ killall(proc.pid)
+ exit_code = -1
+ result = []
+ else:
+ result = proc.stdout.readlines() or proc.stderr.readlines()
+ return [exit_code, result]
+
+
+def shell_command_ext(cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None):
+ """shell executor, return [exitcode, stdout/stderr]
+ timeout: None means unlimited timeout
+ boutput: specify whether print output during the command running
+ """
+ cmd_open = subprocess.Popen(args=cmd,
+ shell=True,
+ bufsize=0,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ stdin=subprocess.PIPE)
+
+ while True:
+ exit_code = cmd_open.poll()
+ if exit_code is not None:
+ break
+ if timeout is not None:
+ timeout -= 0.1
+ if timeout <= 0:
+ try:
+ exit_code = "timeout"
+ cmd_open.terminate()
+ time.sleep(5)
+ except OSError:
+ killall(cmd_open.pid)
+ break
+ time.sleep(0.1)
+
+ stdout_log = str2str(cmd_open.stdout.read())
+ stderr_log = str2str(cmd_open.stderr.read())
+ if 'returncode=' in stdout_log:
+ index = stdout_log.find('returncode=') + 11
+ exit_code = str(stdout_log[index:]).strip('\r\n')
+ stdout_log = '<![CDATA[' + stdout_log + ']]>'
+ stderr_log = '<![CDATA[' + stderr_log + ']]>'
+
+ return [exit_code, stdout_log, stderr_log]
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,Boston, MA 02110-1301,USA.
+#
+# Authors:
+# Liu,chengtao <chengtaox.liu@intel.com>
+"""Test connector for test instance and target instance"""
+
+from .log import LOGGER
+
+
+class Connector:
+
+ """Communication module for test host and test remote"""
+
+ def __init__(self, config):
+ self.conn = None
+ if "testmode" in config:
+ try:
+ exec "from impl.%s import get_target_conn" % config[
+ "testmode"]
+ device_no = config.get('deviceid', None)
+ if device_no is not None:
+ self.conn = get_target_conn(device_no)
+ else:
+ self.conn = get_target_conn()
+ except Exception as error:
+ LOGGER.error("[Error: Failed to initilize com-module,"
+ " exception: % s]\n" % error)
+
+ def get_connector(self):
+ """list the handler instance"""
+ return self.conn
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Liu,chengtao <chengtaox.liu@intel.com>
+""" The http request process module"""
+
+import requests
+import json
+
+
+def get_url(baseurl, api):
+ """get full url string"""
+ return "%s%s" % (baseurl, api)
+
+
+def http_request(url, rtype="POST", data=None, time_out=10):
+ """
+ http request to the device http server
+ """
+ result = None
+ if rtype == "POST":
+ headers = {'content-type': 'application/json'}
+ try:
+ ret = requests.post(url, data=json.dumps(
+ data), headers=headers, timeout=time_out)
+
+ if ret:
+ result = ret.json()
+ except Exception as error:
+ pass
+ elif rtype == "GET":
+ try:
+ ret = requests.get(url, params=data, timeout=time_out)
+ if ret:
+ result = ret.json()
+ except Exception as error:
+ pass
+ return result
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Yuanyuan,Zou <zouyuanx@intel.com>
+
+
+commoduleimpldir = /usr/lib/python2.7/dist-packages/commodule/impl
+dist_commoduleimpl_SCRIPTS = *.py
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Liu,chengtao <chengtaox.liu@intel.com>
+
+""" The implementation of local host communication"""
+
+import os
+import time
+import socket
+import re
+from shutil import copyfile
+
+from commodule.log import LOGGER
+from commodule.autoexec import shell_command, shell_command_ext
+
+
+HOST_NS = "127.0.0.1"
+os.environ['no_proxy'] = HOST_NS
+APP_QUERY_STR = "ps aux | grep %s | grep -v grep"
+
+
+class LocalHost:
+
+ """ Implementation for transfer data
+ between Host and Tizen PC
+ """
+
+ def __init__(self):
+ self.deviceid = "localhost"
+
+ def shell_cmd(self, cmd="", timeout=15):
+ return shell_command(cmd, timeout)
+
+ def check_process(self, process_name):
+ exit_code, ret = shell_command(APP_QUERY_STR % process_name)
+ return len(ret)
+
+ def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+ cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
+ exit_code, ret = self.shell_cmd(cmdline)
+ time.sleep(2)
+
+ def check_widget_process(self, wgt_name):
+ return True
+
+ def shell_cmd_ext(self,
+ cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None):
+ return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
+
+ def get_device_ids(self):
+ """
+ get device list of ids
+ """
+ return ['localhost']
+
+ def get_device_info(self):
+ """
+ get tizen device inforamtion
+ """
+ device_info = {}
+ device_info["device_id"] = self.deviceid
+ device_info["resolution"] = "N/A"
+ device_info["screen_size"] = "N/A"
+ device_info["device_model"] = "N/A"
+ device_info["device_name"] = "N/A"
+ device_info["os_version"] = "N/A"
+ device_info["build_id"] = "N/A"
+ return device_info
+
+ def get_server_url(self, remote_port="8000"):
+ """get server url"""
+ url_forward = "http://%s:%s" % (HOST_NS, remote_port)
+ return url_forward
+
+ def install_package(self, pkgpath):
+ """
+ install a package on tizen device
+ """
+ cmd = "rpm -ivh %s" % pkgpath
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def get_installed_package(self):
+ """get list of installed package from device"""
+ cmd = "rpm -qa | grep tct"
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def download_file(self, remote_path, local_path):
+ """download file"""
+ # copyfile(remote_path, local_path)
+ # return True
+ return False
+
+ def upload_file(self, remote_path, local_path):
+ """upload file"""
+ # copyfile(local_path, remote_path)
+ return False
+
+ def get_launcher_opt(self, test_launcher, test_suite, test_set, fuzzy_match, auto_iu):
+ """get test option dict """
+ test_opt = {}
+ test_opt["suite_name"] = test_suite
+ test_opt["launcher"] = test_launcher
+ test_opt["test_app_id"] = test_launcher
+ return test_opt
+
+ def launch_app(self, wgt_name):
+ exit_code, ret = shell_command(wgt_name + '&')
+ return True
+
+ def kill_app(self, wgt_name):
+ return True
+
+ def start_debug(self, dlogfile):
+ pass
+
+ def stop_debug(self):
+ pass
+
+
+def get_target_conn():
+ """ Get connection for Test Target"""
+ return LocalHost()
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+
+""" The implementation of TIZEN mobile communication"""
+
+import os
+import time
+import socket
+import threading
+import re
+import shutil
+import ConfigParser
+import platform
+import xml.etree.ElementTree as etree
+
+from commodule.log import LOGGER
+from commodule.autoexec import shell_command, shell_command_ext
+from commodule.killall import killall
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = ConfigParser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+LOCAL_HOST_NS = "127.0.0.1"
+RPM_INSTALL = "sdb -s %s shell rpm -ivh %s"
+RPM_UNINSTALL = "sdb -s %s shell rpm -e %s"
+RPM_LIST = "sdb -s %s shell \"rpm -qa|grep tct\""
+APP_QUERY_STR = "sdb -s %s shell \"ps aux|grep '%s'|grep -v grep\"|awk '{print $2}'"
+APP_KILL_STR = "sdb -s %s shell kill -9 %s"
+WRT_QUERY_STR = "sdb -s %s shell wrt-launcher -l | grep '%s'|awk '{print $2\":\"$NF}'"
+WRT_START_STR = "sdb -s %s shell 'wrt-launcher -s %s; echo returncode=$?'"
+WRT_STOP_STR = "sdb -s %s shell wrt-launcher -k %s"
+WRT_INSTALL_STR = "sdb -s %s shell pkgcmd -i -t wgt -q -p %s"
+WRT_UNINSTL_STR = "sdb -s %s shell pkgcmd -u -t wgt -q -n %s"
+WRT_SMOCK_STR = "sdb -s %s shell 'echo \"%s sdbd rw\" | smackload'"
+WRT_SMOCK_REV_STR = "sdb -s %s shell 'echo \"sdbd %s rw\" | smackload'"
+WRT_LOCATION = os.path.join(DEVICE_SUITE_TARGET_24, "tct/opt/%s/%s.wgt")
+DLOG_CLEAR = "sdb -s %s shell dlogutil -c"
+DLOG_WRT = "sdb -s %s shell dlogutil -v threadtime"
+
+SDB_COMMAND_RTN = "sdb -s %s shell '%s; echo returncode=$?'"
+
+# redefine constants for windows
+if platform.system() == "Windows":
+ WRT_START_STR = 'sdb -s %s shell "wrt-launcher -s %s; echo returncode=$?"'
+ SDB_COMMAND_RTN = 'sdb -s %s shell "%s; echo returncode=$?"'
+
+def debug_trace(cmdline, logfile):
+ global debug_flag, metux
+ wbuffile = file(logfile, "w")
+ import subprocess
+ exit_code = None
+ proc = subprocess.Popen(args=cmdline,
+ shell=True,
+ stdout=wbuffile,
+ stderr=None)
+ while True:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+ time.sleep(0.5)
+ metux.acquire()
+ proc_flag = debug_flag
+ metux.release()
+ if not proc_flag:
+ break
+ wbuffile.close()
+ if exit_code is None:
+ killall(proc.pid)
+
+
+def _get_device_ids():
+ """get tizen device list of ids"""
+ result = []
+ exit_code, ret = shell_command("sdb devices")
+ for line in ret:
+ if str.find(line, "\tdevice") != -1:
+ result.append(line.split("\t")[0])
+ return result
+
+
+class TizenMobile:
+
+ """
+ Implementation for transfer data
+ between Host and Tizen Mobile Device
+ """
+
+ def __init__(self, device_id=None):
+ self.deviceid = device_id
+ self.is_NE = 0
+ if self.deviceid and self.deviceid.find('NE') > -1:
+ self.is_NE = int(self.deviceid.split(':')[1].split('_')[0])
+ self.deviceid = self.deviceid.split('_')[1]
+
+ self._wrt = False
+
+ def is_NE_mode(self):
+ return self.is_NE
+
+ def get_devid(self):
+ return self.deviceid
+
+ def shell_cmd(self, cmd="", timeout=15):
+ cmdline = "sdb -s %s shell \"%s\" " % (self.deviceid, cmd)
+ return shell_command(cmdline, timeout)
+
+ def check_process(self, process_name):
+ exit_code, ret = shell_command(
+ APP_QUERY_STR % (self.deviceid, process_name))
+ return len(ret)
+
+ def launch_stub(self, stub_app, stub_port, debug_opt=""):
+ cmdline = "/opt/home/developer/%s --port:%s %s; sleep 2s" \
+ % (stub_app, stub_port, debug_opt)
+ exit_code, ret = self.shell_cmd(cmdline)
+ time.sleep(2)
+
+ def shell_cmd_ext(self,
+ cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None):
+
+ cmdline = SDB_COMMAND_RTN % (
+ self.deviceid, cmd)
+ return shell_command_ext(cmdline, timeout, boutput, \
+ stdout_file, stderr_file)
+
+ def get_device_info(self):
+ """get tizen device inforamtion"""
+ device_info = {}
+ resolution_str = ""
+ screen_size_str = ""
+ device_model_str = ""
+ device_name_str = ""
+ build_id_str = ""
+ os_version_str = ""
+
+ # get resolution and screen size
+ exit_code, ret = shell_command(
+ "sdb -s %s shell xrandr" % self.deviceid)
+ pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
+ for line in ret:
+ match = pattern.search(line)
+ if match:
+ resolution_str = "%s x %s" % (match.group(1), match.group(2))
+ screen_size_str = "%s x %s" % (match.group(3), match.group(4))
+
+ # get architecture
+ exit_code, ret = shell_command(
+ "sdb -s %s shell uname -m" % self.deviceid)
+ if len(ret) > 0:
+ device_model_str = ret[0]
+
+ # get hostname
+ exit_code, ret = shell_command(
+ "sdb -s %s shell uname -n" % self.deviceid)
+ if len(ret) > 0:
+ device_name_str = ret[0]
+
+ # get os version
+ exit_code, ret = shell_command(
+ "sdb -s %s shell cat /etc/issue" % self.deviceid)
+ for line in ret:
+ if len(line) > 1:
+ os_version_str = "%s %s" % (os_version_str, line)
+
+ # get build id
+ exit_code, ret = shell_command(
+ "sdb -s %s shell cat /etc/os-release" % self.deviceid)
+ for line in ret:
+ if line.find("BUILD_ID=") != -1:
+ build_id_str = line.split('=')[1].strip('\"\r\n')
+
+ os_version_str = os_version_str[0:-1]
+
+ device_info["device_id"] = self.deviceid
+ device_info["resolution"] = resolution_str
+ device_info["screen_size"] = screen_size_str
+ device_info["device_model"] = device_model_str
+ device_info["device_name"] = device_name_str
+ device_info["os_version"] = os_version_str
+ device_info["build_id"] = build_id_str
+ return device_info
+
+ def get_buildinfo(self, _tizenV):
+ """ get builf info"""
+ device_file = ""
+ if _tizenV and _tizenV.find("3.0") > -1:
+ device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+ elif _tizenV and _tizenV.find("4.0") > -1:
+ device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+ elif _tizenV and _tizenV.find("5.0") > -1:
+ device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+ elif _tizenV and _tizenV.find("5.5") > -1:
+ device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+ else:
+ device_file = DEVICE_SUITE_TARGET_24 + '/Documents/tct/buildinfo.xml'
+
+ builfinfo_file = '/opt/testkit/lite2.4/' + self.deviceid + '/buildinfo.xml'
+ build_info = {}
+ build_info['buildid'] = ''
+ build_info['manufacturer'] = ''
+ build_info['model'] = ''
+
+ if self.download_file(device_file, builfinfo_file) \
+ and os.path.exists(builfinfo_file):
+ root = etree.parse(builfinfo_file).getroot()
+ for element in root.findall("buildinfo"):
+ if element is not None:
+ if element.get("name").lower() == 'buildversion':
+ child = etree.Element.getchildren(element)
+ if child and child[0].text:
+ buildid = child[0].text
+ build_info['buildid'] = buildid
+ if element.get("name").lower() == 'manufacturer':
+ child = etree.Element.getchildren(element)
+ if child and child[0].text:
+ manufacturer = child[0].text
+ build_info['manufacturer'] = manufacturer
+ if element.get("name").lower() == 'model':
+ child = etree.Element.getchildren(element)
+ if child and child[0].text:
+ model = child[0].text
+ build_info['model'] = model
+ os.remove(builfinfo_file)
+ return build_info
+
+
+ def get_server_url(self, remote_port="8000"):
+ """forward request a host tcp port to targe tcp port"""
+ if remote_port is None:
+ return None
+
+ os.environ['no_proxy'] = LOCAL_HOST_NS
+ host = LOCAL_HOST_NS
+ inner_port = 9000
+ time_out = 2
+ bflag = False
+ while True:
+ sock_inner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock_inner.settimeout(time_out)
+ try:
+ sock_inner.bind((host, inner_port))
+ sock_inner.close()
+ bflag = False
+ except socket.error as error:
+ if error.errno == 98 or error.errno == 13:
+ bflag = True
+ if bflag:
+ inner_port += 1
+ else:
+ break
+ host_port = str(inner_port)
+ cmd = "sdb -s %s forward tcp:%s tcp:%s" % \
+ (self.deviceid, host_port, remote_port)
+ exit_code, ret = shell_command(cmd)
+ url_forward = "http://%s:%s" % (host, host_port)
+ return url_forward
+
+ def download_file(self, remote_path, local_path):
+ """download file from device"""
+
+ local_path_dir = os.path.dirname(local_path)
+ if not os.path.exists(local_path_dir):
+ os.makedirs(local_path_dir)
+ filename = os.path.basename(remote_path)
+ cmd = "sdb -s %s pull %s %s" % (
+ self.deviceid, remote_path, local_path_dir)
+ exit_code, ret = shell_command(cmd)
+ if exit_code != 0:
+ error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+ LOGGER.info("[ Download file \"%s\" failed, error: %s ]"
+ % (remote_path, error))
+ return False
+ else:
+ src_path = os.path.join(local_path_dir, filename)
+ if src_path != local_path:
+ shutil.move(src_path, local_path)
+ return True
+
+ def upload_file(self, remote_path, local_path):
+ """upload file to device"""
+ cmd = "sdb -s %s push %s %s" % (self.deviceid, local_path, remote_path)
+ exit_code, ret = shell_command(cmd)
+ if exit_code != 0:
+ error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+ LOGGER.info("[ Upload file \"%s\" failed,"
+ " get error: %s ]" % (local_path, error))
+ return False
+ else:
+ return True
+
+ def get_launcher_opt(self, test_launcher, test_suite, test_set, \
+ fuzzy_match, auto_iu):
+ """
+ get test option dict
+ """
+ test_opt = {}
+ test_opt["suite_name"] = test_suite
+ test_opt["launcher"] = test_launcher
+ test_opt["test_app_id"] = test_launcher
+ self._wrt = False
+ if test_launcher.find('WRTLauncher') != -1:
+ self._wrt = True
+ cmd = ""
+ test_app_id = None
+ test_opt["launcher"] = "wrt-launcher"
+ # test suite need to be installed by commodule
+ if auto_iu:
+ test_wgt = test_set
+ test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
+ if not self.install_app(test_wgt_path):
+ LOGGER.info("[ failed to install widget \"%s\" in target ]"
+ % test_wgt)
+ return None
+ else:
+ test_wgt = test_suite
+
+ # query the whether test widget is installed ok
+ cmd = WRT_QUERY_STR % (self.deviceid, test_wgt)
+ exit_code, ret = shell_command(cmd)
+ if exit_code == -1:
+ return None
+ for line in ret:
+ items = line.split(':')
+ if len(items) < 1:
+ continue
+ if (fuzzy_match and items[0].find(test_wgt) != -1) \
+ or items[0] == test_wgt:
+ test_app_id = items[1].strip('\r\n')
+ break
+
+ if test_app_id is None:
+ LOGGER.info("[ test widget \"%s\" not found in target ]"
+ % test_wgt)
+ return None
+ else:
+ test_opt["test_app_id"] = test_app_id
+
+ cmd1 = WRT_SMOCK_STR % (self.deviceid, test_app_id.split('.')[0])
+ cmd2 = WRT_SMOCK_REV_STR % \
+ (self.deviceid, test_app_id.split('.')[0])
+ shell_command(cmd1)
+ shell_command(cmd2)
+
+ return test_opt
+
+ def install_package(self, pkgpath):
+ """install a package on tizen device:
+ push package and install with shell command
+ """
+ cmd = RPM_INSTALL % (self.deviceid, pkgpath)
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def uninstall_package(self, pkgname):
+ """install a package on tizen device:
+ push package and install with shell command
+ """
+ cmd = RPM_UNINSTALL % (self.deviceid, pkgname)
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def get_installed_package(self):
+ """get list of installed package from device"""
+ cmd = RPM_LIST % self.deviceid
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def start_debug(self, dlogfile):
+ global debug_flag, metux
+ if self.is_NE_mode():
+ return
+ debug_flag = True
+ metux = threading.Lock()
+ cmdline = DLOG_CLEAR % self.deviceid
+ exit_code, ret = shell_command(cmdline)
+ cmdline = DLOG_WRT % self.deviceid
+ LOGGER.debug("[ DLOGFILE_PATH:%s ]" % str(dlogfile))
+ th = threading.Thread(target=debug_trace, args=(cmdline, dlogfile))
+ th.setDaemon(True)
+ th.start()
+
+ def stop_debug(self):
+ global debug_flag, metux
+ if self.is_NE_mode():
+ return
+
+ metux.acquire()
+ debug_flag = False
+ metux.release()
+
+ def launch_app(self, wgt_name):
+ if not self._wrt:
+ exit_code, ret = self.shell_cmd(wgt_name)
+ return True
+ timecnt = 0
+ blauched = False
+ cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ cmdline = WRT_START_STR % (self.deviceid, wgt_name)
+ while timecnt < 3:
+ exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
+ if exit_code == "0":
+ blauched = True
+ break
+ timecnt += 1
+ time.sleep(3)
+ return blauched
+
+ def kill_app(self, wgt_name):
+ if not self._wrt:
+ return True
+ cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ return True
+
+ def install_app(self, wgt_path="", timeout=90):
+ cmd = WRT_INSTALL_STR % (self.deviceid, wgt_path)
+ exit_code, ret = shell_command(cmd, timeout)
+ if exit_code == -1:
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_path)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ return False
+ else:
+ return True
+
+ def uninstall_app(self, wgt_name):
+ cmd = WRT_UNINSTL_STR % (self.deviceid, wgt_name.split('.')[0])
+ exit_code, ret = shell_command(cmd)
+ return True
+
+
+def get_target_conn(device_id=None):
+ """ Get connection for Test Target"""
+ if device_id is None:
+ dev_list = _get_device_ids()
+ device_id = dev_list[0] if len(dev_list) else None
+ return TizenMobile(device_id)
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110 - 1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+""" The process kill for os"""
+
+import os
+import platform
+import signal
+import re
+import ctypes
+
+
+def killall(ppid):
+ """Kill all children process by parent process ID"""
+ os_ver = platform.system()
+ try:
+ if os_ver == "Linux" or os_ver == "Darwin":
+ ppid = str(ppid)
+ pidgrp = []
+
+ def getchildpids(ppid):
+ """Return a list of children process"""
+ command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
+ ppid)
+ pids = os.popen(command).read()
+ pids = pids.split()
+ return pids
+
+ pidgrp.extend(getchildpids(ppid))
+ for pid in pidgrp:
+ pidgrp.extend(getchildpids(pid))
+ # Insert self process ID to PID group list
+ pidgrp.insert(0, ppid)
+ while len(pidgrp) > 0:
+ pid = pidgrp.pop()
+ try:
+ os.kill(int(pid), signal.SIGKILL)
+ except OSError, error:
+ pattern = re.compile('No such process')
+ match = pattern.search(str(error))
+ if not match:
+ print "[ Error: fail to kill pid: %s," \
+ " error: %s ]\n" % (int(pid), error)
+ # kill for windows platform
+ else:
+ kernel32 = ctypes.windll.kernel32
+ handle = kernel32.OpenProcess(1, 0, int(ppid))
+ kernel32.TerminateProcess(handle, 0)
+ except OSError, error:
+ pattern = re.compile('No such process')
+ match = pattern.search(str(error))
+ if not match:
+ print "[ Error: fail to kill pid: %s, error: %s ]\n" \
+ % (int(ppid), error)
+ return None
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Liu,chengtao <liux.chengtao@intel.com>
+"""General Implementation"""
+
+import threading
+import logging
+import logging.handlers
+import sys
+import os
+
+# logger levels
+LEVELS = {"CRITICAL": 50,
+ "ERROR": 40,
+ "WARNING": 30,
+ "INFO": 20,
+ "DEBUG": 10,
+ "NOTSET": 0
+ }
+
+
+class Logger:
+
+ """General Logger Class"""
+ _instance = None
+ _mutex = threading.Lock()
+
+ def __init__(self, level="DEBUG", format_str="%(message)s"):
+ """Generate root logger"""
+ self._logger = logging.getLogger("TCT")
+ self._logger.setLevel(LEVELS[level])
+ self._formatter = logging.Formatter(format_str)
+ self.add_print_logger()
+
+ def add_print_logger(self, level="INFO"):
+ """Generate console writer [StreamHandler]"""
+ writer = logging.StreamHandler(sys.stdout)
+ writer.setLevel(LEVELS[level])
+ writer.setFormatter(self._formatter)
+ self._logger.addHandler(writer)
+
+ @staticmethod
+ def get_logger(level="DEBUG", format_str="%(message)s"):
+ """sinlgeton of Logger"""
+ if Logger._instance is None:
+ Logger._mutex.acquire()
+ if Logger._instance is None:
+ Logger._instance = Logger(level, format_str)
+ else:
+ pass
+ Logger._mutex.release()
+ return Logger._instance
+
+ def debug(self, msg):
+ """debug level message"""
+ if msg is not None:
+ sys.stdout.write(msg + '\r\n')
+ sys.stdout.flush()
+
+ def info(self, msg):
+ """info level message"""
+ if msg is not None:
+ sys.stdout.write(msg + '\r\n')
+ sys.stdout.flush()
+
+ def warning(self, msg):
+ """warning level message"""
+ if msg is not None:
+ self._logger.warning(msg)
+
+ def error(self, msg):
+ """error level message"""
+ if msg is not None:
+ sys.stdout.write(msg + '\r\n')
+ sys.stdout.flush()
+
+ def critical(self, msg):
+ """critical level message"""
+ if msg is not None:
+ self._logger.critical(msg)
+
+
+LOGGER = Logger.get_logger(level=os.environ.get('LOG_LEVEL', 'INFO'))
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+""" string convertor"""
+
+from types import IntType, FloatType, LongType
+import string
+
+
+def str2str(src):
+ """string to printable string"""
+ if isinstance(src, unicode):
+ return src.encode("utf8")
+
+ if isinstance(src, str):
+ accept = string.punctuation + string.letters + string.digits + ' \r\n'
+ return filter(lambda x: x in accept, src)
+
+ return ""
+
+
+def str2val(src):
+ """string to program value"""
+ ret = None
+ try:
+ ret = eval(str2str(src))
+ except:
+ pass
+ return ret
+
+
+def str2bool(src):
+ """string to boolean"""
+ if "TRUE" == str2str(src).upper():
+ return True
+ if "FALSE" == str2str(src).upper():
+ return False
+ return None
+
+
+def str2number(src):
+ """string to boolean"""
+ val = str2val(str2str(src))
+ if type(val) in [IntType, FloatType, LongType]:
+ return val
+ else:
+ return None
+
+
+def str2xmlstr(src):
+ """string to xml string value"""
+ return src.replace('\n', '\\n')
--- /dev/null
+testkit-lite (2.3.22) unstable; urgency=low
+
+ * TCT2.3 Release.
+
+ -- ChengTao Liu <chengtaox.liu@intel.com> Mon, 4 Nov 2013 11:13:11 +0800
--- /dev/null
+Source: testkit-lite
+Section: utils
+Priority: standard
+Maintainer: Cathy Shen <cathy.shen@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
+Standards-Version: 3.9.3
+Homepage: https://github.com/testkit/testkit-lite
+#Vcs-Git: git://git.debian.org/collab-maint/testkit-manager.git
+#Vcs-Browser: http://git.debian.org/?p=collab-maint/testkit-manager.git;a=summary
+
+Package: testkit-lite
+Architecture: all
+Depends: ${misc:Depends}, ${python:Depends}
+XB-Python-Version: ${python:Versions}
+Description: Test runner for test execution.
+
--- /dev/null
+Format: http://dep.debian.net/deps/dep5
+Source: https://github.com/testkit/testkit-lite
+
+Files: *
+Copyright: 2012-2013 Intel Corp.
+License: GPL-2.0
+
+Files: debian/*
+Copyright: 2012-2013 Intel Corp.
+License: GPL-2.0
+
+License: GPL-2.0
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License
+ .
+ This package is distributed in the hope that 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, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+
--- /dev/null
+testkit-lite_2.3.20_all.deb utils standard
--- /dev/null
+#!/bin/sh
+
+# Set permissions
+mkdir /opt/testkit/lite2.4/test_packages
+chmod ugo+rwx -R /opt/testkit/lite2.4
+ln -fs /usr/share/pyshared/commodule /usr/lib/python2.7/dist-packages/commodule
+ln -fs /usr/share/pyshared/testkitlite /usr/lib/python2.7/dist-packages/testkitlite
+
--- /dev/null
+#!/usr/bin/make -f
+
+%:
+ dh $@
+
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitdocdir = /opt/testkit/lite2.4/doc
+dist_testkitdoc_DATA = testkit-lite_user_guide_for_tct.pdf
--- /dev/null
+PKG_NAME := testkit-lite
+SPECFILE = $(addsuffix .spec, $(PKG_NAME))
+PKG_VERSION := $(shell grep '^Version: ' $(SPECFILE)|awk '{print $$2}')
+
+TARBALL := $(PKG_NAME)_$(PKG_VERSION).tar.gz
+
+dsc: $(TARBALL)
+ $(eval MD5=$(shell md5sum $(TARBALL) | sed "s/ / $(shell stat -c '%s' $(TARBALL)) /"))
+ @sed -i 's/^Version:.*/Version: $(PKG_VERSION)/' $(PKG_NAME).dsc
+ @sed -i 's/ [a-f0-9]\+ [0-9]\+ $(PKG_NAME).*tar.*/ $(MD5)/' $(PKG_NAME).dsc
+
+$(TARBALL):
+ cd "$$(git rev-parse --show-toplevel)" \
+ && git archive --prefix $(PKG_NAME)-$(PKG_VERSION)/ HEAD \
+ | gzip > "$(CURDIR)/$(TARBALL)"
+
+clean:
+ rm -f $(PKG_NAME)*.tar.gz
+
+all: clean dsc
+
--- /dev/null
+Source: testkit-lite
+Section: utils
+Priority: standard
+Maintainer: Lei Yang <lei.a.yang@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
+Standards-Version: 3.9.2
+Homepage: https://github.com/testkit/testkit-manager
+Version: 2.3.4
+Files:
+ 82c2118d146839ec9139559f5049d2bf 6361871 testkit-lite_2.3.4.tar.gz
+
--- /dev/null
+Summary: TCT-Lite
+Name: testkit-lite
+Version: 2.3.22
+Release: 1
+License: GPLv2
+Group: Applications/System
+Source: %{name}_%{version}.tar.gz
+
+BuildRequires: python-distribute
+
+%{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+
+%description
+testkit-lite is a test runner with command-line interface.It has the following functions
+1. Accepts .xml test case descriptor files as input.
+2. drives automatic test execution.
+3. provide multiple options to meet various test requirements.
+
+%prep
+%setup -q
+
+%build
+
+%install
+python setup.py install --prefix=%{_prefix} --root=%{buildroot}
+# remove tests
+rm -rf %{buildroot}/%{python_sitelib}/tests
+
+%clean
+rm -rf %{buildroot}
+
+%post
+# Set permissions
+chmod ugo+rwx /opt/testkit/lite2.4
+
+%files
+%{python_sitelib}/testkitlite/*
+%{python_sitelib}/commodule/*
+%{python_sitelib}/testkit_lite-*.egg-info/*
+/opt/testkit/lite2.4/VERSION
+%{_bindir}/testkit-lite
+%defattr(-,root,root)
+
+%doc
+/opt/testkit/lite2.4/testkit-lite_user_guide_for_tct.pdf
+
+%changelog
--- /dev/null
+#!/usr/bin/python
+
+from setuptools import setup, find_packages
+
+setup(
+ name = "testkit-lite",
+ description = "Test runner for test execution",
+ url = "https://github.com/testkit/testkit-lite",
+ author = "Cathy Shen",
+ author_email = "cathy.shen@intel.com",
+ version = "2.3.22",
+ include_package_data = True,
+ data_files = [('/opt/testkit/lite2.4/',
+ ('VERSION', 'doc/testkit-lite_user_guide_for_tct.pdf'))],
+ scripts = ('testkit-lite',),
+ packages = find_packages(),
+)
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+# USA.
+#
+# Authors:
+# Jing,Wang <jing.j.wang@intel.com>
+# Yuanyuan,Zou <zouyuanx@intel.com>
+""" testkit lite tools"""
+
+import os
+import sys
+import traceback
+import platform
+import ConfigParser
+import re
+import xml.etree.ElementTree as etree
+from optparse import OptionParser, make_option
+from datetime import datetime
+
+# import logger
+try:
+ from commodule.log import LOGGER
+except ImportError, err:
+ print "[ Error: loading logging failed, error: %s ]\n" % err
+ print "try to run command " \
+ "'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and " \
+ "'export PYTHONPATH=/usr/share/pyshared/' to resolve this issue"
+ sys.exit(1)
+
+# import process kill
+try:
+ from testkitlite.common.process_killall import kill_testkit_lite, clean_testxml
+except ImportError, err:
+ LOGGER.error("[ Error: loading module killall failed, error: %s ]\n" % err)
+ LOGGER.info("try to run command \
+'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and \
+'export PYTHONPATH=/usr/share/pyshared/' to resolve this issue")
+ sys.exit(1)
+
+# get platform version info
+os_ver = platform.system()
+JOIN = os.path.join
+EXISTS = os.path.exists
+DIRNAME = os.path.dirname
+BASENAME = os.path.basename
+ABSPATH = os.path.abspath
+SPLIT = os.path.split
+ISLINK = os.path.islink
+
+NOW = datetime.now().strftime("%Y-%m-%d_%H_%M_%S")+ str(os.getpid())
+TESTKIT_DIR = "/opt/testkit/lite2.4"
+if not os_ver == "Linux" and not os_ver == "Darwin":
+ TESTKIT_DIR = DIRNAME(ABSPATH(__file__))
+ sys.path += [JOIN(TESTKIT_DIR)]
+ TESTKIT_DIR = JOIN(TESTKIT_DIR, "results")
+
+LOG_DIR = TESTKIT_DIR
+NOW_DIR = JOIN(LOG_DIR, NOW)
+PID_FILE = JOIN(NOW_DIR, "pid.log")
+TEST_PACKAGES_DIR = JOIN(NOW_DIR, "test_packages")
+
+if not EXISTS(NOW_DIR):
+ os.makedirs(NOW_DIR)
+
+#LOGGER.info("\nNOW:%s\n NOW_DIR:%s\n TESTKIT_DIR:%s\n LOG_DIR:%s\n PID_FILE:%s\n TEST_PACKAGES_DIR:%s\n"% (NOW, NOW_DIR, TESTKIT_DIR, LOG_DIR, PID_FILE, TEST_PACKAGES_DIR))
+COMMON_FILTERS = {
+ "suite": [],
+ "set": [],
+ "priority": [],
+ "id": [],
+ "type": [],
+ "component": []}
+down_status = False
+remote_test = False
+can_merge_result = False
+
+# start testkit-lite in Singleton mode
+#kill_testkit_lite(PID_FILE)
+
+if not os_ver == "Linux" and not os_ver == "Darwin":
+ try:
+ #LOGGER.info("\n[ makedirs LOG_DIR: %s ]\n" % LOG_DIR)
+ if not EXISTS(LOG_DIR):
+ os.makedirs(LOG_DIR)
+ except OSError, err:
+ LOGGER.error("[ Error: create results directory:"
+ " %s failed, error: %s ]\n" % (LOG_DIR, err))
+
+try:
+ #LOGGER.info("\n[ Opening PID_FILE: %s ]\n" % PID_FILE)
+ with open(PID_FILE, "w") as fd:
+ PID = str(os.getpid())
+ fd.writelines(PID + '\n')
+except OSError, e:
+ LOGGER.error("[ Error: can't create pid log file: %s, error: %s ]\n" %
+ (PID_FILE, err))
+ sys.exit(1)
+
+try:
+ os.chmod(PID_FILE, 0666)
+except OSError:
+ pass
+
+# detect version option
+if "--version" in sys.argv:
+ try:
+ CONFIG = ConfigParser.ConfigParser()
+ if platform.system() == "Linux":
+ CONFIG.read('/opt/testkit/lite2.4/VERSION')
+ else:
+ VERSION_FILE = JOIN(sys.path[0], 'VERSION')
+ CONFIG.read(VERSION_FILE)
+ VERSION = CONFIG.get('public_version', 'version')
+ LOGGER.info("V%s" % VERSION)
+ except ConfigParser.Error, err:
+ LOGGER.error(
+ "[ Error: fail to parse version info, error: %s ]\n" % err)
+ sys.exit(1)
+
+# detect internal version option
+if "--internal-version" in sys.argv:
+ try:
+ CONFIG = ConfigParser.ConfigParser()
+ if platform.system() == "Linux":
+ CONFIG.read('/opt/testkit/lite2.4/VERSION')
+ else:
+ VERSION_FILE = JOIN(sys.path[0], 'VERSION')
+ CONFIG.read(VERSION_FILE)
+ VERSION = CONFIG.get('internal_version', 'version')
+ print VERSION
+ except ConfigParser.Error, err:
+ print "[ Error: fail to parse version info, error: %s ]\n" % err
+ sys.exit(1)
+
+
+# init test engine here
+try:
+ from testkitlite.engines.default.runner import TRunner
+ from commodule.connector import Connector
+except ImportError, err:
+ LOGGER.error("[ Error: loading test engine failed, error: %s ]\n" % err)
+ LOGGER.info("try to run command "
+ "'export PYTHONPATH=/usr/lib/python2.7/dist-packages' and "
+ "'export PYTHONPATH=/usr/share/pyshared/'to resolve this issue")
+ sys.exit(1)
+
+
+def varnarg(option, opt_str, value, parser):
+ """ parser srg"""
+ value = []
+ import re
+ for arg in parser.rargs:
+ if re.search('^--.+', arg) or \
+ re.search('^-[\D]', arg):
+ break
+ value.append(arg)
+
+ del parser.rargs[:len(value)]
+ setattr(parser.values, option.dest, value)
+
+try:
+ OPTION_LIST = [
+ make_option("-f", "--testxml", dest="testxml",
+ action="callback", callback=varnarg,
+ help="Specify the path of test definition file (tests.xml)."
+ " If run more one test package,just list the all the path "
+ " of \"tests.xml\" and separate with a whitespace"),
+ make_option("-D", "--dryrun", dest="bdryrun",
+ action="store_true",
+ help="Dry-run the selected test cases"),
+ make_option("-M", "--manual-only", dest="bmanualonly",
+ action="store_true",
+ help="Enable only manual tests"),
+ make_option("-A", "--auto-only", dest="bautoonly",
+ action="store_true",
+ help="Enable only auto tests"),
+ make_option("-o", "--output", dest="resultfile",
+ help="Specify output file for result xml. \
+ If more than one testxml provided, \
+ results will be merged together to this output file"),
+ make_option("-e", dest="exttest", action="store",
+ help="Launch external test with a launcher,\
+ supports browser or other web-runtime"),
+ make_option("--version", dest="version_info", action="store_true",
+ help="Show version information"),
+ make_option("--internal-version", dest="internal_version_info",
+ action="store_true",
+ help="Show internal version information"),
+ make_option("--deviceid", dest="device_serial", action="store",
+ help="set device serial information"),
+ make_option("--testprefix", dest="test_prefix", action="store",
+ help="set prefix for test case entry"),
+ make_option("--comm", dest="commodule", action="store",
+ help="set commodule by default,"
+ "set \"localhost\" for local web testing"),
+ make_option("--capability", dest="capability", action="store",
+ help="set platform for sepecfic device capability"),
+ make_option("--quit", dest="quit", action="store_true",
+ help="quit testkit-lite"),
+ make_option("--debug", dest="debug", action="store_true",
+ help="run in debug mode,more log information print out"),
+ make_option("--rerun", dest="rerun", action="store_true",
+ help="check if rerun test mode"),
+ make_option("--non-active", dest="non_active", action="store_true",
+ help="Disable the ability to set the result of \
+ core manual cases from the console"),
+ make_option("--tizen-version", dest="tizenversion", action="callback", callback=varnarg, help="set tizen version infomation"),
+ make_option("--skip-tc", dest="skip_tc", action="callback", callback=varnarg, help="Specify the testcase id for exclude from the test"),
+ make_option("--stub-port", dest="stubport", action="callback", callback=varnarg, help = "set testkit-stub port number")
+
+ ]
+
+ OPTION_LIST.extend([
+ make_option("--%s" % flt,
+ dest="w%s" % flt, action="callback", callback=varnarg,
+ help="Select the specified filter-rules : %s" % flt)
+ for flt in COMMON_FILTERS])
+
+ try:
+ # untrusted behaviour of %%prog
+ USAGE = "%%prog [options] -f [prefix:]\"<somewhere/test.xml>\" -e \
+\"<launcher-name>\"\n\
+forms: %%prog -f [prefix:]\"<somewhere>/test.xml\"\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" -D\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" -A\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" -M\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --type \"smoke\"\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --component \"TizenAPI/Communication/Messaging\"\n\
+ %%prog -f [prefix:]\"<somewhere>/test1.xml <somewhere>/test2.xml \
+<somewhere>/test3.xml\" \n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" -D -A \ --capability <capability file> --comm <commoduletype>\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" -D -A \
+...\n\
+exmaples: \n\
+ run a web test package from device side with device WRT (it is default): \n\
+ %%prog -f device:\"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -e \
+'WRTLauncher' -A \n\
+ run a web test package from local path with chrome browser: \n\
+ %%prog -f \"/usr/share/webapi-webkit-tests/tests.xml\" -e \
+'<somewhere>/chrome-startup' -A --comm localhost \n\
+\n\
+Note: \n\
+ 1) Proxy settings should be disabled when execute webapi packages\n\
+ 2) TestLog is stored to %s/latest\n\
+ 3) %%prog enables both auto and manual tests by default\n\
+ 4) Obviously -A and -M are conflict options\n\
+ 5) -e option does not support -D mode\n\
+ 6) The test cases' order in the result files might be arbitrary,\
+when running same tests.xml with same options. This is caused \
+by python's API 'getiterator' from module 'xml.etree.ElementTree'\n\
+ 7) run command 'testkit-lite', \
+ it might not be able to locate module 'testkitlite.engines.\
+default.runner', \
+ run command 'export PYTHONPATH=/usr/share/pyshared/' \
+ run command 'export PYTHONPATH=/usr/lib/python2.7/dist-packages' \
+ to resolve this issue" % (LOG_DIR)
+ except Exception:
+ USAGE = None
+
+ # detect non-params
+ if len(sys.argv) == 1:
+ sys.argv.append("-h")
+
+ PARSERS = OptionParser(option_list=OPTION_LIST, usage=USAGE)
+
+ (OPTIONS, ARGS) = PARSERS.parse_args()
+ # detect quit action
+ if OPTIONS.quit:
+ try:
+ LOGGER.info("[ Quit testkit-lite now ]")
+ kill_testkit_lite(PID_FILE)
+ except Exception, err:
+ LOGGER.error("[ Error: fail to kill existing testkit-lite,"
+ " error: %s ]\n" % err)
+ sys.exit(1)
+
+ # detect conflict
+ if OPTIONS.bautoonly and OPTIONS.bmanualonly:
+ raise ValueError("-A and -M are conflict")
+ if OPTIONS.commodule:
+ if OPTIONS.commodule == 'localhost' and "device:" in OPTIONS.testxml[0]:
+ raise ValueError("For single mode, pls set local file to test ")
+ COMMODULE_TYPE = OPTIONS.commodule
+ else:
+ COMMODULE_TYPE = "tizenmobile"
+
+ CONNECTOR = Connector({"testmode": COMMODULE_TYPE, "deviceid":OPTIONS.device_serial}).get_connector()
+ if CONNECTOR == None:
+ LOGGER.error("[ Error: init commodule error... ]\n")
+ sys.exit(1)
+
+ # create runner
+ RUNNER = TRunner(CONNECTOR)
+ RUNNER.set_pid_log(PID_FILE)
+
+ # apply all options
+ RUNNER.set_global_parameters(OPTIONS)
+
+ if OPTIONS.tizenversion is None:
+ LOGGER.error("[ Error : input your tizen version ]\n")
+ sys.exit(1)
+ else :
+ tizenver = OPTIONS.tizenversion[0]
+ VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d"
+ pa = re.compile(VER_PATTERN, re.I)
+ ma = pa.match(tizenver)
+ if ma is None:
+ LOGGER.error("A required \"/opt/tct/"+tizenver+" could not be found.\n")
+ sys.exit(1)
+
+ RUNNER.set_tizenversion(tizenver)
+
+ if OPTIONS.stubport is not None:
+ port = OPTIONS.stubport[0]
+ RUNNER.set_stubport(port)
+
+ if OPTIONS.skip_tc is not None:
+ RUNNER.set_skip_tc(OPTIONS.skip_tc)
+
+ # set capability
+ if OPTIONS.capability:
+ GET_CAPABILITY_STATUS = RUNNER.get_capability(OPTIONS.capability)
+ if not GET_CAPABILITY_STATUS:
+ sys.exit(1)
+
+ if "device:" in OPTIONS.testxml[0]:
+ remote_test = True
+ try:
+ #LOGGER.info("\n[ makedirs TEST_PACKAGES_DIR: %s ]\n" % TEST_PACKAGES_DIR)
+ if not EXISTS(TEST_PACKAGES_DIR):
+ os.makedirs(TEST_PACKAGES_DIR)
+ except OSError, err:
+ LOGGER.error("[ Error: "
+ "can't create test package directory: %s, error: %s ]\n" %
+ (TEST_PACKAGES_DIR, err))
+ sys.exit(1)
+ REMOTE_TESTLITS = OPTIONS.testxml[0]
+ REMOTE_TESTLITS = REMOTE_TESTLITS.split(':')[1]
+ TESTLISTARRARY = REMOTE_TESTLITS.split()
+ LOCALARRY = []
+
+ for remote_file in TESTLISTARRARY:
+ tmp_remote_file = SPLIT(remote_file)
+ tmp_remote_folder = BASENAME(tmp_remote_file[0])
+ tmp_remote_test_xml = JOIN(
+ tmp_remote_folder, tmp_remote_file[1])
+ local_test_package = JOIN(
+ TEST_PACKAGES_DIR, tmp_remote_test_xml)
+ down_status = RUNNER.connector.download_file(remote_file, local_test_package)
+ if not down_status:
+ LOGGER.error("can not get test definition file, pls check file on device:%s"
+ % remote_file)
+ sys.exit(1)
+ LOCALARRY.append(local_test_package)
+ OPTIONS.testxml = LOCALARRY
+ else:
+ if len(OPTIONS.testxml) == 1:
+ i = 0
+ start = 0
+ end = 0
+ LOCAL_TESTLISTS= []
+ temp_xml = OPTIONS.testxml[0]
+ while(i < len(temp_xml)):
+ tmp = temp_xml[i:len(temp_xml)]
+ if ".xml" in tmp :
+ index = tmp.index(".xml")+4+i
+ end = index
+ i=index+1
+ LOCAL_TESTLISTS.append(temp_xml[start:end])
+ start = index+1
+ else:
+ print 'no xml found'
+ break
+ OPTIONS.testxml = LOCAL_TESTLISTS
+
+ # apply filter
+ WFILTERS = {}
+ for flt in COMMON_FILTERS:
+ if eval('OPTIONS.w%s' % flt):
+ WFILTERS[flt] = eval('OPTIONS.w%s' % flt)
+ RUNNER.add_filter_rules(**WFILTERS)
+
+ if not OPTIONS.testxml:
+ LOGGER.error("[ Error: not specify a test xml... ]\n")
+ sys.exit(1)
+
+ # 1) prepare log dir
+ if os_ver == "Linux" or os_ver == "Darwin":
+ SESSION = datetime.today().isoformat('-')+str(os.getpid())+"_session"
+ else:
+ SESSION = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")+str(os.getpid())+"_session"
+ CURRENT_LOG_DIR = JOIN(LOG_DIR, SESSION)
+ LATEST_DIR = JOIN(LOG_DIR, "latest")
+ try:
+ if EXISTS(LATEST_DIR):
+ os.remove(LATEST_DIR)
+ if ISLINK(LATEST_DIR):
+ os.remove(LATEST_DIR)
+ os.makedirs(CURRENT_LOG_DIR)
+ if os.name == "posix":
+ os.symlink(CURRENT_LOG_DIR, LATEST_DIR)
+ except IOError, err:
+ LOGGER.error("[ Error: create session log directory: "
+ "%s failed, error: %s ]\n" % (CURRENT_LOG_DIR, err))
+ except OSError, err:
+ LOGGER.error("error : %s" % err)
+
+ finally:
+ if not EXISTS(CURRENT_LOG_DIR):
+ os.makedirs(CURRENT_LOG_DIR)
+
+ # 2) prepare run test
+ # run more than one tests.xml
+ # 1. run all auto cases from the xmls
+ # 2. run all manual cases from the xmls
+ TESTXMLS = set(OPTIONS.testxml)
+ for t in TESTXMLS:
+ if EXISTS(t):
+ filename = t
+ filename = os.path.splitext(filename)[0]
+ if os_ver == "Linux" or os_ver == "Darwin":
+ if not filename.startswith('/'):
+ LOGGER.error("[ Error:"
+ " xml file %s should start with '/' ]" % filename)
+ sys.exit(1)
+ else:
+ filename = filename.split('/')[-2]
+ if filename == "":
+ LOGGER.error("[ Error:"
+ " unable to find package name from %s ]" % t)
+ sys.exit(1)
+ else:
+ filename = filename.split('\\')[-2]
+ filename = "%s.total" % BASENAME(filename)
+ resultfile = "%s.xml" % filename
+ resultfile = JOIN(CURRENT_LOG_DIR, resultfile)
+ try:
+ ep = etree.parse(t)
+ suiteparent = ep.getroot()
+ except etree.ParseError:
+ LOGGER.error("[ Error: no case found in testxml, "
+ "pls check the test package ]\n")
+ sys.exit(1)
+ no_test_definition = 1
+ for tf in ep.getiterator('test_definition'):
+ no_test_definition = 0
+ if no_test_definition:
+ suiteparent = etree.Element('test_definition')
+ suiteparent.tail = "\n"
+ for suite in ep.getiterator('suite'):
+ suite.tail = "\n"
+ suiteparent.append(suite)
+ if OPTIONS.bautoonly:
+ WFILTERS['execution_type'] = ["auto"]
+ RUNNER.add_filter_rules(**WFILTERS)
+ if OPTIONS.bmanualonly:
+ WFILTERS['execution_type'] = ["manual"]
+ RUNNER.add_filter_rules(**WFILTERS)
+ RUNNER.apply_filter(suiteparent)
+ # just leave suite and set for merge result
+ for suite in ep.getiterator('suite'):
+ for tset in suite.getiterator('set'):
+ for testcase in tset.getiterator('testcase'):
+ tset.remove(testcase)
+ try:
+ #LOGGER.info("\n[ Opening resultfile: %s ]\n" % resultfile)
+ with open(resultfile, 'w') as output:
+ tree = etree.ElementTree(element=suiteparent)
+ tree.write(output)
+ except IOError, err:
+ LOGGER.error(
+ "[ Error: create filtered total result file: %s failed, "
+ "error: %s ]\n" % (resultfile, err))
+ else:
+ print "[ Have no test xml found ]"
+ sys.exit(1)
+ START_TIME = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
+ if not OPTIONS.bautoonly:
+ if OPTIONS.bmanualonly:
+ for t in TESTXMLS:
+ try:
+ WFILTERS['execution_type'] = ["manual"]
+ RUNNER.add_filter_rules(**WFILTERS)
+ RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+ except IOError, err:
+ LOGGER.error("[ Error: prepare_run test xml: "
+ "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+ else:
+ for t in TESTXMLS:
+ try:
+ WFILTERS['execution_type'] = ["auto"]
+ RUNNER.add_filter_rules(**WFILTERS)
+ RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+ except IOError, err:
+ LOGGER.error("[ Error: prepare_run test xml: "
+ "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+ for t in TESTXMLS:
+ try:
+ WFILTERS['execution_type'] = ["manual"]
+ RUNNER.add_filter_rules(**WFILTERS)
+ RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+ except IOError, err:
+ LOGGER.error("[ Error: prepare_run test xml: "
+ "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+ else:
+ for t in TESTXMLS:
+ try:
+ WFILTERS['execution_type'] = ["auto"]
+ RUNNER.add_filter_rules(**WFILTERS)
+ RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+ except IOError, err:
+ clean_testxml(TESTXMLS, remote_test)
+ LOGGER.error("[ Error: prepare_run test xml: "
+ "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+
+ try:
+ can_merge_result = True
+ RUNNER.run_case(CURRENT_LOG_DIR)
+ except Exception, err:
+ clean_testxml(TESTXMLS, remote_test)
+ traceback.print_exc()
+ LOGGER.error("[ Error: run_test_case failed ,error: %s ]\n" % err)
+ try:
+ RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+ clean_testxml(TESTXMLS, remote_test)
+ LOGGER.info("[ all tasks for testkit lite are accomplished, goodbye ]")
+ except Exception, err:
+ traceback.print_exc()
+ clean_testxml(TESTXMLS,remote_test)
+ LOGGER.error("[ Error: merge_resultfile "
+ "failed,error: %s, goodbye ]\n" % err)
+
+except KeyboardInterrupt, err:
+ if RUNNER.session_id:
+ RUNNER.finalize_test(RUNNER.session_id)
+ if can_merge_result:
+ RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+ if down_status:
+ clean_testxml(OPTIONS.testxml, remote_test)
+ LOGGER.info("\n[ exiting testkit-lite on user cancel, goodbye ]\n")
+ sys.exit(1)
+except Exception, err:
+ if RUNNER.session_id:
+ RUNNER.finalize_test(RUNNER.session_id)
+ if can_merge_result:
+ RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+ if down_status:
+ clean_testxml(OPTIONS.testxml, remote_test)
+ LOGGER.error("\n[ Error: exiting testkit-lite "
+ "by catching a critical error: %s, goodbye ]\n" % err)
+ traceback.print_exc()
+ sys.exit(1)
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+SUBDIRS = common engines
+
+testkitlitedir = /usr/lib/python2.7/dist-packages/testkitlite
+dist_testkitlite_SCRIPTS = __init__.py
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitlitecommondir = /usr/lib/python2.7/dist-packages/testkitlite/common
+dist_testkitlitecommon_SCRIPTS = *.py
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+""" kill testkit-lite """
+import os
+import platform
+import signal
+import re
+import ctypes
+from commodule.log import LOGGER
+from commodule.killall import killall
+
+
+def kill_testkit_lite(pid_file):
+ """ kill testkit lite"""
+ try:
+ with open(pid_file, "r") as pidfile:
+ pid = pidfile.readline().rstrip("\n")
+ if pid:
+ killall(pid)
+ except IOError, error:
+ pattern = re.compile('No such file or directory|No such process')
+ match = pattern.search(str(error))
+ if not match:
+ LOGGER.info("[ Error: fail to kill existing testkit-lite, "\
+ "error: %s ]\n" % error)
+ return None
+
+def clean_testxml(testxmls,remote_test):
+ """clean all test xmls"""
+ if remote_test:
+ EXISTS = os.path.exists
+ for testxml in testxmls:
+ if EXISTS(testxml):
+ fd_name = os.path.dirname(testxml)
+ os.remove(testxml)
+ os.rmdir(fd_name)
+ return None
\ No newline at end of file
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+SUBDIRS = default
+
+testkitliteenginesdir = /usr/lib/python2.7/dist-packages/testkitlite/engines
+dist_testkitliteengines_SCRIPTS = __init__.py
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitliteenginesdefaultdir = /usr/lib/python2.7/dist-packages/testkitlite/engines/default
+dist_testkitliteenginesdefault_SCRIPTS = *.py
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.,
+# 51 Franklin Street,
+# Fifth Floor,
+# Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+# Yuanyuan,Zou <zouyuanx@intel.com>
+""" prepare run , split xml ,run case , merge result """
+
+import os
+import platform
+import time
+import sys
+import traceback
+import collections
+import string
+import random
+from datetime import datetime
+from shutil import copyfile
+import xml.etree.ElementTree as etree
+import ConfigParser
+from tempfile import mktemp
+from shutil import move
+from os import remove
+from commodule.log import LOGGER
+from commodule.str2 import str2xmlstr
+
+
+from .worker import TestWorker
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = ConfigParser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+DEVICE_EXECUTION_MODE_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
+DEVICE_SUITE_TARGET_30_STR = "{DEVICE_SUITE_TARGET_30}"
+DEVICE_EXECUTION_MODE_30_STR = "{DEVICE_EXECUTION_MODE_30}"
+
+JOIN = os.path.join
+DIRNAME = os.path.dirname
+BASENAME = os.path.basename
+EXISTS = os.path.exists
+ABSPATH = os.path.abspath
+
+
+class TRunner:
+
+ """
+ Parse the testdefinition.xml files.
+ Apply filter for each run.
+ Conduct tests execution.
+ """
+
+ def __init__(self, connector):
+ """ init all self parameters here """
+ # dryrun
+ self.bdryrun = False
+ # non_active
+ self.non_active = False
+ # result file
+ self.resultfile = None
+ # external test
+ self.external_test = None
+ # filter rules
+ self.filter_rules = None
+ self.debug = False
+ self.resultfiles = set()
+ self.core_auto_files = []
+ self.core_manual_files = []
+ self.skip_all_manual = False
+ self.testsuite_dict = {}
+ self.exe_sequence = []
+ self.testresult_dict = {"pass": 0, "fail": 0,
+ "block": 0, "not_run": 0}
+ self.current_test_xml = "none"
+ self.first_run = True
+ self.deviceid = None
+ self.session_id = None
+ self.pid_log = None
+ self.set_parameters = {}
+ self.connector = connector
+ self.testworker = TestWorker(connector)
+ self.stub_name = "testkit-stub"
+ self.capabilities = {}
+ self.has_capability = False
+ self.rerun = False
+ self.test_prefix = ""
+ self.tizenV = None
+ self.skip_tc = None
+ self.stub_port = "8000"
+
+ def set_global_parameters(self, options):
+ "get all options "
+ # apply dryrun
+ if options.bdryrun:
+ self.bdryrun = options.bdryrun
+ # Disable set the result of core manual cases from the console
+ if options.non_active:
+ self.non_active = options.non_active
+ # apply user specify test result file
+ if options.resultfile:
+ self.resultfile = options.resultfile
+ # set the external test WRTLauncher
+ if options.exttest:
+ self.external_test = options.exttest
+ if options.debug:
+ self.debug = options.debug
+ if options.rerun:
+ self.rerun = options.rerun
+ if options.test_prefix:
+ self.test_prefix = options.test_prefix
+ if options.device_serial:
+ self.deviceid = options.device_serial
+
+ def set_pid_log(self, pid_log):
+ """ get pid_log file """
+ self.pid_log = pid_log
+
+ def add_filter_rules(self, **kargs):
+ """
+ kargs: key:values - "":["",]
+ """
+ self.filter_rules = kargs
+
+ def set_session_id(self, session_id):
+ """ set the set test session id which is get form com_module """
+ self.session_id = session_id
+
+ def set_stubport(self, stubport):
+ self.stub_port = stubport
+
+ def set_tizenversion(self, _tizenV):
+ self.tizenV = _tizenV
+ self.testworker.set_TizenVersion(self.tizenV)
+
+ def set_skip_tc(self, skip_tc):
+ self.skip_tc = skip_tc
+
+ def set_capability(self, capabilities):
+ """ set capabilitys """
+ self.capabilities = capabilities
+ self.has_capability = True
+
+ def prepare_run(self, testxmlfile, resultdir=None):
+ """
+ testxmlfile: target testxml file
+ execdir and resultdir: should be the absolute path since TRunner
+ is the common lib
+ """
+ # resultdir is set to current directory by default
+ if not resultdir:
+ resultdir = os.getcwd()
+ ok_prepare = True
+ if ok_prepare:
+ try:
+ filename = testxmlfile
+ filename = os.path.splitext(filename)[0]
+ if platform.system() == "Linux":
+ filename = filename.split('/')[-2]
+ else:
+ filename = filename.split('\\')[-2]
+ if self.filter_rules["execution_type"] == ["manual"]:
+ resultfile = "%s.manual.xml" % filename
+ else:
+ resultfile = "%s.auto.xml" % filename
+ resultfile = JOIN(resultdir, resultfile)
+ if not EXISTS(resultdir):
+ os.mkdir(resultdir)
+ LOGGER.info("[ analysis test xml file: %s ]" % resultfile)
+ self.__prepare_result_file(testxmlfile, resultfile)
+ self.__split_test_xml(resultfile, resultdir)
+ except IOError as error:
+ LOGGER.error(error)
+ ok_prepare &= False
+ return ok_prepare
+
+ def __split_test_xml(self, resultfile, resultdir):
+ """ split_test_xml into auto and manual"""
+ casefind = etree.parse(resultfile).getiterator('testcase')
+ if casefind:
+ test_file_name = "%s" % BASENAME(resultfile)
+ test_file_name = os.path.splitext(test_file_name)[0]
+ self.__splite_external_test(
+ resultfile, test_file_name, resultdir)
+
+ def __splite_core_test(self, resultfile):
+ """select core test"""
+ if self.filter_rules["execution_type"] == ["auto"]:
+ self.core_auto_files.append(resultfile)
+ else:
+ self.core_manual_files.append(resultfile)
+ self.resultfiles.add(resultfile)
+
+ def __splite_external_test(self, resultfile, test_file_name, resultdir):
+ """select external_test"""
+ testsuite_dict_value_list = []
+ testsuite_dict_add_flag = 0
+ filename_diff = 1
+
+ parser = etree.parse(resultfile)
+ for tsuite in parser.getiterator('suite'):
+ root = etree.Element('test_definition')
+ suitefilename = os.path.splitext(resultfile)[0]
+ suitefilename += ".suite_%s.xml" % filename_diff
+ suitefilename = JOIN(resultdir, suitefilename)
+ tsuite.tail = "\n"
+ root.append(tsuite)
+ try:
+ with open(suitefilename, 'w') as output:
+ tree = etree.ElementTree(element=root)
+ tree.write(output)
+ except IOError as error:
+ LOGGER.error("[ Error: create filtered result file: %s failed,\
+ error: %s ]" % (suitefilename, error))
+ case_suite_find = etree.parse(
+ suitefilename).getiterator('testcase')
+ if case_suite_find:
+ if tsuite.get('launcher'):
+ if tsuite.get('launcher').find('WRTLauncher'):
+ self.__splite_core_test(suitefilename)
+ else:
+ testsuite_dict_value_list.append(suitefilename)
+ if testsuite_dict_add_flag == 0:
+ self.exe_sequence.append(test_file_name)
+ testsuite_dict_add_flag = 1
+ self.resultfiles.add(suitefilename)
+ else:
+ if self.filter_rules["execution_type"] == ["auto"]:
+ self.core_auto_files.append(suitefilename)
+ else:
+ self.core_manual_files.append(suitefilename)
+ self.resultfiles.add(suitefilename)
+ filename_diff += 1
+ if testsuite_dict_add_flag:
+ self.testsuite_dict[test_file_name] = testsuite_dict_value_list
+
+ def __prepare_result_file(self, testxmlfile, resultfile):
+ """ write the test_xml content to resultfile"""
+ try:
+ parse_tree = etree.parse(testxmlfile)
+ suiteparent = parse_tree.getroot()
+ no_test_definition = 1
+ if parse_tree.getiterator('test_definition'):
+ no_test_definition = 0
+ if no_test_definition:
+ suiteparent = etree.Element('test_definition')
+ suiteparent.tail = "\n"
+ for suite in parse_tree.getiterator('suite'):
+ suite.tail = "\n"
+ suiteparent.append(suite)
+ self.apply_filter(suiteparent)
+ try:
+ with open(resultfile, 'w') as output:
+ tree = etree.ElementTree(element=suiteparent)
+ tree.write(output)
+ except IOError as error:
+ LOGGER.error("[ Error: create filtered result file: %s failed,\
+ error: %s ]" % (resultfile, error))
+ except IOError as error:
+ LOGGER.error(error)
+ return False
+
+ def run_case(self, latest_dir):
+ """ run case """
+ # run core auto cases
+ self.__run_core_auto()
+
+ # run webAPI cases
+ self.__run_webapi_test(latest_dir)
+
+ # run core manual cases
+ self.__run_core_manual()
+
+ def __run_core_auto(self):
+ """ core auto cases run"""
+ self.core_auto_files.sort()
+ for core_auto_file in self.core_auto_files:
+ temp_test_xml = os.path.splitext(core_auto_file)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml += ".auto"
+ # print identical xml file name
+ if self.current_test_xml != temp_test_xml:
+ time.sleep(3)
+ LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+ self.current_test_xml = temp_test_xml
+ self.__run_with_commodule(core_auto_file)
+
+ def __run_core_manual(self):
+ """ core manual cases run """
+ self.core_manual_files.sort()
+ for core_manual_file in self.core_manual_files:
+ temp_test_xml = os.path.splitext(core_manual_file)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml += ".manual"
+ # print identical xml file name
+ if self.current_test_xml != temp_test_xml:
+ time.sleep(3)
+ LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+ self.current_test_xml = temp_test_xml
+ if self.non_active:
+ self.skip_all_manual = True
+ else:
+ self.__run_with_commodule(core_manual_file)
+
+ def __run_webapi_test(self, latest_dir):
+ """ run webAPI test"""
+ if self.bdryrun:
+ LOGGER.info("[ WRTLauncher mode does not support dryrun ]")
+ return True
+
+ list_auto = []
+ list_manual = []
+ for i in self.exe_sequence:
+ if i[-4::1] == "auto":
+ list_auto.append(i)
+ if i[-6::1] == "manual":
+ list_manual.append(i)
+ list_auto.sort()
+ list_manual.sort()
+ self.exe_sequence = []
+ self.exe_sequence.extend(list_auto)
+ self.exe_sequence.extend(list_manual)
+
+ for webapi_total_file in self.exe_sequence:
+ for webapi_file in self.testsuite_dict[webapi_total_file]:
+ # print identical xml file name
+ if self.current_test_xml != \
+ JOIN(latest_dir, webapi_total_file):
+ time.sleep(3)
+ LOGGER.info("\n[ testing xml: %s.xml ]\n"
+ % JOIN(latest_dir, webapi_total_file))
+ self.current_test_xml = JOIN(latest_dir, webapi_total_file)
+
+ self.__run_with_commodule(webapi_file)
+
+ def __run_with_commodule(self, webapi_file):
+ """run_with_commodule,Initialization,check status,get result"""
+ try:
+ # prepare test set list
+ test_xml_set_list = self.__split_xml_to_set(webapi_file)
+ # create temporary parameter
+ for test_xml_set in test_xml_set_list:
+ LOGGER.info("\n[ run set: %s ]" % test_xml_set)
+ # prepare the test JSON
+ self.__prepare_external_test_json(test_xml_set)
+
+ # init test here
+ init_status = self.__init_com_module(test_xml_set)
+ if not init_status:
+ continue
+ # send set JSON Data to com_module
+ self.testworker.run_test(
+ self.session_id, self.set_parameters)
+ while True:
+ time.sleep(1)
+ # check the test status ,if the set finished,get
+ # the set_result,and finalize_test
+ if self.__check_test_status():
+ set_result = self.testworker.get_test_result(
+ self.session_id)
+ # write_result to set_xml
+ self.__write_set_result(
+ test_xml_set, set_result)
+ # shut down server
+ self.finalize_test(self.session_id)
+ break
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: fail to run webapi test xml, error: %s ]" % error)
+
+ def __split_xml_to_set(self, webapi_file):
+ """split xml by <set>"""
+
+ LOGGER.debug("[ split xml: %s by <set> ]" % webapi_file)
+ LOGGER.debug("[ this might take some time, please wait ]")
+ set_number = 1
+ test_xml_set_list = []
+ self.resultfiles.discard(webapi_file)
+ test_xml_temp = etree.parse(webapi_file)
+ for test_xml_temp_suite in test_xml_temp.getiterator('suite'):
+ while set_number <= len(test_xml_temp_suite.getiterator('set')):
+ copy_url = os.path.splitext(webapi_file)[0]
+ copy_url += "_set_%s.xml" % set_number
+ copyfile(webapi_file, copy_url)
+ test_xml_set_list.append(copy_url)
+ self.resultfiles.add(copy_url)
+ set_number += 1
+ time.sleep(3)
+ set_number -= 1
+ LOGGER.info("[ total set number is: %s ]" % set_number)
+
+ # only keep one set in each xml file and remove empty set
+ test_xml_set_list_empty = []
+ if len(test_xml_set_list) > 1:
+ test_xml_set_list.reverse()
+ for test_xml_set in test_xml_set_list:
+ test_xml_set_tmp = etree.parse(test_xml_set)
+ set_keep_number = 1
+ # LOGGER.debug("[ process set: %s ]" % test_xml_set)
+ for temp_suite in test_xml_set_tmp.getiterator('suite'):
+ for test_xml_set_temp_set in temp_suite.getiterator('set'):
+ if set_keep_number != set_number:
+ temp_suite.remove(test_xml_set_temp_set)
+ else:
+ if not test_xml_set_temp_set.getiterator('testcase'):
+ test_xml_set_list_empty.append(test_xml_set)
+ set_keep_number += 1
+ set_number -= 1
+ test_xml_set_tmp.write(test_xml_set)
+ for empty_set in test_xml_set_list_empty:
+ LOGGER.debug("[ remove empty set: %s ]" % empty_set)
+ test_xml_set_list.remove(empty_set)
+ self.resultfiles.discard(empty_set)
+ if len(test_xml_set_list) > 1:
+ test_xml_set_list.reverse()
+ return test_xml_set_list
+
+ def merge_resultfile(self, start_time, latest_dir):
+ """ merge_result_file """
+ mergefile = mktemp(suffix='.xml', prefix='tests.', dir=latest_dir)
+ #LOGGER.info("\nmergefile: %s ]" % mergefile)
+ mergefile = os.path.splitext(mergefile)[0]
+ #LOGGER.info("\nmergefile: %s ]" % mergefile)
+ mergefile = os.path.splitext(mergefile)[0]
+ #LOGGER.info("\nmergefile: %s ]" % mergefile)
+ mergefile = "%s.result" % BASENAME(mergefile)
+ #LOGGER.info("\nmergefile: %s ]" % mergefile)
+ mergefile = "%s.xml" % mergefile
+ #LOGGER.info("\nmergefile: %s ]" % mergefile)
+ mergefile = JOIN(latest_dir, mergefile)
+ #LOGGER.info("\nmergefile: %s ]" % mergefile)
+ end_time = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
+ LOGGER.info("\n[ test complete at time: %s ]" % end_time)
+ LOGGER.debug("[ start merging test result xml files, "\
+ "this might take some time, please wait ]")
+ LOGGER.debug("[ merge result files into %s ]" % mergefile)
+ root = etree.Element('test_definition')
+ root.tail = "\n"
+ totals = set()
+
+ # merge result files
+ resultfiles = self.resultfiles
+ totals = self.__merge_result(resultfiles, totals)
+
+ for total in totals:
+ result_xml = etree.parse(total)
+ for suite in result_xml.getiterator('suite'):
+ if suite.getiterator('testcase'):
+ suite.tail = "\n"
+ root.append(suite)
+ # print test summary
+ self.__print_summary()
+ # generate actual xml file
+ LOGGER.info("[ generate result xml: %s ]" % mergefile)
+ if self.skip_all_manual:
+ LOGGER.info("[ some results of core manual cases are N/A,"
+ "please refer to the above result file ]")
+ LOGGER.info("[ merge complete, write to the result file,"
+ " this might take some time, please wait ]")
+ # get useful info for xml
+ # add environment node
+ # add summary node
+ root.insert(0, get_summary(start_time, end_time))
+ root.insert(0, self.__get_environment())
+ # add XSL support to testkit-lite
+ declaration_text = """<?xml version="1.0" encoding="UTF-8"?>
+ <?xml-stylesheet type="text/xsl" href="testresult.xsl"?>\n"""
+ #LOGGER.info("\nmergefile: %s ]" % mergefile)
+ try:
+ with open(mergefile, 'w') as output:
+ output.write(declaration_text)
+ tree = etree.ElementTree(element=root)
+ tree.write(output, xml_declaration=False, encoding='utf-8')
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: merge result file failed, error: %s ]" % error)
+ # change <![CDATA[]]> to <![CDATA[]]>
+ replace_cdata(mergefile)
+ # copy result to -o option
+ try:
+ if self.resultfile:
+ if os.path.splitext(self.resultfile)[-1] == '.xml':
+ if not os.path.exists(os.path.dirname(self.resultfile)):
+ if len(os.path.dirname(self.resultfile)) > 0:
+ os.makedirs(os.path.dirname(self.resultfile))
+ LOGGER.info("[ copy result xml to output file:"
+ " %s ]" % self.resultfile)
+ copyfile(mergefile, self.resultfile)
+ else:
+ LOGGER.info(
+ "[ Please specify and xml file for result output,"
+ " not:%s ]" % self.resultfile)
+
+ for root, dirs, files in os.walk(latest_dir):
+ for afile in files:
+ if os.path.splitext(afile)[-1] == '.dlog':
+ LOGGER.info("[ copy result dlog to output file:"
+ " %s ]" % afile)
+ dlogfile = os.path.join(root, afile)
+ finalName = afile
+ rerunString = self.resultfile.split('.')[-2]
+ if(rerunString == 'rerun'):
+ extraNames = afile.split('.')
+ extraName = ""
+ if not extraNames[1].isdigit():
+ extraName = extraNames[1] + '.'
+ for i in range(2, len(extraNames)-1):
+ extraName += extraNames[i]+'.'
+ finalName = self.resultfile.split('/')[-1].split('.')[0]+"."+extraName[:-1]+"_rerun_"+str(datetime.now())+".dlog"
+ destdfile = os.path.join(\
+ os.path.dirname(self.resultfile), finalName)
+ print("destdfile = "+destdfile)
+ copyfile(dlogfile, destdfile)
+# for afile in os.listdir(os.path.dirname(self.resultfile)):
+# if ".dlog" in afile and "tct" not in afile:
+# os.remove(afile)
+
+ except IOError as error:
+ LOGGER.error("[ Error: fail to copy the result file to: %s,"
+ " please check if you have created its parent directory,"
+ " error: %s ]" % (self.resultfile, error))
+
+ def __merge_result(self, setresultfiles, totals):
+ """ merge set result to total"""
+ resultfiles = setresultfiles
+ for resultfile in resultfiles:
+ totalfile = os.path.splitext(resultfile)[0]
+ totalfile = os.path.splitext(totalfile)[0]
+ totalfile = os.path.splitext(totalfile)[0]
+ totalfile = "%s.total" % totalfile
+ totalfile = "%s.xml" % totalfile
+ total_xml = etree.parse(totalfile)
+ # LOGGER.info("|--[ merge webapi result file: %s ]" % resultfile)
+ result_xml = etree.parse(resultfile)
+ for total_suite in total_xml.getiterator('suite'):
+ for total_set in total_suite.getiterator('set'):
+ for result_suite in result_xml.getiterator('suite'):
+ for result_set in result_suite.getiterator('set'):
+ # when total xml and result xml have same suite
+ # name and set name
+ self.__merge_result_by_name(\
+ result_set, total_set, \
+ result_suite, total_suite)
+ total_xml.write(totalfile)
+ totals.add(totalfile)
+ return totals
+
+ def __merge_result_by_name(
+ self, result_set, total_set, result_suite, total_suite):
+ ''' merge result select by name'''
+ if result_set.get('name') == total_set.get('name') \
+ and result_suite.get('name') == total_suite.get('name'):
+ if result_set.get('set_debug_msg'):
+ total_set.set("set_debug_msg", result_set.get('set_debug_msg'))
+ # set cases that doesn't have result in result \
+ # set to N/A
+ # append cases from result set to total set
+ result_case_iterator = result_set.getiterator(
+ 'testcase')
+ if result_case_iterator:
+ # LOGGER.info("----[ suite: %s, set: %s, time: %s ]"
+ #% (result_suite.get('name'), result_set.get('name'),
+ # datetime.today().strftime("%Y-%m-%d_%H_%M_%S")))
+ for result_case in result_case_iterator:
+ try:
+ if self.skip_tc and str(self.skip_tc).find(result_case.get('id')) > -1:
+ continue
+ self.__count_result(result_case)
+ total_set.append(result_case)
+ except IOError as error:
+ LOGGER.error("[ Error: fail to append %s, error: %s ]"
+ % (result_case.get('id'), error))
+
+ def __count_result(self, result_case):
+ """ record the pass,failed,block,N/A case number"""
+
+ if not result_case.get('result'):
+ result_case.set('result', 'N/A')
+ # add empty result node structure for N/A case
+ resinfo_elm = etree.Element('result_info')
+ res_elm = etree.Element('actual_result')
+ start_elm = etree.Element('start')
+ end_elm = etree.Element('end')
+ stdout_elm = etree.Element('stdout')
+ stderr_elm = etree.Element('stderr')
+ resinfo_elm.append(res_elm)
+ resinfo_elm.append(start_elm)
+ resinfo_elm.append(end_elm)
+ resinfo_elm.append(stdout_elm)
+ resinfo_elm.append(stderr_elm)
+ result_case.append(resinfo_elm)
+ res_elm.text = 'N/A'
+ if result_case.get('result') == "PASS":
+ self.testresult_dict["pass"] += 1
+ if result_case.get('result') == "FAIL":
+ self.testresult_dict["fail"] += 1
+ if result_case.get('result') == "BLOCK":
+ self.testresult_dict["block"] += 1
+ if result_case.get('result') == "N/A":
+ self.testresult_dict["not_run"] += 1
+
+ def __get_environment(self):
+ """ get environment """
+ device_info = self.connector.get_device_info()
+ build_info = self.connector.get_buildinfo(self.tizenV)
+
+ # add environment node
+ environment = etree.Element('environment')
+ environment.attrib['device_id'] = device_info['device_id']
+ environment.attrib['device_model'] = device_info["device_model"]
+ environment.attrib['device_name'] = device_info["device_name"]
+ environment.attrib['build_id'] = build_info['buildid']
+ environment.attrib['host'] = platform.platform()
+ environment.attrib['resolution'] = device_info["resolution"]
+ environment.attrib['screen_size'] = device_info["screen_size"]
+ environment.attrib['device_model'] = build_info['model']
+ environment.attrib['manufacturer'] = build_info['manufacturer']
+ other = etree.Element('other')
+ other.text = ""
+ environment.append(other)
+ environment.tail = "\n"
+
+ return environment
+
+ def __print_summary(self):
+ """ print test summary infomation"""
+ LOGGER.info("[ test summary ]")
+ total_case_number = int(self.testresult_dict["pass"]) \
+ + int(self.testresult_dict["fail"]) \
+ + int(self.testresult_dict["block"]) \
+ + int(self.testresult_dict["not_run"])
+ LOGGER.info(" [ total case number: %s ]" % (total_case_number))
+ if total_case_number == 0:
+ LOGGER.info("[Warning: found 0 case from the result files, "
+ "if it's not right, please check the test xml files, "
+ "or the filter values ]")
+ else:
+ LOGGER.info(" [ pass rate: %.2f%% ]" % (float(
+ self.testresult_dict["pass"]) * 100 / int(total_case_number)))
+ LOGGER.info(" [ PASS case number: %s ]" %
+ self.testresult_dict["pass"])
+ LOGGER.info(" [ FAIL case number: %s ]" %
+ self.testresult_dict["fail"])
+ LOGGER.info(" [ BLOCK case number: %s ]" %
+ self.testresult_dict["block"])
+ LOGGER.info(" [ N/A case number: %s ]" %
+ self.testresult_dict["not_run"])
+
+ def __prepare_external_test_json(self, resultfile):
+ """Run external test"""
+ parameters = {}
+ xml_set_tmp = resultfile
+ # split set_xml by <case> get case parameters
+ LOGGER.debug("[ split xml: %s by <case> ]" % xml_set_tmp)
+ LOGGER.debug("[ this might take some time, please wait ]")
+ try:
+ parse_tree = etree.parse(xml_set_tmp)
+ root_em = parse_tree.getroot()
+ case_tmp = []
+ for tset in root_em.getiterator('set'):
+ case_order = 1
+ parameters.setdefault(
+ "casecount", str(len(tset.getiterator('testcase')))
+ )
+ parameters.setdefault("current_set_name", xml_set_tmp)
+
+ for tcase in tset.getiterator('testcase'):
+ if self.skip_tc and str(self.skip_tc).find(tcase.get('id')) > -1:
+ continue
+
+ case_detail_tmp = {}
+ step_tmp = []
+ parameters.setdefault(
+ "exetype", tcase.get('execution_type')
+ )
+
+ parameters.setdefault("type", tcase.get('type'))
+ case_detail_tmp.setdefault("case_id", tcase.get('id'))
+ case_detail_tmp.setdefault("purpose", tcase.get('purpose'))
+ case_detail_tmp.setdefault("order", str(case_order))
+ case_detail_tmp.setdefault("onload_delay", "3")
+
+ if tcase.find('description/test_script_entry') is not None:
+ tc_entry = tcase.find(
+ 'description/test_script_entry').text
+ if not tc_entry:
+ tc_entry = ""
+
+ tc_entry = tc_entry.replace(DEVICE_SUITE_TARGET_30_STR,DEVICE_SUITE_TARGET_30)
+ tc_entry = tc_entry.replace(DEVICE_EXECUTION_MODE_30_STR,DEVICE_EXECUTION_MODE_30)
+
+ case_detail_tmp["entry"] = self.test_prefix + tc_entry
+ if tcase.find(
+ 'description/test_script_entry')\
+ .get('timeout'):
+ case_detail_tmp["timeout"] = tcase.find(
+ 'description/test_script_entry'
+ ).get('timeout')
+ if tcase.find(
+ 'description/test_script_entry'
+ ).get('test_script_expected_result'):
+ case_detail_tmp["expected_result"] = tcase.find(
+ 'description/test_script_entry'
+ ).get('test_script_expected_result')
+ for this_step in tcase.getiterator("step"):
+ step_detail_tmp = {}
+ step_detail_tmp.setdefault("order", "1")
+ step_detail_tmp["order"] = str(this_step.get('order'))
+
+ if this_step.find("step_desc") is not None:
+ text = this_step.find("step_desc").text
+ if text is not None:
+ step_detail_tmp["step_desc"] = text
+
+ if this_step.find("expected") is not None:
+ text = this_step.find("expected").text
+ if text is not None:
+ step_detail_tmp["expected"] = text
+
+ step_tmp.append(step_detail_tmp)
+
+ case_detail_tmp['steps'] = step_tmp
+
+ if tcase.find('description/pre_condition') is not None:
+ text = tcase.find('description/pre_condition').text
+ if text is not None:
+ case_detail_tmp["pre_condition"] = text
+
+ if tcase.find('description/post_condition') is not None:
+ text = tcase.find('description/post_condition').text
+ if text is not None:
+ case_detail_tmp['post_condition'] = text
+
+ if tcase.get('onload_delay') is not None:
+ case_detail_tmp[
+ 'onload_delay'] = tcase.get('onload_delay')
+ # Check performance test
+ if tcase.find('measurement') is not None:
+ measures = tcase.getiterator('measurement')
+ measures_array = []
+ for measure in measures:
+ measure_json = {}
+ measure_json['name'] = measure.get('name')
+ measure_json['file'] = measure.get('file')
+ measures_array.append(measure_json)
+ case_detail_tmp['measures'] = measures_array
+ case_tmp.append(case_detail_tmp)
+ case_order += 1
+ parameters.setdefault("cases", case_tmp)
+ if self.bdryrun:
+ parameters.setdefault("dryrun", True)
+ self.set_parameters = parameters
+
+ except IOError as error:
+ LOGGER.error("[ Error: fail to prepare cases parameters, "
+ "error: %s ]\n" % error)
+ return False
+ return True
+
+ def apply_filter(self, root_em):
+ """ apply filter """
+ rules = self.filter_rules
+ for tsuite in root_em.getiterator('suite'):
+ if rules.get('suite'):
+ if tsuite.get('name') not in rules['suite']:
+ root_em.remove(tsuite)
+ for tset in tsuite.getiterator('set'):
+ if rules.get('set'):
+ if tset.get('name') not in rules['set']:
+ tsuite.remove(tset)
+
+ for tsuite in root_em.getiterator('suite'):
+ for tset in tsuite.getiterator('set'):
+ # if there are capabilities ,do filter
+ if self.has_capability:
+ tset_status = self.__apply_capability_filter_set(tset)
+ if not tset_status:
+ tsuite.remove(tset)
+ continue
+ for tcase in tset.getiterator('testcase'):
+ if not self.__apply_filter_case_check(tcase):
+ tset.remove(tcase)
+
+ def __apply_filter_case_check(self, tcase):
+ """filter cases"""
+ rules = self.filter_rules
+ for key in rules.iterkeys():
+ if key in ["suite", "set"]:
+ continue
+
+ #suhee.yoo : priority filter
+ if key in ["priority"]:
+ if not tcase.get(key):
+ return False
+
+ # Check attribute
+ t_val = tcase.get(key)
+ if t_val:
+ if not t_val in rules[key]:
+ return False
+ else:
+ # Check sub-element
+ items = tcase.getiterator(key)
+ if items:
+ t_val = []
+ for i in items:
+ t_val.append(i.text)
+ if len(set(rules[key]) & set(t_val)) == 0:
+ return False
+ return True
+
+ def __apply_capability_filter_set(self, tset):
+ """ check the set required capability with self.capabilities """
+
+ for tcaps in tset.getiterator('capabilities'):
+ for tcap in tcaps.getiterator('capability'):
+ capname = None
+ capvalue = None
+ capname = tcap.get('name').lower()
+ if tcap.find('value') is not None:
+ capvalue = tcap.find('value').text
+
+ if capname in self.capabilities:
+ if capvalue is not None:
+ if capvalue != self.capabilities[capname]:
+ # if capability value is not equal ,remove the case
+ return False
+ else:
+ # if does not hava this capability ,remove case
+ return False
+ return True
+
+ # sdx@kooltux.org: parse measures returned by test script
+ # and insert in XML result
+ # see xsd/test_definition.xsd: measurementType
+ _MEASURE_ATTRIBUTES = ['name', 'value', 'unit',
+ 'target', 'failure', 'power']
+
+ def __insert_measures(self, case, buf, pattern="###[MEASURE]###"):
+ """ get measures """
+ measures = self.__extract_measures(buf, pattern)
+ for measure in measures:
+ m_elm = etree.Element('measurement')
+ for key in measure:
+ m_elm.attrib[key] = measure[key]
+ case.append(m_elm)
+
+ def __extract_measures(self, buf, pattern):
+ """
+ This function extracts lines from <buf> containing the defined
+ <pattern>. For each line containing the pattern, it extracts the
+ string to the end of line Then it splits the content in multiple
+ fields using the defined separator <field_sep> and maps the fields
+ to measurement attributes defined in xsd. Finally, a list containing
+ all measurement objects found in input buffer is returned
+ """
+ out = []
+ for line in buf.split("\n"):
+ pos = line.find(pattern)
+ if pos < 0:
+ continue
+
+ measure = {}
+ elts = collections.deque(line[pos + len(pattern):].split(':'))
+ for k in self._MEASURE_ATTRIBUTES:
+ if len(elts) == 0:
+ measure[k] = ''
+ else:
+ measure[k] = elts.popleft()
+
+ # don't accept unnamed measure
+ if measure['name'] != '':
+ out.append(measure)
+ return out
+
+ def __init_com_module(self, testxml):
+ """
+ send init test to com_module
+ if webapi test,com_module will start testkit-stub
+ else com_module send the test case to devices
+ """
+ starup_prms = self.__prepare_starup_parameters(testxml)
+ # init stub and get the session_id
+ session_id = self.testworker.init_test(starup_prms)
+ if session_id == None:
+ LOGGER.error("[ Error: Initialization Error]")
+ return False
+ else:
+ self.set_session_id(session_id)
+ return True
+
+ def __prepare_starup_parameters(self, testxml):
+ """ prepare_starup_parameters """
+
+ starup_parameters = {}
+ LOGGER.info("[ prepare_startup_parameters ]")
+ try:
+ parse_tree = etree.parse(testxml)
+ tsuite = parse_tree.getroot().getiterator('suite')[0]
+ tset = parse_tree.getroot().getiterator('set')[0]
+ if tset.get("launcher") is not None:
+ starup_parameters['test-launcher'] = tset.get("launcher")
+ else:
+ starup_parameters['test-launcher'] = tsuite.get("launcher")
+ starup_parameters['testsuite-name'] = tsuite.get("name")
+ starup_parameters['testset-name'] = tset.get("name")
+ starup_parameters['stub-name'] = self.stub_name
+ if self.external_test is not None:
+ starup_parameters['external-test'] = self.external_test
+ starup_parameters['debug'] = self.debug
+ starup_parameters['test_prefix'] = self.test_prefix
+ if self.rerun:
+ starup_parameters['rerun'] = self.rerun
+ if len(self.capabilities) > 0:
+ starup_parameters['capability'] = self.capabilities
+ if self.tizenV is not None:
+ starup_parameters['tizen-version'] = self.tizenV
+ if self.stub_port is not None:
+ starup_parameters['stub-port'] = self.stub_port
+
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: prepare startup parameters, error: %s ]" % error)
+ return starup_parameters
+
+ def __check_test_status(self):
+ '''
+ get_test_status from com_module
+ check the status
+ if end ,return ture; else return False
+ '''
+ # check test running or end
+ # if the status id end return True ,else return False
+
+ session_status = self.testworker.get_test_status(self.session_id)
+ # session_status["finished"] == "0" is running
+ # session_status["finished"] == "1" is end
+ if not session_status == None:
+ if session_status["finished"] == "0":
+ progress_msg_list = session_status["msg"]
+ for line in progress_msg_list:
+ LOGGER.info(line)
+ return False
+ elif session_status["finished"] == "1":
+ return True
+ else:
+ LOGGER.error("[ session status error ,pls finalize test ]\n")
+ # return True to finished this set ,becasue server error
+ return True
+
+ def finalize_test(self, sessionid):
+ '''shut_down testkit-stub'''
+ try:
+ self.testworker.finalize_test(sessionid)
+ except Exception as error:
+ LOGGER.error("[ Error: fail to close webapi http server, "
+ "error: %s ]" % error)
+
+ def get_capability(self, file_name):
+ """get_capability from file """
+
+ capability_xml = file_name
+ capabilities = {}
+ try:
+ parse_tree = etree.parse(capability_xml)
+ root_em = parse_tree.getroot()
+ for tcap in root_em.getiterator('capability'):
+ capability = get_capability_form_node(tcap)
+ capabilities = dict(capabilities, **capability)
+
+ self.set_capability(capabilities)
+ return True
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: fail to parse capability xml, error: %s ]" % error)
+ return False
+
+ def __write_set_result(self, testxmlfile, result):
+ '''
+ get the result JSON form com_module,
+ write them to orignal testxmlfile
+
+ '''
+ # write the set_result to set_xml
+ set_result_xml = testxmlfile
+ # covert JOSN to python dict string
+ set_result = result
+ if 'resultfile' in set_result:
+ self.__write_file_result(set_result_xml, set_result)
+ else:
+ write_json_result(set_result_xml, set_result)
+
+ def __write_file_result(self, set_result_xml, set_result):
+ """write xml result file"""
+ result_file = set_result['resultfile']
+ try:
+ if self.rerun:
+ LOGGER.info("[ Web UI FW Unit Test Does not support rerun.\
+ Result should be N/A ]\n")
+ else:
+ test_tree = etree.parse(set_result_xml)
+ test_em = test_tree.getroot()
+ result_tree = etree.parse(result_file)
+ result_em = result_tree.getroot()
+ dubug_file = os.path.basename(set_result_xml)
+ dubug_file = os.path.splitext(dubug_file)[0] + '.dlog'
+ for result_suite in result_em.getiterator('suite'):
+ for result_set in result_suite.getiterator('set'):
+ for test_suite in test_em.getiterator('suite'):
+ for test_set in test_suite.getiterator('set'):
+ if result_set.get('name') == \
+ test_set.get('name'):
+ result_set.set("set_debug_msg", dubug_file)
+ test_suite.remove(test_set)
+ test_suite.append(result_set)
+ test_tree.write(set_result_xml)
+ os.remove(result_file)
+ LOGGER.info("[ cases result saved to resultfile ]\n")
+ except OSError as error:
+ traceback.print_exc()
+ LOGGER.error(
+ "[ Error: fail to write cases result, error: %s ]\n" % error)
+
+
+def get_capability_form_node(capability_em):
+ ''' splite capability key and value form element tree'''
+ tmp_key = ''
+ capability = {}
+ tcap = capability_em
+ if tcap.get("name"):
+ tmp_key = tcap.get("name").lower()
+
+ if tcap.get("type").lower() == 'boolean':
+ if tcap.get("support").lower() == 'true':
+ capability[tmp_key] = True
+
+ if tcap.get("type").lower() == 'integer':
+ if tcap.get("support").lower() == 'true':
+ if tcap.getiterator(
+ "value") and tcap.find("value").text is not None:
+ capability[tmp_key] = int(tcap.find("value").text)
+
+ if tcap.get("type").lower() == 'string':
+ if tcap.get("support").lower() == 'true':
+ if tcap.getiterator(
+ "value") and tcap.find("value").text is not None:
+ capability[tmp_key] = tcap.find("value").text
+
+ return capability
+
+
+def get_version_info():
+ """
+ get testkit tool version ,just read the version in VERSION file
+ VERSION file must put in /opt/testkit/lite2.4/
+ """
+ try:
+ config = ConfigParser.ConfigParser()
+ if platform.system() == "Linux":
+ config.read('/opt/testkit/lite2.4/VERSION')
+ else:
+ version_file = os.path.join(sys.path[0], 'VERSION')
+ config.read(version_file)
+ version = config.get('public_version', 'version')
+ return version
+ except KeyError as error:
+ LOGGER.error(
+ "[ Error: fail to parse version info, error: %s ]\n" % error)
+ return ""
+
+
+def replace_cdata(file_name):
+ """ replace some character"""
+ try:
+ abs_path = mktemp()
+ new_file = open(abs_path, 'w')
+ old_file = open(file_name)
+ for line in old_file:
+ line_temp = line.replace('<![CDATA', '<![CDATA')
+ new_file.write(line_temp.replace(']]>', ']]>'))
+ new_file.close()
+ old_file.close()
+ remove(file_name)
+ move(abs_path, file_name)
+ except IOError as error:
+ LOGGER.error("[ Error: fail to replace cdata in the result file, "
+ "error: %s ]\n" % error)
+
+
+def extract_notes(buf, pattern):
+ """util func to split lines in buffer, search for pattern on each line
+ then concatenate remaining content in output buffer"""
+ out = ""
+ for line in buf.split("\n"):
+ pos = line.find(pattern)
+ if pos >= 0:
+ out += line[pos + len(pattern):] + "\n"
+ return out
+
+# sdx@kooltux.org: parse notes in buffer and insert them in XML result
+
+
+def insert_notes(case, buf, pattern="###[NOTE]###"):
+ """ insert notes"""
+ desc = case.find('description')
+ if desc is None:
+ return
+
+ notes_elm = desc.find('notes')
+ if notes_elm is None:
+ notes_elm = etree.Element('notes')
+ desc.append(notes_elm)
+ if notes_elm.text is None:
+ notes_elm.text = extract_notes(buf, pattern)
+ else:
+ notes_elm.text += "\n" + extract_notes(buf, pattern)
+
+
+def get_summary(start_time, end_time):
+ """ set summary node """
+ summary = etree.Element('summary')
+ summary.attrib['test_plan_name'] = "Empty test_plan_name"
+ start_at = etree.Element('start_at')
+ start_at.text = start_time
+ end_at = etree.Element('end_at')
+ end_at.text = end_time
+ summary.append(start_at)
+ summary.append(end_at)
+ summary.tail = "\n "
+ return summary
+
+
+def write_json_result(set_result_xml, set_result):
+ ''' fetch result form JSON'''
+
+ case_results = set_result["cases"]
+ try:
+ parse_tree = etree.parse(set_result_xml)
+ root_em = parse_tree.getroot()
+ dubug_file = os.path.basename(set_result_xml)
+ dubug_file = os.path.splitext(dubug_file)[0] + '.dlog'
+ for tset in root_em.getiterator('set'):
+ tset.set("set_debug_msg", dubug_file)
+ for tcase in tset.getiterator('testcase'):
+ for case_result in case_results:
+ if tcase.get("id") == case_result['case_id']:
+ tcase.set('result', case_result['result'].upper())
+ # Check performance test
+ if tcase.find('measurement') is not None:
+ for measurement in tcase.getiterator(
+ 'measurement'):
+ if 'measures' in case_result:
+ m_results = case_result['measures']
+ for m_result in m_results:
+ if measurement.get('name') == \
+ m_result['name'] and 'value' in m_result:
+ measurement.set(
+ 'value', m_result[
+ 'value'])
+ if tcase.find("./result_info") is not None:
+ tcase.remove(tcase.find("./result_info"))
+ result_info = etree.SubElement(tcase, "result_info")
+ actual_result = etree.SubElement(
+ result_info, "actual_result")
+ actual_result.text = case_result['result'].upper()
+
+ start = etree.SubElement(result_info, "start")
+ end = etree.SubElement(result_info, "end")
+ stdout = etree.SubElement(result_info, "stdout")
+ stderr = etree.SubElement(result_info, "stderr")
+ if 'start_at' in case_result:
+ start.text = case_result['start_at']
+ if 'end_at' in case_result:
+ end.text = case_result['end_at']
+ if 'stdout' in case_result:
+ stdout.text = str2xmlstr(case_result['stdout'])
+ if 'stderr' in case_result:
+ stderr.text = str2xmlstr(case_result['stderr'])
+ parse_tree.write(set_result_xml)
+
+ LOGGER.info("[ cases result saved to resultfile ]\n")
+ except IOError as error:
+ traceback.print_exc()
+ LOGGER.error(
+ "[ Error: fail to write cases result, error: %s ]\n" % error)
+
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+""" The implementation test worker"""
+
+import os
+import time
+import threading
+import uuid
+import ConfigParser
+
+from datetime import datetime
+from commodule.log import LOGGER
+from commodule.httprequest import get_url, http_request
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = ConfigParser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_24 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_24')
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+CNT_RETRY = 10
+DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
+UIFW_MAX_TIME = 300
+UIFW_MAX_WRITE_TIME = 10
+UIFW_RESULT = os.path.join(DEVICE_SUITE_TARGET_24, "Documents/tcresult")
+UIFW_SET_NUM = 0
+LAUNCH_ERROR = 1
+BLOCK_ERROR = 3
+
+
+class TestSetResut(object):
+
+ """ test result """
+
+ _progress = "execute case: %s # %s...(%s)"
+ _mutex = threading.Lock()
+
+ def __init__(self, testsuite_name="", testset_name=""):
+ self._suite_name = testsuite_name
+ self._set_name = testset_name
+ self._result = {"cases": []}
+ self._finished = 0
+
+ def set_status(self, flag=0):
+ """set finished tag"""
+ self._mutex.acquire()
+ self._finished = flag
+ self._mutex.release()
+
+ def get_status(self):
+ """return finished tag"""
+ self._mutex.acquire()
+ flag = self._finished
+ self._mutex.release()
+ return flag
+
+ def set_result(self, tresult):
+ """set cases result to result buffer"""
+ self._mutex.acquire()
+ self._result = tresult
+ self._mutex.release()
+
+ def extend_result(self, cases_result=None, print_out=True):
+ """update cases result to the result buffer"""
+ self._mutex.acquire()
+ if cases_result is not None:
+ self._result["cases"].extend(cases_result)
+
+ if print_out:
+ for case_it in cases_result:
+ LOGGER.info(self._progress %
+ (self._suite_name, case_it['case_id'], \
+ case_it['result']))
+ if case_it['result'].lower() in ['fail', 'block'] \
+ and 'stdout' in case_it:
+ LOGGER.info(case_it['stdout'])
+ self._mutex.release()
+
+ def get_result(self):
+ """get cases result from the result buffer"""
+ self._mutex.acquire()
+ result = self._result
+ self._mutex.release()
+ return result
+
+
+def _print_dlog(dlog_file):
+ if os.path.exists(dlog_file):
+ LOGGER.info('[ start of dlog message ]')
+ readbuff = file(dlog_file, "r")
+ for line in readbuff.readlines():
+ LOGGER.info(line.strip('\n'))
+ LOGGER.info('[ end of dlog message ]')
+
+
+def _core_test_exec(conn, test_set_name, exetype, cases_queue, result_obj, \
+ tizen_version):
+ """function for running core tests"""
+ exetype = exetype.lower()
+ total_count = len(cases_queue)
+ current_idx = 0
+ manual_skip_all = False
+ result_list = []
+ for test_case in cases_queue:
+ if result_obj.get_status() == 1:
+ break
+
+ current_idx += 1
+ core_cmd = ""
+ if "entry" in test_case:
+ core_cmd = test_case["entry"]
+ else:
+ LOGGER.info(
+ "[ Warnning: test script is empty,"
+ " please check your test xml file ]")
+ continue
+ expected_result = test_case.get('expected_result', '0')
+ time_out = int(test_case.get('timeout', '90'))
+ measures = test_case.get('measures', [])
+ retmeasures = []
+
+ LOGGER.info("\n[%s:%s] TestCase: %s\n"
+ "TestEntry: %s"
+ % (current_idx, total_count, test_case['case_id'], core_cmd))
+ strtime = datetime.now().strftime(DATE_FORMAT_STR)
+ LOGGER.info("start: %s" % strtime)
+ test_case["start_at"] = strtime
+ if exetype == 'auto':
+ return_code, stdout, stderr = conn.shell_cmd_ext(
+ core_cmd, time_out, False)
+
+ if return_code is not None and return_code != "timeout":
+ test_case["result"] = "pass" if str(
+ return_code) == expected_result else "fail"
+ test_case["stdout"] = stdout
+ test_case["stderr"] = stderr
+ for item in measures:
+ ind = item['name']
+ fname = item['file']
+ if fname is None:
+ continue
+ tmpname = os.path.expanduser("~") + os.sep + "mea_tmp"
+ if conn.download_file(fname, tmpname):
+ try:
+ config = ConfigParser.ConfigParser()
+ config.read(tmpname)
+ item['value'] = config.get(ind, 'value')
+ retmeasures.append(item)
+ os.remove(tmpname)
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: fail to parse value,"
+ " error:%s ]\n" % error)
+ test_case["measures"] = retmeasures
+ else:
+ test_case["result"] = "BLOCK"
+ test_case["stdout"] = stdout
+ test_case["stderr"] = stderr
+ elif exetype == 'manual':
+ # handle manual core cases
+ try:
+ # LOGGER.infopre-condition info
+ if "pre_condition" in test_case:
+ LOGGER.info("\n****\nPre-condition: %s\n ****\n"
+ % test_case['pre_condition'])
+ # LOGGER.infostep info
+ if "steps" in test_case:
+ for step in test_case['steps']:
+ LOGGER.info(
+ "********************\n"
+ "Step Order: %s" % step['order'])
+ LOGGER.info("Step Desc: %s" % step['step_desc'])
+ LOGGER.info(
+ "Expected: %s\n********************\n"
+ % step['expected'])
+ if manual_skip_all:
+ test_case["result"] = "N/A"
+ else:
+ while True:
+ test_result = raw_input(
+ '[ please input case result ]'
+ ' (p^PASS, f^FAIL, b^BLOCK, n^Next, d^Done):')
+ if test_result.lower() == 'p':
+ test_case["result"] = "PASS"
+ break
+ elif test_result.lower() == 'f':
+ test_case["result"] = "FAIL"
+ break
+ elif test_result.lower() == 'b':
+ test_case["result"] = "BLOCK"
+ break
+ elif test_result.lower() == 'n':
+ test_case["result"] = "N/A"
+ break
+ elif test_result.lower() == 'd':
+ manual_skip_all = True
+ test_case["result"] = "N/A"
+ break
+ else:
+ LOGGER.info(
+ "[ Warnning: you input: '%s' is invalid,"
+ " please try again ]" % test_result)
+ except IOError as error:
+ LOGGER.info(
+ "[ Error: fail to get core manual test step,"
+ " error: %s ]\n" % error)
+ strtime = datetime.now().strftime(DATE_FORMAT_STR)
+ LOGGER.info("end : %s" % strtime)
+ test_case["end_at"] = strtime
+ LOGGER.info("execute case: %s" % test_case["result"])
+ result_list.append(test_case)
+
+ result_obj.extend_result(result_list, False)
+ result_obj.set_status(1)
+
+
+def _web_test_exec(conn, server_url, test_web_app, exetype, cases_queue, \
+ result_obj, tizen_version):
+ """function for running web tests"""
+ exetype = exetype.lower()
+ test_set_finished = False
+ err_cnt = 0
+ relaunch_cnt = 0
+ for test_group in cases_queue:
+ if test_set_finished:
+ break
+
+ ret = http_request(
+ get_url(server_url, "/set_testcase"), "POST", test_group, 30)
+ if ret is None:
+ LOGGER.error(
+ "[ set testcases timeout, please check device! ]")
+ result_obj.set_status(1)
+ break
+
+ if not conn.launch_app(test_web_app):
+ result_obj.set_status(1)
+ break
+
+ while True:
+ if result_obj.get_status() == 1:
+ test_set_finished = True
+ break
+ ret = http_request(
+ get_url(server_url, "/check_server_status"), "GET", {})
+ if ret is None:
+ err_cnt += 1
+ LOGGER.info("/check_server_status : %s " % ret)
+ if err_cnt >= CNT_RETRY:
+ LOGGER.error(
+ "[ check server status time out, \
+ please check device! ]")
+ test_set_finished = True
+ result_obj.set_status(1)
+ break
+ else:
+ result_cases = ret.get("cases")
+ error_code = ret.get("error_code")
+ if error_code is not None:
+ if not conn.launch_app(test_web_app):
+ test_set_finished = True
+ result_obj.set_status(1)
+ break
+ if error_code == LAUNCH_ERROR:
+ LOGGER.error("[ERROR : test app no response, hang or not launched!]")
+ relaunch_cnt += 1
+ if relaunch_cnt >= 3:
+ test_set_finished = True
+ result_obj.set_status(1)
+ break
+ elif error_code == BLOCK_ERROR:
+ relaunch_cnt = 0
+ else:
+ err_cnt = 0
+ relaunch_cnt = 0
+
+ if result_cases is not None and len(result_cases):
+ result_obj.extend_result(result_cases)
+ elif exetype == 'manual':
+ LOGGER.info(
+ "[ please execute manual cases ]\r\n")
+
+ if ret["finished"] == 1:
+ test_set_finished = True
+ result_obj.set_status(1)
+ break
+ elif ret["block_finished"] == 1:
+ break
+ time.sleep(2)
+
+
+def _webuifw_test_exec(conn, test_web_app, test_session, test_set_name, \
+ exetype, cases_queue, result_obj):
+ """function for running webuifw tests"""
+ global UIFW_SET_NUM
+ UIFW_SET_NUM = UIFW_SET_NUM + 1
+ set_UIFW_RESULT = UIFW_RESULT + "_" + str(UIFW_SET_NUM) + ".xml"
+ result_obj.set_status(0)
+ result_obj.set_result({"resultfile": ""})
+ ls_cmd = "ls -l %s" % set_UIFW_RESULT
+ sz_cmd = "du -hk %s " % set_UIFW_RESULT
+ time_out = UIFW_MAX_TIME
+ rm_cmd = "rm " + os.path.join(DEVICE_SUITE_TARGET_24, "Documents/tcresult*.xml")
+
+ if exetype == "auto":
+ conn.shell_cmd(rm_cmd)
+ UIFW_SET_NUM = 1
+ LOGGER.info('[webuifw] start test executing')
+ if not conn.launch_app(test_web_app):
+ LOGGER.info("[ launch test app \"%s\" failed! ]" \
+ % str(test_web_app))
+ result_obj.set_result({"resultfile": ""})
+ result_obj.set_status(1)
+
+ result_file = os.path.expanduser("~") + os.sep + test_session + "_uifw.xml"
+
+ while time_out > 0:
+ LOGGER.info('[webuifw] waiting for test completed...')
+ exit_code, ret = conn.shell_cmd(ls_cmd)
+ if not 'No such file or directory' in ret[0]:
+ exit_code, ret = conn.shell_cmd(sz_cmd)
+ f_size = int(ret[0].split("\t")[0])
+ if f_size > 0:
+ break
+ if time_out > UIFW_MAX_WRITE_TIME:
+ time_out = UIFW_MAX_WRITE_TIME
+ time.sleep(2)
+ time_out -= 2
+
+ LOGGER.info('[webuifw] end test executing')
+ if conn.download_file(set_UIFW_RESULT, result_file):
+ result_obj.set_result({"resultfile": result_file})
+ for test_case in cases_queue:
+ LOGGER.info("[webuifw] execute case: %s # %s" %
+ (test_set_name, test_case['case_id']))
+ result_obj.set_status(1)
+
+
+class TestWorker(object):
+
+ """Test executor for testkit-lite"""
+
+ def __init__(self, client=None):
+ super(TestWorker, self).__init__()
+ self.conn = client
+ self.tizen_version = ""
+ self.server_url = None
+ self.result_obj = None
+ self.opts = dict({'block_size': 300,
+ 'test_type': None,
+ 'auto_iu': False,
+ 'fuzzy_match': False,
+ 'self_exec': False,
+ 'self_repeat': False,
+ 'debug_mode': False
+ })
+
+ def set_TizenVersion(self, tizenversion):
+ self.tizen_version = tizenversion
+
+ def __init_test_stub(self, stub_app, stub_port, debug_opt):
+ # init testkit-stub deamon process
+ timecnt = 0
+ blaunched = False
+ while timecnt < CNT_RETRY:
+ if not self.conn.check_process(stub_app):
+ LOGGER.info(\
+ "[ no stub process activated, now try to launch %s ]"\
+ % stub_app)
+ self.conn.launch_stub(stub_app, stub_port, debug_opt)
+ timecnt += 1
+ else:
+ blaunched = True
+ break
+
+ if not blaunched:
+ LOGGER.info("[ launch stub process failed! ]")
+ return False
+
+ if self.server_url is None:
+ self.server_url = self.conn.get_server_url(stub_port)
+
+ timecnt = 0
+ blaunched = False
+ while timecnt < CNT_RETRY:
+ ret = http_request(get_url(
+ self.server_url, "/check_server_status"), "GET", {})
+ if ret is None:
+ LOGGER.info("[ check server status, not ready yet! ]")
+ timecnt += 1
+ time.sleep(1)
+ else:
+ blaunched = True
+ break
+ return blaunched
+
+ def __init_webtest_opt(self, params):
+ """init the test runtime, mainly process the star up of test stub"""
+ if params is None:
+ return None
+
+ session_id = str(uuid.uuid1())
+ cmdline = ""
+ debug_opt = ""
+ stub_app = params.get('stub-name', 'testkit-stub')
+ stub_port = params.get('stub-port', '8000')
+ test_launcher = params.get('external-test', '')
+ testsuite_name = params.get('testsuite-name', '')
+ testset_name = params.get('testset-name', '')
+ capability_opt = params.get("capability", None)
+ client_cmds = params.get('test-launcher', '').strip().split()
+ wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+ self.opts['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
+ self.opts['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
+ self.opts['self_exec'] = wrt_tag.find('a') != -1
+ self.opts['self_repeat'] = wrt_tag.find('r') != -1
+ self.opts['debug_mode'] = params.get("debug", False)
+
+ test_opt = self.conn.get_launcher_opt(
+ test_launcher, testsuite_name, testset_name, fuzzy_match, auto_iu)
+ if test_opt is None:
+ LOGGER.info("[ init the test options, get failed ]")
+ return None
+
+ # to be removed in later version
+ test_opt["suite_id"] = test_opt["test_app_id"]
+ self.opts.update(test_opt)
+
+ # uifw, this suite don't need stub
+ if self.opts['self_exec'] or self.opts['self_repeat']:
+ self.opts['test_type'] = "jqunit"
+ return session_id
+
+ # enable debug information
+ if self.opts['debug_mode']:
+ debug_opt = '--debug'
+
+ if self.__init_test_stub(stub_app, stub_port, debug_opt):
+ ret = http_request(get_url(
+ self.server_url, "/init_test"), "POST", test_opt)
+ if ret is None:
+ LOGGER.info("[ init test suite failed! ]")
+ return None
+ elif "error_code" in ret:
+ LOGGER.info("[ init test suite, "
+ "get error code %d ! ]" % ret["error_code"])
+ return None
+
+ if capability_opt is not None:
+ ret = http_request(get_url(self.server_url,
+ "/set_capability"),
+ "POST", capability_opt)
+ return session_id
+ else:
+ LOGGER.info("[ Init test failed ! ]")
+ return None
+
+ def init_test(self, params):
+ """init the test envrionment"""
+ self.opts['testset_name'] = params.get('testset-name', '')
+ self.opts['testsuite_name'] = params.get('testsuite-name', '')
+ if params.get('test-launcher') is not None:
+ self.opts['test_type'] = "webapi"
+ return self.__init_webtest_opt(params)
+ else:
+ self.opts['test_type'] = "coreapi"
+ return str(uuid.uuid1())
+
+ def __run_core_test(self, sessionid, test_set_name, exetype, cases):
+ """
+ process the execution for core api test
+ """
+ self.opts['async_th'] = threading.Thread(
+ target=_core_test_exec,
+ args=(
+ self.conn, test_set_name, exetype, cases, self.result_obj,\
+ self.tizen_version)
+ )
+ self.opts['async_th'].start()
+ return True
+
+ def __run_jqt_test(self, sessionid, test_set_name, cases):
+ """
+ process the execution for Qunit testing
+ """
+ exetype = "auto" if self.opts['self_exec'] else ""
+ self.opts['async_th'] = threading.Thread(
+ target=_webuifw_test_exec,
+ args=(
+ self.conn, self.opts['test_app_id'], sessionid, test_set_name,\
+ exetype, cases, self.result_obj)
+ )
+ self.opts['async_th'].start()
+ return True
+
+ def __run_web_test(self, sessionid, test_set_name, exetype, ctype, cases):
+ """
+ process the execution for web api test
+ may be splitted to serveral blocks,
+ with the unit size defined by block_size
+ """
+ case_count = len(cases)
+ blknum = 0
+ if case_count % self.opts['block_size'] == 0:
+ blknum = case_count / self.opts['block_size']
+ else:
+ blknum = case_count / self.opts['block_size'] + 1
+
+ idx = 1
+ test_set_queues = []
+ while idx <= blknum:
+ block_data = {}
+ block_data["exetype"] = exetype
+ block_data["type"] = ctype
+ block_data["totalBlk"] = str(blknum)
+ block_data["currentBlk"] = str(idx)
+ block_data["casecount"] = str(case_count)
+ start = (idx - 1) * self.opts['block_size']
+ if idx == blknum:
+ end = case_count
+ else:
+ end = idx * self.opts['block_size']
+ block_data["cases"] = cases[start:end]
+ test_set_queues.append(block_data)
+ idx += 1
+ self.opts['async_th'] = threading.Thread(
+ target=_web_test_exec,
+ args=(
+ self.conn, self.server_url, self.opts['test_app_id'], exetype,\
+ test_set_queues, self.result_obj, self.tizen_version)
+ )
+ self.opts['async_th'].start()
+ return True
+
+ def run_test(self, sessionid, test_set):
+ """
+ process the execution for a test set
+ """
+ if sessionid is None:
+ return False
+
+ if not "cases" in test_set:
+ return False
+
+ # start debug trace thread
+ dlogfile = test_set['current_set_name'].replace('.xml', '.dlog')
+ self.opts['dlog_file'] = dlogfile
+ self.conn.start_debug(dlogfile)
+ time.sleep(1)
+
+ self.result_obj = TestSetResut(
+ self.opts['testsuite_name'], self.opts['testset_name'])
+
+ cases, exetype, ctype = test_set[
+ "cases"], test_set["exetype"], test_set["type"]
+
+ devid = self.conn.get_devid()
+ if self.conn.is_NE_mode() or (devid and devid.find('None') > -1):
+ result_list = []
+ for case in cases:
+ test_case = {}
+ test_case['case_id'] = case['case_id']
+ test_case['result'] = 'N/A'
+ if devid.find('None') > -1:
+ test_case['stdout'] = "target not found"
+ else:
+ issue_num = int(self.conn.is_NE_mode())
+ err_msg = "precondition failed "
+ if issue_num == 1:
+ err_msg += "(not connected to wifi)"
+ elif issue_num == 2:
+ err_msg += "(not set email account)"
+ elif issue_num == 3:
+ err_msg += "(not available device network)"
+ elif issue_num == 4:
+ err_msg += "(not enable bluetooth)"
+ elif issue_num == 5:
+ err_msg += "(not enable nfc)"
+ elif issue_num == 6:
+ err_msg += "(not available sim card)"
+ test_case['stdout'] = err_msg
+
+ result_list.append(test_case)
+
+ self.result_obj.extend_result(result_list)
+ self.result_obj.set_status(1)
+ return True
+
+ if self.opts['test_type'] == "webapi":
+ return self.__run_web_test(sessionid, \
+ self.opts['testset_name'], exetype, ctype, cases)
+ elif self.opts['test_type'] == "coreapi":
+ return self.__run_core_test(sessionid, \
+ self.opts['testset_name'], exetype, cases)
+ elif self.opts['test_type'] == "jqunit":
+ return self.__run_jqt_test(sessionid, \
+ self.opts['testset_name'], cases)
+ else:
+ LOGGER.info("[ unsupported test suite type ! ]")
+ return False
+
+ def get_test_status(self, sessionid):
+ """poll the test task status"""
+ if sessionid is None:
+ return None
+ result = {}
+ result["msg"] = []
+ result["finished"] = str(self.result_obj.get_status())
+ return result
+
+ def get_test_result(self, sessionid):
+ """get the test result for a test set """
+ result = {}
+ if sessionid is None:
+ return result
+
+ result = self.result_obj.get_result()
+ return result
+
+ def finalize_test(self, sessionid):
+ """clear the test stub and related resources"""
+ if sessionid is None:
+ return False
+
+ self.result_obj.set_status(1)
+
+ # stop test app
+ if self.opts['test_type'] == "webapi":
+ self.conn.kill_app(self.opts['test_app_id'])
+ # uninstall test app
+ if self.opts['auto_iu']:
+ self.conn.uninstall_app(self.opts['test_app_id'])
+
+ # stop debug thread
+ self.conn.stop_debug()
+
+ # add dlog output for debug
+ if self.opts['debug_mode']:
+ _print_dlog(self.opts['dlog_file'])
+
+ return True
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitwebdir = /opt/testkit/web
+dist_testkitweb_DATA = *.html *.js
--- /dev/null
+<!doctype html>
+<!--
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Wang, Jing <jing.j.wang@intel.com>
+# Tang, Shaofeng <shaofeng.tang@intel.com>
+-->
+<head>
+<meta name="viewport" content="width=device-width">
+<script src="jquery.js"></script>
+<script>
+ var iTest = 0;
+
+ var Tests;
+ var statusNode;
+ var oTestFrame;
+ var statusFrame;
+ var frmset;
+ var xmldoc;
+
+ var startTime;
+ var defTime = 2000;
+ var timeout;
+ var winCloseTimeout = 5000;
+ var blockCheckTime = 10;
+
+ var server = "http://127.0.0.1:8000";
+ var need_ajax = true;
+
+ var hidestatus;
+ var ttestsuite;
+ var tpriority;
+ var tstatus;
+ var ttype;
+ var tcategory;
+ var texecutiontype;
+
+ var manualcaseslist;
+
+ var cursuite;
+ var curset;
+
+ var last_test_page = "";
+ var current_page_uri = "";
+
+ var activetest = true;
+
+ var manualcases = function() {
+ this.casesid = "";
+ this.index = 0;
+ this.result = "";
+ };
+
+ 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 Parm(data, name) {
+ var p;
+ ts = $(data).find(name);
+ if (ts) {
+ t = $(ts).get(0);
+ if (t)
+ p = $(t).text().trim();
+ }
+
+ if (p) {
+ var rawVal = decodeURI(p);
+ if (rawVal.indexOf(',') < 0)
+ p = rawVal;
+ else
+ p = rawVal.split(',');
+ }
+
+ return p;
+ }
+
+ function getParms() {
+ var parms = new Array();
+ var str = location.search.substring(1);
+ var items = str.split('&');
+ for ( var i = 0; i < items.length; i++) {
+ var pos = items[i].indexOf('=');
+ if (pos > 0) {
+ var key = items[i].substring(0, pos);
+ var val = items[i].substring(pos + 1);
+ if (!parms[key]) {
+ var rawVal = decodeURI(val);
+ if (rawVal.indexOf(',') < 0)
+ parms[key] = rawVal;
+ else
+ parms[key] = rawVal.split(',');
+ }
+ }
+ }
+
+ ttestsuite = parms["testsuite"];
+ tpriority = parms["priority"];
+ hidestatus = parms["hidestatus"];
+ tstatus = parms["status"];
+ ttype = parms["type"];
+ tcategory = parms["category"];
+ texecutiontype = parms["execution_type"];
+ if (need_ajax) {
+ $.ajax({
+ async : false,
+ type : "GET",
+ url : server + "/get_params",
+ dataType : "xml",
+ success : function(data) {
+ hidestatus = Parm(data, 'hidestatus');
+ },
+ error : function(x, t, e) {
+ print_error_log("getParms", e);
+ }
+ });
+ }
+ }
+
+ function runTestsuite_nofilter(xml) {
+ xmldoc = xml;
+ Tests = $(xml).find("testcase");
+ doTest();
+ }
+
+ function runTestsuite(xml) {
+ xmldoc = xml;
+ $(xml).find("testcase").each(
+ function() {
+ var v, vType;
+ v = $(this).attr('execution_type');
+
+ if (texecutiontype && texecutiontype == "manual")
+ vType = "manual";
+ else if (texecutiontype && texecutiontype == "auto")
+ vType = "auto";
+ else if (!texecutiontype)
+ vType = [ "auto", "manual" ];
+ else
+ vType = "auto";
+
+ if (v != vType && $.inArray(v, vType) < 0)
+ $(this).remove();
+ v = $(this).attr('priority');
+ if (tpriority && v != tpriority
+ && $.inArray(v, tpriority) < 0)
+ $(this).remove();
+ v = $(this).attr('status');
+ if (tstatus && v != tstatus && $.inArray(v, tstatus) < 0)
+ $(this).remove();
+ v = $(this).attr('type');
+ if (ttype && v != ttype && $.inArray(v, ttype) < 0)
+ $(this).remove();
+ var categories = $(this).find("categories > category");
+ if (categories.length > 0 && tcategory) {
+ var i;
+ var found = false;
+ for (i = 0; i < categories.length; i++) {
+ var category = $(categories).get(i);
+ if ($(category).text().trim() != tcategory
+ && $.inArray($(category).text().trim(),
+ tcategory) < 0) {
+ found = true;
+ break;
+ }
+ }
+ if (!found)
+ $(this).remove();
+ }
+
+ $(this).attr('result', "N/A");
+ });
+ Tests = $(xml).find("testcase");
+ xmldoc = xml;
+ save_result();
+ doTest();
+ }
+
+ function precheck_init() {
+ server_url = "http://127.0.0.1:8000/check_server";
+ $.ajax({
+ async : false,
+ url : server_url,
+ type : "GET",
+ success : init_test,
+ error : function(x, t, e) {
+ print_error_log("can't find a http server",
+ "run widget in the standalone mode");
+ need_ajax = false;
+ init();
+ }
+ });
+ }
+
+ function init() {
+ getParms();
+
+ oTestFrame = document.getElementById('testframe');
+ if (!oTestFrame)
+ return;
+
+ statusFrame = document.getElementById('statusframe');
+ if (!statusFrame)
+ return;
+
+ var statusWin = statusFrame.contentWindow;
+ if (!statusWin)
+ return;
+
+ statusNode = statusWin.document.createElement("div");
+ if (!statusNode)
+ return;
+ statusWin.document.body.appendChild(statusNode);
+
+ frmset = $($('#main')).get(0);
+ if (!frmset)
+ return;
+
+ if (hidestatus && hidestatus == "1")
+ $(frmset).attr('rows', "0, *");
+ if (need_ajax) {
+ $.ajax({
+ async : false,
+ type : "GET",
+ url : server + '/get_testsuite',
+ dataType : "xml",
+ success : runTestsuite_nofilter,
+ error : function(x, t, e) {
+ print_error_log("init", e);
+ }
+ });
+ }
+ if (!xmldoc) {
+ if (!ttestsuite) {
+ ttestsuite = 'tests.xml';
+ }
+ $.ajax({
+ async : false,
+ type : "GET",
+ url : ttestsuite,
+ dataType : "xml",
+ success : runTestsuite,
+ error : function(x, t, e) {
+ print_error_log("init", e);
+ }
+ });
+ }
+ }
+
+ function escape_html(s) {
+ return s.replace(/\&/g, "&").replace(/</g, "<").replace(/"/g,
+ """).replace(/'/g, "'");
+ }
+
+ function check_timeout(time) {
+ if (time == 11) {
+ report('BLOCK', "Time is out");
+ }
+ sleep_time = time * 50;
+ setTimeout("CheckResult('yes', " + time + ")", sleep_time);
+ }
+
+ function CheckResult(need_check_block, sleep_time) {
+ var message = "";
+ var total_num = "";
+ var locator_key = "";
+ var value = "";
+
+ var oTestWin = oTestFrame.contentWindow;
+ var oTestDoc = oTestWin.document;
+ var case_uri = current_page_uri;
+
+ try {
+ if (oTestWin.document.readyState == "complete") {
+ total_num = getTestPageParam(case_uri, "total_num");
+ locator_key = getTestPageParam(case_uri, "locator_key");
+ value = getTestPageParam(case_uri, "value");
+
+ oPass = $(oTestDoc).find(".pass");
+ oFail = $(oTestDoc).find(".fail");
+
+ // Test page has parameters
+ 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].textContent;
+ var desc = results[i].childNodes[1].textContent;
+ var msg = results[i].childNodes[2].textContent;
+ if (rest && rest.toUpperCase() == "PASS")
+ report('PASS', msg);
+ else
+ report('FAIL', msg);
+ break;
+ }
+ } else {
+ var i;
+ for (i = 0; i < fails.length; i++) {
+ var desccell = fails[i].childNodes[1];
+ if (desccell)
+ message += "\n###Test Start###\n"
+ + desccell.textContent
+ + "\n###Test End###\n";
+ var msgcell = fails[i].childNodes[2];
+ if (msgcell)
+ message += "###Error1 Start###\n"
+ + msgcell.textContent
+ + "\n###Error1 End###";
+ }
+ report('FAIL', message);
+ }
+ } else if (locator_key == "test_name") {
+ // Place holder
+ } else if (locator_key == "msg") {
+ // Place holder
+ } else {
+ alert("Unknown locator key");
+ }
+ } else if (oPass.length > 0 && oFail.length == 0) {
+ if (oTestWin.resultdiv)
+ message = oTestWin.resultdiv.innerHTML;
+ report('PASS', message);
+ } 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)
+ message += "\n###Test Start###\n"
+ + desccell.textContent + "\n###Test End###\n";
+ var msgcell = fails[i].childNodes[2];
+ if (msgcell)
+ message += "###Error2 Start###\n"
+ + msgcell.textContent
+ + "\n###Error2 End###";
+ }
+ }
+ report('FAIL', message);
+ } else // oFail.length==0 && oPass.length==0
+ if (need_check_block == 'yes') {
+ next_sleep_time = sleep_time + 1;
+ check_timeout(next_sleep_time);
+ return;
+ }
+ } else // not complete
+ if (need_check_block == 'yes') {
+ next_sleep_time = sleep_time + 1;
+ check_timeout(next_sleep_time);
+ return;
+ }
+ } catch (e) {
+ report('BLOCK', e);
+ }
+ }
+
+ function report(result, log) {
+
+ if (iTest >= Tests.length)
+ return;
+ $(Tests[iTest]).attr('result', result);
+ var doc = $.parseXML("<result_info>" + "<actual_result>" + result
+ + "</actual_result>" + "<start>" + startTime + "</start>"
+ + "<end>" + new Date() + "</end>" + "<stdout>"
+ + escape_html(log) + "</stdout>" + "</result_info>");
+ $(Tests[iTest]).append(doc.documentElement);
+
+ statusNode.innerHTML = "Test #" + (iTest + 1) + "/" + Tests.length
+ + "(" + result + ") " + current_page_uri;
+
+ try {
+ var starts = log.indexOf('value:');
+ var stops = log.lastIndexOf(',');
+ var resultinfo = log.substring(starts + 6, stops);
+ $(Tests[iTest]).find("measurement").attr('value', resultinfo);
+ } catch (e) {
+ }
+
+ iTest++;
+
+ if (activetest) {
+ doTest();
+ } else {
+ activetest = true;
+ }
+ }
+
+ function doTest() {
+ while (iTest < Tests.length) {
+ if ($(Tests[iTest]).attr('execution_type') != 'auto') {
+ iTest++;
+ continue;
+ }
+ var ts = $(Tests[iTest]).find('test_script_entry');
+ if (ts.length == 0) {
+ iTest++;
+ continue;
+ }
+ var it = $(ts).get(0);
+ var tstr = $(it).attr('timeout');
+ if (!tstr)
+ timeout = 8 * defTime;
+ else {
+ var t;
+ try {
+ t = parseInt(tstr) * 1000;
+ } catch (e) {
+ t = 8 * defTime;
+ }
+ timeout = t;
+ }
+
+ pset = $(Tests[iTest]).parent().attr('name');
+ psuite = $(Tests[iTest]).parent().parent().attr('name');
+
+ startTime = new Date();
+
+ current_page_uri = $(it).text();
+ var index = current_page_uri.indexOf("?");
+ var test_page = "";
+ if (need_ajax) {
+ var svr = server + "/test_hint";
+ $.ajax({
+ async : false,
+ type : "POST",
+ url : svr,
+ data : {
+ suite : psuite,
+ set : pset,
+ testcase : current_page_uri
+ },
+ error : function(x, t, e) {
+ print_error_log("doTest", e);
+ }
+ });
+ }
+ if (index >= 0)
+ test_page = current_page_uri.substring(0, index);
+ else
+ test_page = current_page_uri;
+
+ // Don't load the same test page again
+ if (test_page == last_test_page) {
+ print_error_log("test page url is the same as the last one",
+ test_page);
+ activetest = false;
+ CheckResult('yes', 0);
+ continue;
+ }
+
+ if ((current_page_uri.indexOf("2DTransforms") != -1)
+ || (current_page_uri.indexOf("3DTransforms") != -1)) {
+ oTestFrame.height = 500000 + "px";
+ } else {
+ oTestFrame.height = 2500 + "px";
+ }
+ oTestFrame.src = current_page_uri;
+ last_test_page = test_page;
+ if (oTestFrame.attachEvent) {
+ oTestFrame.attachEvent("onload", function() {
+ CheckResult('yes', 0);
+ });
+ } else {
+ oTestFrame.onload = function() {
+ CheckResult('yes', 0);
+ };
+ }
+ return;
+ }
+ doManualTest();
+ }
+
+ function doManualTest() {
+ manualcaseslist = new Array();
+ var iTemp1 = 0, iTemp2 = 0;
+ while (iTemp1 < Tests.length) {
+ if ($(Tests[iTemp1]).attr('execution_type') == 'manual') {
+ parent.document.getElementById("statusframe").height = 385 + "px";
+ manualcaseslist[iTemp2] = new manualcases();
+ manualcaseslist[iTemp2].casesid = $(Tests[iTemp1]).attr('id');
+ manualcaseslist[iTemp2].index = iTemp1;
+ manualcaseslist[iTemp2].result = $(Tests[iTemp1])
+ .attr('result');
+ iTemp2++;
+ }
+ iTemp1++;
+ }
+ if (iTemp2 > 0) {
+ winCloseTimeout = 50000;
+ statusFrame.src = "./manualharness.html";
+ $(frmset).attr('rows', "100,*");
+ } else if (iTest == Tests.length) {
+ setTimeout("PublishResult()", 2000);
+ }
+ oTestFrame.src = '';
+ }
+
+ function PublishResult() {
+ $(frmset).attr('rows', "0, *");
+ results = oTestFrame.contentWindow;
+ var resultXML;
+ resultXML = "<title>HTML5 Test Result XML</title>";
+ resultXML += "<head> <style type='text/css'>\
+html {font-family:DejaVu Sans, Bitstream Vera Sans, Arial, Sans;}\
+section#summary {margin-bottom:1em;}\
+table#results {\
+ border-collapse:collapse;\
+ table-layout:fixed;\
+ width:80%;\
+}\
+table#results th:first-child,\
+table#results td:first-child {\
+ width:40%;\
+}\
+table#results th:last-child,\
+table#results td:last-child {\
+ width:30%;\
+}\
+table#results th {\
+ padding:0;\
+ padding-bottom:0.5em;\
+ text-align:left;\
+ border-bottom:medium solid black;\
+}\
+table#results td {\
+ padding:1em;\
+ padding-bottom:0.5em;\
+ border-bottom:thin solid black;\
+}\
+</style><head>";
+
+ resultXML += "<section id='summary'>";
+ resultXML += "<h2>Summary</h2>";
+ var ipass = $(xmldoc).find("testcase[result='PASS']").length;
+ var failList = $(xmldoc).find("testcase[result='FAIL']");
+ var ifail = failList.length;
+ resultXML += "<h3>Total:" + Tests.length
+ + " Pass:<span style='color:green;'>" + ipass
+ + "</span> Fail:<span style='color:red;'>" + ifail
+ + "</span></h3>";
+ resultXML += "</section>";
+
+ resultXML += "<p><table id='results'> <tr> <th> TestSet </th> <th> Pass </th> <th> Fail </th></tr>";
+ var Sets = $(xmldoc).find("set");
+ var i = 0;
+ for (i = 0; i < Sets.length; i++) {
+ ipass = $(Sets[i]).find("testcase[result='PASS']").length;
+ ifail = $(Sets[i]).find("testcase[result='FAIL']").length;
+ resultXML += "<tr>";
+ resultXML += "<td>" + $(Sets[i]).attr('name') + "</td>";
+ resultXML += "<td style='color:green;'>" + ipass
+ + "</td><td style='color:red;'>" + ifail + "</td>";
+ resultXML += "</tr>";
+ }
+ resultXML += "</table>";
+
+ if (ifail > 0) {
+ resultXML += "<section id='failedlist'>";
+ resultXML += "<h2>Fails</h2>";
+ resultXML += "<ul>";
+ for (i = 0; i < failList.length; i++) {
+ var ts = $(failList[i]).find("test_script_entry");
+ if (ts.length > 0) {
+ var t = ts.get(0);
+ resultXML += "<li style='color:red;'>" + $(t).text()
+ + "</li>";
+ }
+ }
+ resultXML += "</ul>";
+ resultXML += "</section>";
+ }
+
+ resultXML += "<h2>Details</h2>";
+ resultXML += "<form method='post' id='resultform'> <textarea id='results' style='width: 80%; height: 90%;' name='filecontent' disabled='disabled'>"
+ + save_result() + "</textarea></form>";
+ setTimeout("window.open('','_self','');window.close()", winCloseTimeout);
+ results.document.writeln(resultXML);
+ }
+
+ function save_result() {
+ var svr = server + "/save_result";
+ var testid = (new Date()).getTime();
+ var contents = (new XMLSerializer()).serializeToString(xmldoc);
+ if (need_ajax) {
+ $.ajax({
+ async : false,
+ type : "POST",
+ url : svr,
+ data : {
+ filename : testid,
+ filecontent : contents
+ },
+ error : function(x, t, e) {
+ print_error_log("doTest", e);
+ }
+ });
+ }
+ return contents;
+ }
+ // merge code from application.js
+ function init_test() {
+ var session_id = Math.round(Math.random() * 10000);
+ init_message_frame();
+ save_session_id(session_id);
+ sync_session_id(session_id);
+ start_test();
+ }
+
+ function init_message_frame() {
+ messageFrame = document.getElementById('messageframe');
+ messageWin = messageFrame.contentWindow;
+ messageNode = messageWin.document.getElementById('message_div');
+ if (null == messageNode) {
+ messageNode = messageWin.document.createElement("div");
+ messageNode.id = "message_div";
+ messageWin.document.body.appendChild(messageNode);
+ messageNode.innerHTML = "Message Area";
+ }
+ return messageNode;
+ }
+
+ function print_error_log(command, message) {
+ messageFrame = document.getElementById('messageframe');
+ messageFrame.height = 160 + "px";
+ messageNode = init_message_frame();
+ messageNode.innerHTML = "Message Area<div id=\"log_title\"></div><br/>Command: <div id=\"log_command\">"
+ + command
+ + "</div><br/>Message: <div id=\"log_message\">"
+ + message + "</div>";
+ }
+
+ function save_session_id(session_id) {
+ statusFrame = document.getElementById('statusframe');
+ statusFrame.height = 270 + "px";
+ 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/><div id=\"execution_progress\"></div><br/>";
+ }
+ }
+
+ function sync_session_id(session_id) {
+ var server_url = server + "/init_session_id";
+ server_url += "?session_id=" + session_id;
+ $.ajax({
+ async : false,
+ url : server_url,
+ type : "GET",
+ error : function(x, t, e) {
+ print_error_log("sync_session_id", e);
+ }
+ });
+ }
+
+ function get_session_id() {
+ statusFrame = document.getElementById('statusframe');
+ statusWin = statusFrame.contentWindow;
+ sessionIdNode = statusWin.document.getElementById('session_id');
+ return sessionIdNode.innerHTML;
+ }
+
+ function close_window(){
+ //for tct-webgl-nonw3c-tests run by tizen-tool emulator html,window.parent.close() no function,must call window.close, why?
+ if(window.parent != window.self){
+ window.open('','_self','');
+ window.close();
+ window.parent.onbeforeunload = null;
+ window.parent.close();
+ }
+ else{
+ window.open('','_self','');
+ window.close();
+ }
+ }
+ function start_test() {
+ try {
+ var task = ask_test_task();
+ } catch (e) {
+ print_error_log("start_test_ask_test_task", e);
+ }
+ try {
+ if (task == 1) {
+ print_error_log("start_test_execute_test_task",
+ "Invalid session");
+ } else if (task == -1) {
+ print_error_log("restart client process activated",
+ "this window will be closed in 2sec");
+ close_window();
+ //setTimeout("window.open('','_self','');window.close()", 2000);
+ } else if (task == null) {
+ print_error_log(
+ "get auto case failed, client will be restarted later",
+ "this window will be closed in 2sec");
+ close_window();
+ //setTimeout("window.open('','_self','');window.close()", 2000);
+ } else if (task != 0) {
+ var progress = check_execution_progress();
+ execute_test_task(task, progress);
+ } else {
+ execute_manual_test();
+ }
+ } catch (e) {
+ print_error_log("start_test_execute_test_task", e);
+ }
+ }
+
+ function ask_generate_xml() {
+ var server_url = server + "/generate_xml";
+ $.ajax({
+ async : false,
+ url : server_url,
+ type : "GET",
+ error : function(x, t, e) {
+ print_error_log("ask_generate_xml", e);
+ }
+ });
+ close_window();
+ //setTimeout("window.open('','_self','');window.close()", winCloseTimeout);
+ }
+
+ function extract_all_manual() {
+ var server_url = server + "/manual_cases";
+ var tasks = null;
+ $.ajax({
+ async : false,
+ url : server_url,
+ type : "GET",
+ dataType : "text",
+ success : function(txt) {
+ task = $.parseJSON(txt);
+ if (0 == task.none) {
+ task = null;
+ }
+ },
+ error : function(x, t, e) {
+ print_error_log("extract_all_manual", e);
+ }
+ });
+ return task;
+ }
+
+ function ask_test_task() {
+ var server_url = server + "/auto_test_task";
+ var task = null;
+ session_id = get_session_id();
+ server_url += "?session_id=" + session_id;
+ $.ajax({
+ async : false,
+ url : server_url,
+ type : "GET",
+ dataType : "text",
+ success : function(txt) {
+ task = $.parseJSON(txt);
+ if (task.none == 0) {
+ task = 0;
+ }
+ if (task.invalid == 0) {
+ task = 1;
+ }
+ if (task.stop == 0) {
+ task = -1;
+ }
+ },
+ error : function(x, t, e) {
+ print_error_log("ask_test_task", e);
+ }
+ });
+ return task;
+ }
+
+ function check_execution_progress() {
+ var server_url = server + "/check_execution_progress";
+ var progress = null;
+ session_id = get_session_id();
+ server_url += "?session_id=" + session_id;
+ $.ajax({
+ async : false,
+ url : server_url,
+ type : "GET",
+ dataType : "text",
+ success : function(txt) {
+ progress = $.parseJSON(txt);
+ },
+ error : function(x, t, e) {
+ print_error_log("check_execution_progress", e);
+ }
+ });
+ return progress;
+ }
+
+ function ask_next_step() {
+ var server_url = server + "/ask_next_step";
+ var next_step = null;
+ session_id = get_session_id();
+ server_url += "?session_id=" + session_id;
+ $.ajax({
+ async : false,
+ url : server_url,
+ type : "GET",
+ dataType : "text",
+ success : function(txt) {
+ next_step = $.parseJSON(txt);
+ },
+ error : function(x, t, e) {
+ print_error_log("ask_next_step", e);
+ }
+ });
+ return next_step;
+ }
+
+ 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, json_progress) {
+ try {
+ oTestFrame = document.getElementById('testframe');
+ statusNode = init_status_frame();
+ // update execution progress
+ statusFrame = document.getElementById('statusframe');
+ statusWin = statusFrame.contentWindow;
+ progressNode = statusWin.document
+ .getElementById('execution_progress');
+ progressNode.innerHTML = "Total:" + json_progress.total
+ + ", Current:" + json_progress.current;
+ // update case info
+ statusNode.innerHTML = "Test Purpose:<div id=\"test_purpose_div\">"
+ + json_task.purpose
+ + "</div><br/>Test Entry:<div id=\"test_entry_div\">"
+ + json_task.entry
+ + "</div><br/>Last Test Result:<div id=\"test_result_div\">"
+ + json_progress.last_test_result + "</div>";
+ current_page_uri = json_task.entry;
+ case_id_str = json_task.case_id;
+ var index = current_page_uri.indexOf("?");
+ var test_page = "";
+ if (index >= 0)
+ test_page = current_page_uri.substring(0, index);
+ else
+ test_page = current_page_uri;
+ // Get how many times to check BLOCK result
+ if (json_task.onload_delay) {
+ calculate_block_check_time(parseInt(json_task.onload_delay) * 1000);
+ } else {
+ print_error_log("execute_test_task",
+ "can't get attribute onload_delay from task: "
+ + json_task.purpose);
+ }
+ // Don't load the same test page again
+ if (test_page == last_test_page) {
+ print_error_log("test page url is the same as the last one",
+ test_page);
+ extract_case_result('yes', 0);
+ return;
+ }
+ if ((current_page_uri.indexOf("2DTransforms") != -1)
+ || (current_page_uri.indexOf("3DTransforms") != -1)) {
+ oTestFrame.height = 500000 + "px";
+ } else {
+ oTestFrame.height = 2500 + "px";
+ }
+ oTestFrame.src = current_page_uri;
+ last_test_page = test_page;
+ if (oTestFrame.attachEvent) {
+ oTestFrame.attachEvent("onload", function() {
+ extract_case_result('yes', 0);
+ });
+ } else {
+ oTestFrame.onload = function() {
+ extract_case_result('yes', 0);
+ };
+ }
+ } catch (e) {
+ print_error_log("execute_test_task", e);
+ }
+ }
+
+ function calculate_block_check_time(onload_delay) {
+ blockCheckTime = Math.ceil((Math.sqrt(onload_delay * 4 + 25) - 5) / 10);
+ }
+
+ function check_block_result_again(time) {
+ sleep_time = time * 50;
+ if (time == blockCheckTime) {
+ setTimeout("extract_case_result('no', " + time + ")", sleep_time);
+ return;
+ }
+ setTimeout("extract_case_result('yes', " + time + ")", sleep_time);
+ }
+
+ function extract_case_result(need_check_block, sleep_time) {
+ 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 = current_page_uri;
+
+ 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].textContent;
+ var desc = results[i].childNodes[1].textContent;
+ case_msg = results[i].childNodes[2].textContent;
+ if (rest && rest.toUpperCase() == "PASS") {
+ result = "PASS";
+ } else {
+ result = "FAIL";
+ }
+ break;
+ }
+ } else {
+ if (need_check_block == 'yes') {
+ next_sleep_time = sleep_time + 1;
+ check_block_result_again(next_sleep_time);
+ return;
+ }
+ else{
+ var i;
+ for (i = 0; i < fails.length; i++) {
+ var desccell = fails[i].childNodes[1];
+ if (desccell) {
+ case_msg += "\n###Test Start###\n" + desccell.textContent
+ + "\n###Test End###\n";
+ }
+ var msgcell = fails[i].childNodes[2];
+ if (msgcell) {
+ case_msg += "###Error1 Start###\n"
+ + msgcell.textContent + "\n###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 += "\n###Test Start###\n" + desccell.textContent
+ + "\n###Test End###\n";
+ }
+ var msgcell = fails[i].childNodes[2];
+ if (msgcell) {
+ case_msg += "###Error2 Start###\n" + msgcell.textContent
+ + "\n###Error2 End###";
+ }
+ }
+ }
+ result = "FAIL";
+ } else {
+ if (need_check_block == 'yes') {
+ next_sleep_time = sleep_time + 1;
+ check_block_result_again(next_sleep_time);
+ return;
+ }
+ }
+ var next_step = ask_next_step();
+ commit_test_result(result, case_msg);
+ if (next_step.step == "continue") {
+ start_test();
+ } else {
+ print_error_log("memory collection process activated",
+ "this window will be closed in 2sec");
+ close_window();
+ //setTimeout("window.open('','_self','');window.close()", 2000);
+ }
+ }
+
+ 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();
+ if (tasks != null){
+ for ( var i = 0; i < tasks.length; i++) {
+ if (parent.document.getElementById("statusframe"))
+ 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) {
+ statusFrame.src = "./manual_harness.html";
+ $($($('#main')).get(0)).attr('rows', "100,*");
+ }
+ oTestFrame = document.getElementById('testframe');
+ oTestFrame.src = '';
+ }
+ else {
+ // No manual cases, generate the result.
+ ask_generate_xml();
+ }
+ }
+
+ function commit_test_result(result, msg) {
+ statusFrame = document.getElementById('statusframe');
+ purposeNode = statusWin.document.getElementById('test_purpose_div');
+ session_id = get_session_id();
+ var purpose_str = purposeNode.innerHTML
+ var server_url = server + "/commit_result";
+ $.ajax({
+ async : false,
+ url : server_url,
+ type : "POST",
+ data : {
+ "case_id" : case_id_str,
+ "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");
+ }
+ },
+ error : function(x, t, e) {
+ print_error_log("commit_test_result", e);
+ }
+ });
+ }
+</script>
+</head>
+<body id="main" onload='precheck_init()'>
+ <iframe frameborder="1" height="30px" width="100%" id="messageframe"></iframe>
+ <iframe frameborder="1" height="30px" width="100%" id="statusframe"></iframe>
+ <iframe frameborder="1" height="2500px" width="100%" id="testframe" allowFullScreen="true" mozAllowFullScreen="true" webkitAllowFullscreen="true"></iframe>
+</body>
+</html>
--- /dev/null
+/*!
+ * jQuery JavaScript Library v1.7
+ * http://jquery.com/
+ *
+ * Copyright 2011, John Resig
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ * http://jquery.org/license
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ *
+ * Date: Thu Nov 3 16:18:21 2011 -0400
+ */
+(function( window, undefined ) {
+
+// Use the correct document accordingly with window argument (sandbox)
+var document = window.document,
+ navigator = window.navigator,
+ location = window.location;
+var jQuery = (function() {
+
+// Define a local copy of jQuery
+var jQuery = function( selector, context ) {
+ // The jQuery object is actually just the init constructor 'enhanced'
+ return new jQuery.fn.init( selector, context, rootjQuery );
+ },
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$,
+
+ // A central reference to the root jQuery(document)
+ rootjQuery,
+
+ // A simple way to check for HTML strings or ID strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+ // Check if a string has a non-whitespace character in it
+ rnotwhite = /\S/,
+
+ // Used for trimming whitespace
+ trimLeft = /^\s+/,
+ trimRight = /\s+$/,
+
+ // Check for digits
+ rdigit = /\d/,
+
+ // Match a standalone tag
+ rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
+
+ // JSON RegExp
+ rvalidchars = /^[\],:{}\s]*$/,
+ rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
+ rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
+ rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+
+ // Useragent RegExp
+ rwebkit = /(webkit)[ \/]([\w.]+)/,
+ ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
+ rmsie = /(msie) ([\w.]+)/,
+ rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+
+ // Matches dashed string for camelizing
+ rdashAlpha = /-([a-z]|[0-9])/ig,
+ rmsPrefix = /^-ms-/,
+
+ // Used by jQuery.camelCase as callback to replace()
+ fcamelCase = function( all, letter ) {
+ return ( letter + "" ).toUpperCase();
+ },
+
+ // Keep a UserAgent string for use with jQuery.browser
+ userAgent = navigator.userAgent,
+
+ // For matching the engine and version of the browser
+ browserMatch,
+
+ // The deferred used on DOM ready
+ readyList,
+
+ // The ready event handler
+ DOMContentLoaded,
+
+ // Save a reference to some core methods
+ toString = Object.prototype.toString,
+ hasOwn = Object.prototype.hasOwnProperty,
+ push = Array.prototype.push,
+ slice = Array.prototype.slice,
+ trim = String.prototype.trim,
+ indexOf = Array.prototype.indexOf,
+
+ // [[Class]] -> type pairs
+ class2type = {};
+
+jQuery.fn = jQuery.prototype = {
+ constructor: jQuery,
+ init: function( selector, context, rootjQuery ) {
+ var match, elem, ret, doc;
+
+ // Handle $(""), $(null), or $(undefined)
+ if ( !selector ) {
+ return this;
+ }
+
+ // Handle $(DOMElement)
+ if ( selector.nodeType ) {
+ this.context = this[0] = selector;
+ this.length = 1;
+ return this;
+ }
+
+ // The body element only exists once, optimize finding it
+ if ( selector === "body" && !context && document.body ) {
+ this.context = document;
+ this[0] = document.body;
+ this.selector = selector;
+ this.length = 1;
+ return this;
+ }
+
+ // Handle HTML strings
+ if ( typeof selector === "string" ) {
+ // Are we dealing with HTML string or an ID?
+ if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [ null, selector, null ];
+
+ } else {
+ match = quickExpr.exec( selector );
+ }
+
+ // Verify a match, and that no context was specified for #id
+ if ( match && (match[1] || !context) ) {
+
+ // HANDLE: $(html) -> $(array)
+ if ( match[1] ) {
+ context = context instanceof jQuery ? context[0] : context;
+ doc = ( context ? context.ownerDocument || context : document );
+
+ // If a single string is passed in and it's a single tag
+ // just do a createElement and skip the rest
+ ret = rsingleTag.exec( selector );
+
+ if ( ret ) {
+ if ( jQuery.isPlainObject( context ) ) {
+ selector = [ document.createElement( ret[1] ) ];
+ jQuery.fn.attr.call( selector, context, true );
+
+ } else {
+ selector = [ doc.createElement( ret[1] ) ];
+ }
+
+ } else {
+ ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
+ selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
+ }
+
+ return jQuery.merge( this, selector );
+
+ // HANDLE: $("#id")
+ } else {
+ elem = document.getElementById( match[2] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id !== match[2] ) {
+ return rootjQuery.find( selector );
+ }
+
+ // Otherwise, we inject the element directly into the jQuery object
+ this.length = 1;
+ this[0] = elem;
+ }
+
+ this.context = document;
+ this.selector = selector;
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if ( !context || context.jquery ) {
+ return ( context || rootjQuery ).find( selector );
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor( context ).find( selector );
+ }
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if ( jQuery.isFunction( selector ) ) {
+ return rootjQuery.ready( selector );
+ }
+
+ if ( selector.selector !== undefined ) {
+ this.selector = selector.selector;
+ this.context = selector.context;
+ }
+
+ return jQuery.makeArray( selector, this );
+ },
+
+ // Start with an empty selector
+ selector: "",
+
+ // The current version of jQuery being used
+ jquery: "1.7",
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ // The number of elements contained in the matched element set
+ size: function() {
+ return this.length;
+ },
+
+ toArray: function() {
+ return slice.call( this, 0 );
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function( num ) {
+ return num == null ?
+
+ // Return a 'clean' array
+ this.toArray() :
+
+ // Return just the object
+ ( num < 0 ? this[ this.length + num ] : this[ num ] );
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function( elems, name, selector ) {
+ // Build a new jQuery matched element set
+ var ret = this.constructor();
+
+ if ( jQuery.isArray( elems ) ) {
+ push.apply( ret, elems );
+
+ } else {
+ jQuery.merge( ret, elems );
+ }
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ ret.context = this.context;
+
+ if ( name === "find" ) {
+ ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+ } else if ( name ) {
+ ret.selector = this.selector + "." + name + "(" + selector + ")";
+ }
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ // (You can seed the arguments with an array of args, but this is
+ // only used internally.)
+ each: function( callback, args ) {
+ return jQuery.each( this, callback, args );
+ },
+
+ ready: function( fn ) {
+ // Attach the listeners
+ jQuery.bindReady();
+
+ // Add the callback
+ readyList.add( fn );
+
+ return this;
+ },
+
+ eq: function( i ) {
+ return i === -1 ?
+ this.slice( i ) :
+ this.slice( i, +i + 1 );
+ },
+
+ first: function() {
+ return this.eq( 0 );
+ },
+
+ last: function() {
+ return this.eq( -1 );
+ },
+
+ slice: function() {
+ return this.pushStack( slice.apply( this, arguments ),
+ "slice", slice.call(arguments).join(",") );
+ },
+
+ map: function( callback ) {
+ return this.pushStack( jQuery.map(this, function( elem, i ) {
+ return callback.call( elem, i, elem );
+ }));
+ },
+
+ end: function() {
+ return this.prevObject || this.constructor(null);
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: [].sort,
+ splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if ( typeof target === "boolean" ) {
+ deep = target;
+ target = arguments[1] || {};
+ // skip the boolean and the target
+ i = 2;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+ target = {};
+ }
+
+ // extend jQuery itself if only one argument is passed
+ if ( length === i ) {
+ target = this;
+ --i;
+ }
+
+ for ( ; i < length; i++ ) {
+ // Only deal with non-null/undefined values
+ if ( (options = arguments[ i ]) != null ) {
+ // Extend the base object
+ for ( name in options ) {
+ src = target[ name ];
+ copy = options[ name ];
+
+ // Prevent never-ending loop
+ if ( target === copy ) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+ if ( copyIsArray ) {
+ copyIsArray = false;
+ clone = src && jQuery.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[ name ] = jQuery.extend( deep, clone, copy );
+
+ // Don't bring in undefined values
+ } else if ( copy !== undefined ) {
+ target[ name ] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+};
+
+jQuery.extend({
+ noConflict: function( deep ) {
+ if ( window.$ === jQuery ) {
+ window.$ = _$;
+ }
+
+ if ( deep && window.jQuery === jQuery ) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ },
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Hold (or release) the ready event
+ holdReady: function( hold ) {
+ if ( hold ) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready( true );
+ }
+ },
+
+ // Handle when the DOM is ready
+ ready: function( wait ) {
+ // Either a released hold or an DOMready/load event and not yet ready
+ if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( !document.body ) {
+ return setTimeout( jQuery.ready, 1 );
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if ( wait !== true && --jQuery.readyWait > 0 ) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.fireWith( document, [ jQuery ] );
+
+ // Trigger any bound ready events
+ if ( jQuery.fn.trigger ) {
+ jQuery( document ).trigger( "ready" ).unbind( "ready" );
+ }
+ }
+ },
+
+ bindReady: function() {
+ if ( readyList ) {
+ return;
+ }
+
+ readyList = jQuery.Callbacks( "once memory" );
+
+ // Catch cases where $(document).ready() is called after the
+ // browser event has already occurred.
+ if ( document.readyState === "complete" ) {
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ return setTimeout( jQuery.ready, 1 );
+ }
+
+ // Mozilla, Opera and webkit nightlies currently support this event
+ if ( document.addEventListener ) {
+ // Use the handy event callback
+ document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener( "load", jQuery.ready, false );
+
+ // If IE event model is used
+ } else if ( document.attachEvent ) {
+ // ensure firing before onload,
+ // maybe late but safe also for iframes
+ document.attachEvent( "onreadystatechange", DOMContentLoaded );
+
+ // A fallback to window.onload, that will always work
+ window.attachEvent( "onload", jQuery.ready );
+
+ // If IE and not a frame
+ // continually check to see if the document is ready
+ var toplevel = false;
+
+ try {
+ toplevel = window.frameElement == null;
+ } catch(e) {}
+
+ if ( document.documentElement.doScroll && toplevel ) {
+ doScrollCheck();
+ }
+ }
+ },
+
+ // See test/unit/core.js for details concerning isFunction.
+ // Since version 1.3, DOM methods and functions like alert
+ // aren't supported. They return false on IE (#2968).
+ isFunction: function( obj ) {
+ return jQuery.type(obj) === "function";
+ },
+
+ isArray: Array.isArray || function( obj ) {
+ return jQuery.type(obj) === "array";
+ },
+
+ // A crude way of determining if an object is a window
+ isWindow: function( obj ) {
+ return obj && typeof obj === "object" && "setInterval" in obj;
+ },
+
+ isNumeric: function( obj ) {
+ return obj != null && rdigit.test( obj ) && !isNaN( obj );
+ },
+
+ type: function( obj ) {
+ return obj == null ?
+ String( obj ) :
+ class2type[ toString.call(obj) ] || "object";
+ },
+
+ isPlainObject: function( obj ) {
+ // Must be an Object.
+ // Because of IE, we also have to check the presence of the constructor property.
+ // Make sure that DOM nodes and window objects don't pass through, as well
+ if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+ return false;
+ }
+
+ try {
+ // Not own constructor property must be Object
+ if ( obj.constructor &&
+ !hasOwn.call(obj, "constructor") &&
+ !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+ return false;
+ }
+ } catch ( e ) {
+ // IE8,9 Will throw exceptions on certain host objects #9897
+ return false;
+ }
+
+ // Own properties are enumerated firstly, so to speed up,
+ // if last one is own, then all properties are own.
+
+ var key;
+ for ( key in obj ) {}
+
+ return key === undefined || hasOwn.call( obj, key );
+ },
+
+ isEmptyObject: function( obj ) {
+ for ( var name in obj ) {
+ return false;
+ }
+ return true;
+ },
+
+ error: function( msg ) {
+ throw msg;
+ },
+
+ parseJSON: function( data ) {
+ if ( typeof data !== "string" || !data ) {
+ return null;
+ }
+
+ // Make sure leading/trailing whitespace is removed (IE can't handle it)
+ data = jQuery.trim( data );
+
+ // Attempt to parse using the native JSON parser first
+ if ( window.JSON && window.JSON.parse ) {
+ return window.JSON.parse( data );
+ }
+
+ // Make sure the incoming data is actual JSON
+ // Logic borrowed from http://json.org/json2.js
+ if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+ .replace( rvalidtokens, "]" )
+ .replace( rvalidbraces, "")) ) {
+
+ return ( new Function( "return " + data ) )();
+
+ }
+ jQuery.error( "Invalid JSON: " + data );
+ },
+
+ // Cross-browser xml parsing
+ parseXML: function( data ) {
+ var xml, tmp;
+ try {
+ if ( window.DOMParser ) { // Standard
+ tmp = new DOMParser();
+ xml = tmp.parseFromString( data , "text/xml" );
+ } else { // IE
+ xml = new ActiveXObject( "Microsoft.XMLDOM" );
+ xml.async = "false";
+ xml.loadXML( data );
+ }
+ } catch( e ) {
+ xml = undefined;
+ }
+ if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+ jQuery.error( "Invalid XML: " + data );
+ }
+ return xml;
+ },
+
+ noop: function() {},
+
+ // Evaluates a script in a global context
+ // Workarounds based on findings by Jim Driscoll
+ // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+ globalEval: function( data ) {
+ if ( data && rnotwhite.test( data ) ) {
+ // We use execScript on Internet Explorer
+ // We use an anonymous function so that context is window
+ // rather than jQuery in Firefox
+ ( window.execScript || function( data ) {
+ window[ "eval" ].call( window, data );
+ } )( data );
+ }
+ },
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ camelCase: function( string ) {
+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+ },
+
+ nodeName: function( elem, name ) {
+ return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+ },
+
+ // args is for internal usage only
+ each: function( object, callback, args ) {
+ var name, i = 0,
+ length = object.length,
+ isObj = length === undefined || jQuery.isFunction( object );
+
+ if ( args ) {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.apply( object[ name ], args ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( ; i < length; ) {
+ if ( callback.apply( object[ i++ ], args ) === false ) {
+ break;
+ }
+ }
+ }
+
+ // A special, fast, case for the most common use of each
+ } else {
+ if ( isObj ) {
+ for ( name in object ) {
+ if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
+ break;
+ }
+ }
+ } else {
+ for ( ; i < length; ) {
+ if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
+ break;
+ }
+ }
+ }
+ }
+
+ return object;
+ },
+
+ // Use native String.trim function wherever possible
+ trim: trim ?
+ function( text ) {
+ return text == null ?
+ "" :
+ trim.call( text );
+ } :
+
+ // Otherwise use our own trimming functionality
+ function( text ) {
+ return text == null ?
+ "" :
+ text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
+ },
+
+ // results is for internal usage only
+ makeArray: function( array, results ) {
+ var ret = results || [];
+
+ if ( array != null ) {
+ // The window, strings (and functions) also have 'length'
+ // The extra typeof function check is to prevent crashes
+ // in Safari 2 (See: #3039)
+ // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+ var type = jQuery.type( array );
+
+ if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
+ push.call( ret, array );
+ } else {
+ jQuery.merge( ret, array );
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function( elem, array, i ) {
+ var len;
+
+ if ( array ) {
+ if ( indexOf ) {
+ return indexOf.call( array, elem, i );
+ }
+
+ len = array.length;
+ i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+ for ( ; i < len; i++ ) {
+ // Skip accessing in sparse arrays
+ if ( i in array && array[ i ] === elem ) {
+ return i;
+ }
+ }
+ }
+
+ return -1;
+ },
+
+ merge: function( first, second ) {
+ var i = first.length,
+ j = 0;
+
+ if ( typeof second.length === "number" ) {
+ for ( var l = second.length; j < l; j++ ) {
+ first[ i++ ] = second[ j ];
+ }
+
+ } else {
+ while ( second[j] !== undefined ) {
+ first[ i++ ] = second[ j++ ];
+ }
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function( elems, callback, inv ) {
+ var ret = [], retVal;
+ inv = !!inv;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for ( var i = 0, length = elems.length; i < length; i++ ) {
+ retVal = !!callback( elems[ i ], i );
+ if ( inv !== retVal ) {
+ ret.push( elems[ i ] );
+ }
+ }
+
+ return ret;
+ },
+
+ // arg is for internal usage only
+ map: function( elems, callback, arg ) {
+ var value, key, ret = [],
+ i = 0,
+ length = elems.length,
+ // jquery objects are treated as arrays
+ isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
+
+ // Go through the array, translating each of the items to their
+ if ( isArray ) {
+ for ( ; i < length; i++ ) {
+ value = callback( elems[ i ], i, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for ( key in elems ) {
+ value = callback( elems[ key ], key, arg );
+
+ if ( value != null ) {
+ ret[ ret.length ] = value;
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return ret.concat.apply( [], ret );
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ proxy: function( fn, context ) {
+ if ( typeof context === "string" ) {
+ var tmp = fn[ context ];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if ( !jQuery.isFunction( fn ) ) {
+ return undefined;
+ }
+
+ // Simulated bind
+ var args = slice.call( arguments, 2 ),
+ proxy = function() {
+ return fn.apply( context, args.concat( slice.call( arguments ) ) );
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
+
+ return proxy;
+ },
+
+ // Mutifunctional method to get and set values to a collection
+ // The value/s can optionally be executed if it's a function
+ access: function( elems, key, value, exec, fn, pass ) {
+ var length = elems.length;
+
+ // Setting many attributes
+ if ( typeof key === "object" ) {
+ for ( var k in key ) {
+ jQuery.access( elems, k, key[k], exec, fn, value );
+ }
+ return elems;
+ }
+
+ // Setting one attribute
+ if ( value !== undefined ) {
+ // Optionally, function values get executed if exec is true
+ exec = !pass && exec && jQuery.isFunction(value);
+
+ for ( var i = 0; i < length; i++ ) {
+ fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+ }
+
+ return elems;
+ }
+
+ // Getting an attribute
+ return length ? fn( elems[0], key ) : undefined;
+ },
+
+ now: function() {
+ return ( new Date() ).getTime();
+ },
+
+ // Use of jQuery.browser is frowned upon.
+ // More details: http://docs.jquery.com/Utilities/jQuery.browser
+ uaMatch: function( ua ) {
+ ua = ua.toLowerCase();
+
+ var match = rwebkit.exec( ua ) ||
+ ropera.exec( ua ) ||
+ rmsie.exec( ua ) ||
+ ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
+ [];
+
+ return { browser: match[1] || "", version: match[2] || "0" };
+ },
+
+ sub: function() {
+ function jQuerySub( selector, context ) {
+ return new jQuerySub.fn.init( selector, context );
+ }
+ jQuery.extend( true, jQuerySub, this );
+ jQuerySub.superclass = this;
+ jQuerySub.fn = jQuerySub.prototype = this();
+ jQuerySub.fn.constructor = jQuerySub;
+ jQuerySub.sub = this.sub;
+ jQuerySub.fn.init = function init( selector, context ) {
+ if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+ context = jQuerySub( context );
+ }
+
+ return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+ };
+ jQuerySub.fn.init.prototype = jQuerySub.fn;
+ var rootjQuerySub = jQuerySub(document);
+ return jQuerySub;
+ },
+
+ browser: {}
+});
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+ class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+browserMatch = jQuery.uaMatch( userAgent );
+if ( browserMatch.browser ) {
+ jQuery.browser[ browserMatch.browser ] = true;
+ jQuery.browser.version = browserMatch.version;
+}
+
+// Deprecated, use jQuery.browser.webkit instead
+if ( jQuery.browser.webkit ) {
+ jQuery.browser.safari = true;
+}
+
+// IE doesn't match non-breaking spaces with \s
+if ( rnotwhite.test( "\xA0" ) ) {
+ trimLeft = /^[\s\xA0]+/;
+ trimRight = /[\s\xA0]+$/;
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+
+// Cleanup functions for the document ready method
+if ( document.addEventListener ) {
+ DOMContentLoaded = function() {
+ document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+ jQuery.ready();
+ };
+
+} else if ( document.attachEvent ) {
+ DOMContentLoaded = function() {
+ // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+ if ( document.readyState === "complete" ) {
+ document.detachEvent( "onreadystatechange", DOMContentLoaded );
+ jQuery.ready();
+ }
+ };
+}
+
+// The DOM ready check for Internet Explorer
+function doScrollCheck() {
+ if ( jQuery.isReady ) {
+ return;
+ }
+
+ try {
+ // If IE is used, use the trick by Diego Perini
+ // http://javascript.nwbox.com/IEContentLoaded/
+ document.documentElement.doScroll("left");
+ } catch(e) {
+ setTimeout( doScrollCheck, 1 );
+ return;
+ }
+
+ // and execute any waiting functions
+ jQuery.ready();
+}
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+ define( "jquery", [], function () { return jQuery; } );
+}
+
+return jQuery;
+
+})();
+
+
+// String to Object flags format cache
+var flagsCache = {};
+
+// Convert String-formatted flags into Object-formatted ones and store in cache
+function createFlags( flags ) {
+ var object = flagsCache[ flags ] = {},
+ i, length;
+ flags = flags.split( /\s+/ );
+ for ( i = 0, length = flags.length; i < length; i++ ) {
+ object[ flags[i] ] = true;
+ }
+ return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ * flags: an optional list of space-separated flags that will change how
+ * the callback list behaves
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible flags:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( flags ) {
+
+ // Convert flags from String-formatted to Object-formatted
+ // (we check in cache first)
+ flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+
+ var // Actual callback list
+ list = [],
+ // Stack of fire calls for repeatable lists
+ stack = [],
+ // Last fire value (for non-forgettable lists)
+ memory,
+ // Flag to know if list is currently firing
+ firing,
+ // First callback to fire (used internally by add and fireWith)
+ firingStart,
+ // End of the loop when firing
+ firingLength,
+ // Index of currently firing callback (modified by remove if needed)
+ firingIndex,
+ // Add one or several callbacks to the list
+ add = function( args ) {
+ var i,
+ length,
+ elem,
+ type,
+ actual;
+ for ( i = 0, length = args.length; i < length; i++ ) {
+ elem = args[ i ];
+ type = jQuery.type( elem );
+ if ( type === "array" ) {
+ // Inspect recursively
+ add( elem );
+ } else if ( type === "function" ) {
+ // Add if not in unique mode and callback is not in
+ if ( !flags.unique || !self.has( elem ) ) {
+ list.push( elem );
+ }
+ }
+ }
+ },
+ // Fire callbacks
+ fire = function( context, args ) {
+ args = args || [];
+ memory = !flags.memory || [ context, args ];
+ firing = true;
+ firingIndex = firingStart || 0;
+ firingStart = 0;
+ firingLength = list.length;
+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+ if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
+ memory = true; // Mark as halted
+ break;
+ }
+ }
+ firing = false;
+ if ( list ) {
+ if ( !flags.once ) {
+ if ( stack && stack.length ) {
+ memory = stack.shift();
+ self.fireWith( memory[ 0 ], memory[ 1 ] );
+ }
+ } else if ( memory === true ) {
+ self.disable();
+ } else {
+ list = [];
+ }
+ }
+ },
+ // Actual Callbacks object
+ self = {
+ // Add a callback or a collection of callbacks to the list
+ add: function() {
+ if ( list ) {
+ var length = list.length;
+ add( arguments );
+ // Do we need to add the callbacks to the
+ // current firing batch?
+ if ( firing ) {
+ firingLength = list.length;
+ // With memory, if we're not firing then
+ // we should call right away, unless previous
+ // firing was halted (stopOnFalse)
+ } else if ( memory && memory !== true ) {
+ firingStart = length;
+ fire( memory[ 0 ], memory[ 1 ] );
+ }
+ }
+ return this;
+ },
+ // Remove a callback from the list
+ remove: function() {
+ if ( list ) {
+ var args = arguments,
+ argIndex = 0,
+ argLength = args.length;
+ for ( ; argIndex < argLength ; argIndex++ ) {
+ for ( var i = 0; i < list.length; i++ ) {
+ if ( args[ argIndex ] === list[ i ] ) {
+ // Handle firingIndex and firingLength
+ if ( firing ) {
+ if ( i <= firingLength ) {
+ firingLength--;
+ if ( i <= firingIndex ) {
+ firingIndex--;
+ }
+ }
+ }
+ // Remove the element
+ list.splice( i--, 1 );
+ // If we have some unicity property then
+ // we only need to do this once
+ if ( flags.unique ) {
+ break;
+ }
+ }
+ }
+ }
+ }
+ return this;
+ },
+ // Control if a given callback is in the list
+ has: function( fn ) {
+ if ( list ) {
+ var i = 0,
+ length = list.length;
+ for ( ; i < length; i++ ) {
+ if ( fn === list[ i ] ) {
+ return true;
+ }
+ }
+ }
+ return false;
+ },
+ // Remove all callbacks from the list
+ empty: function() {
+ list = [];
+ return this;
+ },
+ // Have the list do nothing anymore
+ disable: function() {
+ list = stack = memory = undefined;
+ return this;
+ },
+ // Is it disabled?
+ disabled: function() {
+ return !list;
+ },
+ // Lock the list in its current state
+ lock: function() {
+ stack = undefined;
+ if ( !memory || memory === true ) {
+ self.disable();
+ }
+ return this;
+ },
+ // Is it locked?
+ locked: function() {
+ return !stack;
+ },
+ // Call all callbacks with the given context and arguments
+ fireWith: function( context, args ) {
+ if ( stack ) {
+ if ( firing ) {
+ if ( !flags.once ) {
+ stack.push( [ context, args ] );
+ }
+ } else if ( !( flags.once && memory ) ) {
+ fire( context, args );
+ }
+ }
+ return this;
+ },
+ // Call all the callbacks with the given arguments
+ fire: function() {
+ self.fireWith( this, arguments );
+ return this;
+ },
+ // To know if the callbacks have already been called at least once
+ fired: function() {
+ return !!memory;
+ }
+ };
+
+ return self;
+};
+
+
+
+
+var // Static reference to slice
+ sliceDeferred = [].slice;
+
+jQuery.extend({
+
+ Deferred: function( func ) {
+ var doneList = jQuery.Callbacks( "once memory" ),
+ failList = jQuery.Callbacks( "once memory" ),
+ progressList = jQuery.Callbacks( "memory" ),
+ state = "pending",
+ lists = {
+ resolve: doneList,
+ reject: failList,
+ notify: progressList
+ },
+ promise = {
+ done: doneList.add,
+ fail: failList.add,
+ progress: progressList.add,
+
+ state: function() {
+ return state;
+ },
+
+ // Deprecated
+ isResolved: doneList.fired,
+ isRejected: failList.fired,
+
+ then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
+ deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
+ return this;
+ },
+ always: function() {
+ return deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
+ },
+ pipe: function( fnDone, fnFail, fnProgress ) {
+ return jQuery.Deferred(function( newDefer ) {
+ jQuery.each( {
+ done: [ fnDone, "resolve" ],
+ fail: [ fnFail, "reject" ],
+ progress: [ fnProgress, "notify" ]
+ }, function( handler, data ) {
+ var fn = data[ 0 ],
+ action = data[ 1 ],
+ returned;
+ if ( jQuery.isFunction( fn ) ) {
+ deferred[ handler ](function() {
+ returned = fn.apply( this, arguments );
+ if ( returned && jQuery.isFunction( returned.promise ) ) {
+ returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
+ } else {
+ newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+ }
+ });
+ } else {
+ deferred[ handler ]( newDefer[ action ] );
+ }
+ });
+ }).promise();
+ },
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function( obj ) {
+ if ( obj == null ) {
+ obj = promise;
+ } else {
+ for ( var key in promise ) {
+ obj[ key ] = promise[ key ];
+ }
+ }
+ return obj;
+ }
+ },
+ deferred = promise.promise({}),
+ key;
+
+ for ( key in lists ) {
+ deferred[ key ] = lists[ key ].fire;
+ deferred[ key + "With" ] = lists[ key ].fireWith;
+ }
+
+ // Handle state
+ deferred.done( function() {
+ state = "resolved";
+ }, failList.disable, progressList.lock ).fail( function() {
+ state = "rejected";
+ }, doneList.disable, progressList.lock );
+
+ // Call given func if any
+ if ( func ) {
+ func.call( deferred, deferred );
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function( firstParam ) {
+ var args = sliceDeferred.call( arguments, 0 ),
+ i = 0,
+ length = args.length,
+ pValues = new Array( length ),
+ count = length,
+ pCount = length,
+ deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
+ firstParam :
+ jQuery.Deferred(),
+ promise = deferred.promise();
+ function resolveFunc( i ) {
+ return function( value ) {
+ args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+ if ( !( --count ) ) {
+ deferred.resolveWith( deferred, args );
+ }
+ };
+ }
+ function progressFunc( i ) {
+ return function( value ) {
+ pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
+ deferred.notifyWith( promise, pValues );
+ };
+ }
+ if ( length > 1 ) {
+ for ( ; i < length; i++ ) {
+ if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
+ args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
+ } else {
+ --count;
+ }
+ }
+ if ( !count ) {
+ deferred.resolveWith( deferred, args );
+ }
+ } else if ( deferred !== firstParam ) {
+ deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
+ }
+ return promise;
+ }
+});
+
+
+
+
+jQuery.support = (function() {
+
+ var div = document.createElement( "div" ),
+ documentElement = document.documentElement,
+ all,
+ a,
+ select,
+ opt,
+ input,
+ marginDiv,
+ support,
+ fragment,
+ body,
+ testElementParent,
+ testElement,
+ testElementStyle,
+ tds,
+ events,
+ eventName,
+ i,
+ isSupported;
+
+ // Preliminary tests
+ div.setAttribute("className", "t");
+ div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/><nav></nav>";
+
+
+ all = div.getElementsByTagName( "*" );
+ a = div.getElementsByTagName( "a" )[ 0 ];
+
+ // Can't get basic test support
+ if ( !all || !all.length || !a ) {
+ return {};
+ }
+
+ // First batch of supports tests
+ select = document.createElement( "select" );
+ opt = select.appendChild( document.createElement("option") );
+ input = div.getElementsByTagName( "input" )[ 0 ];
+
+ support = {
+ // IE strips leading whitespace when .innerHTML is used
+ leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+ // Make sure that tbody elements aren't automatically inserted
+ // IE will insert them into empty tables
+ tbody: !div.getElementsByTagName( "tbody" ).length,
+
+ // Make sure that link elements get serialized correctly by innerHTML
+ // This requires a wrapper element in IE
+ htmlSerialize: !!div.getElementsByTagName( "link" ).length,
+
+ // Get the style information from getAttribute
+ // (IE uses .cssText instead)
+ style: /top/.test( a.getAttribute("style") ),
+
+ // Make sure that URLs aren't manipulated
+ // (IE normalizes it by default)
+ hrefNormalized: ( a.getAttribute( "href" ) === "/a" ),
+
+ // Make sure that element opacity exists
+ // (IE uses filter instead)
+ // Use a regex to work around a WebKit issue. See #5145
+ opacity: /^0.55/.test( a.style.opacity ),
+
+ // Verify style float existence
+ // (IE uses styleFloat instead of cssFloat)
+ cssFloat: !!a.style.cssFloat,
+
+ // Make sure unknown elements (like HTML5 elems) are handled appropriately
+ unknownElems: !!div.getElementsByTagName( "nav" ).length,
+
+ // Make sure that if no value is specified for a checkbox
+ // that it defaults to "on".
+ // (WebKit defaults to "" instead)
+ checkOn: ( input.value === "on" ),
+
+ // Make sure that a selected-by-default option has a working selected property.
+ // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+ optSelected: opt.selected,
+
+ // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+ getSetAttribute: div.className !== "t",
+
+ // Tests for enctype support on a form(#6743)
+ enctype: !!document.createElement("form").enctype,
+
+ // Will be defined later
+ submitBubbles: true,
+ changeBubbles: true,
+ focusinBubbles: false,
+ deleteExpando: true,
+ noCloneEvent: true,
+ inlineBlockNeedsLayout: false,
+ shrinkWrapBlocks: false,
+ reliableMarginRight: true
+ };
+
+ // Make sure checked status is properly cloned
+ input.checked = true;
+ support.noCloneChecked = input.cloneNode( true ).checked;
+
+ // Make sure that the options inside disabled selects aren't marked as disabled
+ // (WebKit marks them as disabled)
+ select.disabled = true;
+ support.optDisabled = !opt.disabled;
+
+ // Test to see if it's possible to delete an expando from an element
+ // Fails in Internet Explorer
+ try {
+ delete div.test;
+ } catch( e ) {
+ support.deleteExpando = false;
+ }
+
+ if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+ div.attachEvent( "onclick", function() {
+ // Cloning a node shouldn't copy over any
+ // bound event handlers (IE does this)
+ support.noCloneEvent = false;
+ });
+ div.cloneNode( true ).fireEvent( "onclick" );
+ }
+
+ // Check if a radio maintains its value
+ // after being appended to the DOM
+ input = document.createElement("input");
+ input.value = "t";
+ input.setAttribute("type", "radio");
+ support.radioValue = input.value === "t";
+
+ input.setAttribute("checked", "checked");
+ div.appendChild( input );
+ fragment = document.createDocumentFragment();
+ fragment.appendChild( div.lastChild );
+
+ // WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+ div.innerHTML = "";
+
+ // Figure out if the W3C box model works as expected
+ div.style.width = div.style.paddingLeft = "1px";
+
+ // We don't want to do body-related feature tests on frameset
+ // documents, which lack a body. So we use
+ // document.getElementsByTagName("body")[0], which is undefined in
+ // frameset documents, while document.body isn’t. (7398)
+ body = document.getElementsByTagName("body")[ 0 ];
+ // We use our own, invisible, body unless the body is already present
+ // in which case we use a div (#9239)
+ testElement = document.createElement( body ? "div" : "body" );
+ testElementStyle = {
+ visibility: "hidden",
+ width: 0,
+ height: 0,
+ border: 0,
+ margin: 0,
+ background: "none"
+ };
+ if ( body ) {
+ jQuery.extend( testElementStyle, {
+ position: "absolute",
+ left: "-999px",
+ top: "-999px"
+ });
+ }
+ for ( i in testElementStyle ) {
+ testElement.style[ i ] = testElementStyle[ i ];
+ }
+ testElement.appendChild( div );
+ testElementParent = body || documentElement;
+ testElementParent.insertBefore( testElement, testElementParent.firstChild );
+
+ // Check if a disconnected checkbox will retain its checked
+ // value of true after appended to the DOM (IE6/7)
+ support.appendChecked = input.checked;
+
+ support.boxModel = div.offsetWidth === 2;
+
+ if ( "zoom" in div.style ) {
+ // Check if natively block-level elements act like inline-block
+ // elements when setting their display to 'inline' and giving
+ // them layout
+ // (IE < 8 does this)
+ div.style.display = "inline";
+ div.style.zoom = 1;
+ support.inlineBlockNeedsLayout = ( div.offsetWidth === 2 );
+
+ // Check if elements with layout shrink-wrap their children
+ // (IE 6 does this)
+ div.style.display = "";
+ div.innerHTML = "<div style='width:4px;'></div>";
+ support.shrinkWrapBlocks = ( div.offsetWidth !== 2 );
+ }
+
+ div.innerHTML = "<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>";
+ tds = div.getElementsByTagName( "td" );
+
+ // Check if table cells still have offsetWidth/Height when they are set
+ // to display:none and there are still other visible table cells in a
+ // table row; if so, offsetWidth/Height are not reliable for use when
+ // determining if an element has been hidden directly using
+ // display:none (it is still safe to use offsets if a parent element is
+ // hidden; don safety goggles and see bug #4512 for more information).
+ // (only IE 8 fails this test)
+ isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+ tds[ 0 ].style.display = "";
+ tds[ 1 ].style.display = "none";
+
+ // Check if empty table cells still have offsetWidth/Height
+ // (IE < 8 fail this test)
+ support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+ div.innerHTML = "";
+
+ // Check if div with explicit width and no margin-right incorrectly
+ // gets computed margin-right based on width of container. For more
+ // info see bug #3333
+ // Fails in WebKit before Feb 2011 nightlies
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ if ( document.defaultView && document.defaultView.getComputedStyle ) {
+ marginDiv = document.createElement( "div" );
+ marginDiv.style.width = "0";
+ marginDiv.style.marginRight = "0";
+ div.appendChild( marginDiv );
+ support.reliableMarginRight =
+ ( parseInt( ( document.defaultView.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
+ }
+
+ // Technique from Juriy Zaytsev
+ // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+ // We only care about the case where non-standard event systems
+ // are used, namely in IE. Short-circuiting here helps us to
+ // avoid an eval call (in setAttribute) which can cause CSP
+ // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+ if ( div.attachEvent ) {
+ for( i in {
+ submit: 1,
+ change: 1,
+ focusin: 1
+ } ) {
+ eventName = "on" + i;
+ isSupported = ( eventName in div );
+ if ( !isSupported ) {
+ div.setAttribute( eventName, "return;" );
+ isSupported = ( typeof div[ eventName ] === "function" );
+ }
+ support[ i + "Bubbles" ] = isSupported;
+ }
+ }
+
+ // Run fixed position tests at doc ready to avoid a crash
+ // related to the invisible body in IE8
+ jQuery(function() {
+ var container, outer, inner, table, td, offsetSupport,
+ conMarginTop = 1,
+ ptlm = "position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",
+ vb = "visibility:hidden;border:0;",
+ style = "style='" + ptlm + "border:5px solid #000;padding:0;'",
+ html = "<div " + style + "><div></div></div>" +
+ "<table " + style + " cellpadding='0' cellspacing='0'>" +
+ "<tr><td></td></tr></table>";
+
+ // Reconstruct a container
+ body = document.getElementsByTagName("body")[0];
+ if ( !body ) {
+ // Return for frameset docs that don't have a body
+ // These tests cannot be done
+ return;
+ }
+
+ container = document.createElement("div");
+ container.style.cssText = vb + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
+ body.insertBefore( container, body.firstChild );
+
+ // Construct a test element
+ testElement = document.createElement("div");
+ testElement.style.cssText = ptlm + vb;
+
+ testElement.innerHTML = html;
+ container.appendChild( testElement );
+ outer = testElement.firstChild;
+ inner = outer.firstChild;
+ td = outer.nextSibling.firstChild.firstChild;
+
+ offsetSupport = {
+ doesNotAddBorder: ( inner.offsetTop !== 5 ),
+ doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
+ };
+
+ inner.style.position = "fixed";
+ inner.style.top = "20px";
+
+ // safari subtracts parent border width here which is 5px
+ offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
+ inner.style.position = inner.style.top = "";
+
+ outer.style.overflow = "hidden";
+ outer.style.position = "relative";
+
+ offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
+ offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
+
+ body.removeChild( container );
+ testElement = container = null;
+
+ jQuery.extend( support, offsetSupport );
+ });
+
+ testElement.innerHTML = "";
+ testElementParent.removeChild( testElement );
+
+ // Null connected elements to avoid leaks in IE
+ testElement = fragment = select = opt = body = marginDiv = div = input = null;
+
+ return support;
+})();
+
+// Keep track of boxModel
+jQuery.boxModel = jQuery.support.boxModel;
+
+
+
+
+var rbrace = /^(?:\{.*\}|\[.*\])$/,
+ rmultiDash = /([A-Z])/g;
+
+jQuery.extend({
+ cache: {},
+
+ // Please use with caution
+ uuid: 0,
+
+ // Unique for each copy of jQuery on the page
+ // Non-digits removed to match rinlinejQuery
+ expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+
+ // The following elements throw uncatchable exceptions if you
+ // attempt to add expando properties to them.
+ noData: {
+ "embed": true,
+ // Ban all objects except for Flash (which handle expandos)
+ "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+ "applet": true
+ },
+
+ hasData: function( elem ) {
+ elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+ return !!elem && !isEmptyDataObject( elem );
+ },
+
+ data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var privateCache, thisCache, ret,
+ internalKey = jQuery.expando,
+ getByName = typeof name === "string",
+
+ // We have to handle DOM nodes and JS objects differently because IE6-7
+ // can't GC object references properly across the DOM-JS boundary
+ isNode = elem.nodeType,
+
+ // Only DOM nodes need the global jQuery cache; JS object data is
+ // attached directly to the object so GC can occur automatically
+ cache = isNode ? jQuery.cache : elem,
+
+ // Only defining an ID for JS objects if its cache already exists allows
+ // the code to shortcut on the same path as a DOM node with no cache
+ id = isNode ? elem[ jQuery.expando ] : elem[ jQuery.expando ] && jQuery.expando,
+ isEvents = name === "events";
+
+ // Avoid doing any more work than we need to when trying to get data on an
+ // object that has no data at all
+ if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
+ return;
+ }
+
+ if ( !id ) {
+ // Only DOM nodes need a new unique ID for each element since their data
+ // ends up in the global cache
+ if ( isNode ) {
+ elem[ jQuery.expando ] = id = ++jQuery.uuid;
+ } else {
+ id = jQuery.expando;
+ }
+ }
+
+ if ( !cache[ id ] ) {
+ cache[ id ] = {};
+
+ // Avoids exposing jQuery metadata on plain JS objects when the object
+ // is serialized using JSON.stringify
+ if ( !isNode ) {
+ cache[ id ].toJSON = jQuery.noop;
+ }
+ }
+
+ // An object can be passed to jQuery.data instead of a key/value pair; this gets
+ // shallow copied over onto the existing cache
+ if ( typeof name === "object" || typeof name === "function" ) {
+ if ( pvt ) {
+ cache[ id ] = jQuery.extend( cache[ id ], name );
+ } else {
+ cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+ }
+ }
+
+ privateCache = thisCache = cache[ id ];
+
+ // jQuery data() is stored in a separate object inside the object's internal data
+ // cache in order to avoid key collisions between internal data and user-defined
+ // data.
+ if ( !pvt ) {
+ if ( !thisCache.data ) {
+ thisCache.data = {};
+ }
+
+ thisCache = thisCache.data;
+ }
+
+ if ( data !== undefined ) {
+ thisCache[ jQuery.camelCase( name ) ] = data;
+ }
+
+ // Users should not attempt to inspect the internal events object using jQuery.data,
+ // it is undocumented and subject to change. But does anyone listen? No.
+ if ( isEvents && !thisCache[ name ] ) {
+ return privateCache.events;
+ }
+
+ // Check for both converted-to-camel and non-converted data property names
+ // If a data property was specified
+ if ( getByName ) {
+
+ // First Try to find as-is property data
+ ret = thisCache[ name ];
+
+ // Test for null|undefined property data
+ if ( ret == null ) {
+
+ // Try to find the camelCased property
+ ret = thisCache[ jQuery.camelCase( name ) ];
+ }
+ } else {
+ ret = thisCache;
+ }
+
+ return ret;
+ },
+
+ removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+ if ( !jQuery.acceptData( elem ) ) {
+ return;
+ }
+
+ var thisCache, i, l,
+
+ // Reference to internal data cache key
+ internalKey = jQuery.expando,
+
+ isNode = elem.nodeType,
+
+ // See jQuery.data for more information
+ cache = isNode ? jQuery.cache : elem,
+
+ // See jQuery.data for more information
+ id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+ // If there is already no cache entry for this object, there is no
+ // purpose in continuing
+ if ( !cache[ id ] ) {
+ return;
+ }
+
+ if ( name ) {
+
+ thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+ if ( thisCache ) {
+
+ // Support space separated names
+ if ( jQuery.isArray( name ) ) {
+ name = name;
+ } else if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+
+ // split the camel cased version by spaces
+ name = jQuery.camelCase( name );
+ if ( name in thisCache ) {
+ name = [ name ];
+ } else {
+ name = name.split( " " );
+ }
+ }
+
+ for ( i = 0, l = name.length; i < l; i++ ) {
+ delete thisCache[ name[i] ];
+ }
+
+ // If there is no data left in the cache, we want to continue
+ // and let the cache object itself get destroyed
+ if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+ return;
+ }
+ }
+ }
+
+ // See jQuery.data for more information
+ if ( !pvt ) {
+ delete cache[ id ].data;
+
+ // Don't destroy the parent cache unless the internal data object
+ // had been the only thing left in it
+ if ( !isEmptyDataObject(cache[ id ]) ) {
+ return;
+ }
+ }
+
+ // Browsers that fail expando deletion also refuse to delete expandos on
+ // the window, but it will allow it on all other JS objects; other browsers
+ // don't care
+ // Ensure that `cache` is not a window object #10080
+ if ( jQuery.support.deleteExpando || !cache.setInterval ) {
+ delete cache[ id ];
+ } else {
+ cache[ id ] = null;
+ }
+
+ // We destroyed the cache and need to eliminate the expando on the node to avoid
+ // false lookups in the cache for entries that no longer exist
+ if ( isNode ) {
+ // IE does not allow us to delete expando properties from nodes,
+ // nor does it have a removeAttribute function on Document nodes;
+ // we must handle all of these cases
+ if ( jQuery.support.deleteExpando ) {
+ delete elem[ jQuery.expando ];
+ } else if ( elem.removeAttribute ) {
+ elem.removeAttribute( jQuery.expando );
+ } else {
+ elem[ jQuery.expando ] = null;
+ }
+ }
+ },
+
+ // For internal use only.
+ _data: function( elem, name, data ) {
+ return jQuery.data( elem, name, data, true );
+ },
+
+ // A method for determining if a DOM node can handle the data expando
+ acceptData: function( elem ) {
+ if ( elem.nodeName ) {
+ var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+ if ( match ) {
+ return !(match === true || elem.getAttribute("classid") !== match);
+ }
+ }
+
+ return true;
+ }
+});
+
+jQuery.fn.extend({
+ data: function( key, value ) {
+ var parts, attr, name,
+ data = null;
+
+ if ( typeof key === "undefined" ) {
+ if ( this.length ) {
+ data = jQuery.data( this[0] );
+
+ if ( this[0].nodeType === 1 && !jQuery._data( this[0], "parsedAttrs" ) ) {
+ attr = this[0].attributes;
+ for ( var i = 0, l = attr.length; i < l; i++ ) {
+ name = attr[i].name;
+
+ if ( name.indexOf( "data-" ) === 0 ) {
+ name = jQuery.camelCase( name.substring(5) );
+
+ dataAttr( this[0], name, data[ name ] );
+ }
+ }
+ jQuery._data( this[0], "parsedAttrs", true );
+ }
+ }
+
+ return data;
+
+ } else if ( typeof key === "object" ) {
+ return this.each(function() {
+ jQuery.data( this, key );
+ });
+ }
+
+ parts = key.split(".");
+ parts[1] = parts[1] ? "." + parts[1] : "";
+
+ if ( value === undefined ) {
+ data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]);
+
+ // Try to fetch any internally stored data first
+ if ( data === undefined && this.length ) {
+ data = jQuery.data( this[0], key );
+ data = dataAttr( this[0], key, data );
+ }
+
+ return data === undefined && parts[1] ?
+ this.data( parts[0] ) :
+ data;
+
+ } else {
+ return this.each(function() {
+ var $this = jQuery( this ),
+ args = [ parts[0], value ];
+
+ $this.triggerHandler( "setData" + parts[1] + "!", args );
+ jQuery.data( this, key, value );
+ $this.triggerHandler( "changeData" + parts[1] + "!", args );
+ });
+ }
+ },
+
+ removeData: function( key ) {
+ return this.each(function() {
+ jQuery.removeData( this, key );
+ });
+ }
+});
+
+function dataAttr( elem, key, data ) {
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if ( data === undefined && elem.nodeType === 1 ) {
+
+ var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+ data = elem.getAttribute( name );
+
+ if ( typeof data === "string" ) {
+ try {
+ data = data === "true" ? true :
+ data === "false" ? false :
+ data === "null" ? null :
+ jQuery.isNumeric( data ) ? parseFloat( data ) :
+ rbrace.test( data ) ? jQuery.parseJSON( data ) :
+ data;
+ } catch( e ) {}
+
+ // Make sure we set the data so it isn't changed later
+ jQuery.data( elem, key, data );
+
+ } else {
+ data = undefined;
+ }
+ }
+
+ return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+ for ( var name in obj ) {
+
+ // if the public data object is empty, the private is still empty
+ if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+ continue;
+ }
+ if ( name !== "toJSON" ) {
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
+
+
+function handleQueueMarkDefer( elem, type, src ) {
+ var deferDataKey = type + "defer",
+ queueDataKey = type + "queue",
+ markDataKey = type + "mark",
+ defer = jQuery._data( elem, deferDataKey );
+ if ( defer &&
+ ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
+ ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
+ // Give room for hard-coded callbacks to fire first
+ // and eventually mark/queue something else on the element
+ setTimeout( function() {
+ if ( !jQuery._data( elem, queueDataKey ) &&
+ !jQuery._data( elem, markDataKey ) ) {
+ jQuery.removeData( elem, deferDataKey, true );
+ defer.fire();
+ }
+ }, 0 );
+ }
+}
+
+jQuery.extend({
+
+ _mark: function( elem, type ) {
+ if ( elem ) {
+ type = ( type || "fx" ) + "mark";
+ jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
+ }
+ },
+
+ _unmark: function( force, elem, type ) {
+ if ( force !== true ) {
+ type = elem;
+ elem = force;
+ force = false;
+ }
+ if ( elem ) {
+ type = type || "fx";
+ var key = type + "mark",
+ count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
+ if ( count ) {
+ jQuery._data( elem, key, count );
+ } else {
+ jQuery.removeData( elem, key, true );
+ handleQueueMarkDefer( elem, type, "mark" );
+ }
+ }
+ },
+
+ queue: function( elem, type, data ) {
+ var q;
+ if ( elem ) {
+ type = ( type || "fx" ) + "queue";
+ q = jQuery._data( elem, type );
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if ( data ) {
+ if ( !q || jQuery.isArray(data) ) {
+ q = jQuery._data( elem, type, jQuery.makeArray(data) );
+ } else {
+ q.push( data );
+ }
+ }
+ return q || [];
+ }
+ },
+
+ dequeue: function( elem, type ) {
+ type = type || "fx";
+
+ var queue = jQuery.queue( elem, type ),
+ fn = queue.shift(),
+ hooks = {};
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if ( fn === "inprogress" ) {
+ fn = queue.shift();
+ }
+
+ if ( fn ) {
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if ( type === "fx" ) {
+ queue.unshift( "inprogress" );
+ }
+
+ jQuery._data( elem, type + ".run", hooks );
+ fn.call( elem, function() {
+ jQuery.dequeue( elem, type );
+ }, hooks );
+ }
+
+ if ( !queue.length ) {
+ jQuery.removeData( elem, type + "queue " + type + ".run", true );
+ handleQueueMarkDefer( elem, type, "queue" );
+ }
+ }
+});
+
+jQuery.fn.extend({
+ queue: function( type, data ) {
+ if ( typeof type !== "string" ) {
+ data = type;
+ type = "fx";
+ }
+
+ if ( data === undefined ) {
+ return jQuery.queue( this[0], type );
+ }
+ return this.each(function() {
+ var queue = jQuery.queue( this, type, data );
+
+ if ( type === "fx" && queue[0] !== "inprogress" ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ },
+ dequeue: function( type ) {
+ return this.each(function() {
+ jQuery.dequeue( this, type );
+ });
+ },
+ // Based off of the plugin by Clint Helfers, with permission.
+ // http://blindsignals.com/index.php/2009/07/jquery-delay/
+ delay: function( time, type ) {
+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+ type = type || "fx";
+
+ return this.queue( type, function( next, hooks ) {
+ var timeout = setTimeout( next, time );
+ hooks.stop = function() {
+ clearTimeout( timeout );
+ };
+ });
+ },
+ clearQueue: function( type ) {
+ return this.queue( type || "fx", [] );
+ },
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function( type, object ) {
+ if ( typeof type !== "string" ) {
+ object = type;
+ type = undefined;
+ }
+ type = type || "fx";
+ var defer = jQuery.Deferred(),
+ elements = this,
+ i = elements.length,
+ count = 1,
+ deferDataKey = type + "defer",
+ queueDataKey = type + "queue",
+ markDataKey = type + "mark",
+ tmp;
+ function resolve() {
+ if ( !( --count ) ) {
+ defer.resolveWith( elements, [ elements ] );
+ }
+ }
+ while( i-- ) {
+ if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
+ ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
+ jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
+ jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
+ count++;
+ tmp.add( resolve );
+ }
+ }
+ resolve();
+ return defer.promise();
+ }
+});
+
+
+
+
+var rclass = /[\n\t\r]/g,
+ rspace = /\s+/,
+ rreturn = /\r/g,
+ rtype = /^(?:button|input)$/i,
+ rfocusable = /^(?:button|input|object|select|textarea)$/i,
+ rclickable = /^a(?:rea)?$/i,
+ rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+ getSetAttribute = jQuery.support.getSetAttribute,
+ nodeHook, boolHook, fixSpecified;
+
+jQuery.fn.extend({
+ attr: function( name, value ) {
+ return jQuery.access( this, name, value, true, jQuery.attr );
+ },
+
+ removeAttr: function( name ) {
+ return this.each(function() {
+ jQuery.removeAttr( this, name );
+ });
+ },
+
+ prop: function( name, value ) {
+ return jQuery.access( this, name, value, true, jQuery.prop );
+ },
+
+ removeProp: function( name ) {
+ name = jQuery.propFix[ name ] || name;
+ return this.each(function() {
+ // try/catch handles cases where IE balks (such as removing a property on window)
+ try {
+ this[ name ] = undefined;
+ delete this[ name ];
+ } catch( e ) {}
+ });
+ },
+
+ addClass: function( value ) {
+ var classNames, i, l, elem,
+ setClass, c, cl;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).addClass( value.call(this, j, this.className) );
+ });
+ }
+
+ if ( value && typeof value === "string" ) {
+ classNames = value.split( rspace );
+
+ for ( i = 0, l = this.length; i < l; i++ ) {
+ elem = this[ i ];
+
+ if ( elem.nodeType === 1 ) {
+ if ( !elem.className && classNames.length === 1 ) {
+ elem.className = value;
+
+ } else {
+ setClass = " " + elem.className + " ";
+
+ for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+ if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+ setClass += classNames[ c ] + " ";
+ }
+ }
+ elem.className = jQuery.trim( setClass );
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function( value ) {
+ var classNames, i, l, elem, className, c, cl;
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( j ) {
+ jQuery( this ).removeClass( value.call(this, j, this.className) );
+ });
+ }
+
+ if ( (value && typeof value === "string") || value === undefined ) {
+ classNames = ( value || "" ).split( rspace );
+
+ for ( i = 0, l = this.length; i < l; i++ ) {
+ elem = this[ i ];
+
+ if ( elem.nodeType === 1 && elem.className ) {
+ if ( value ) {
+ className = (" " + elem.className + " ").replace( rclass, " " );
+ for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+ className = className.replace(" " + classNames[ c ] + " ", " ");
+ }
+ elem.className = jQuery.trim( className );
+
+ } else {
+ elem.className = "";
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function( value, stateVal ) {
+ var type = typeof value,
+ isBool = typeof stateVal === "boolean";
+
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function( i ) {
+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+ });
+ }
+
+ return this.each(function() {
+ if ( type === "string" ) {
+ // toggle individual class names
+ var className,
+ i = 0,
+ self = jQuery( this ),
+ state = stateVal,
+ classNames = value.split( rspace );
+
+ while ( (className = classNames[ i++ ]) ) {
+ // check each className given, space seperated list
+ state = isBool ? state : !self.hasClass( className );
+ self[ state ? "addClass" : "removeClass" ]( className );
+ }
+
+ } else if ( type === "undefined" || type === "boolean" ) {
+ if ( this.className ) {
+ // store className if set
+ jQuery._data( this, "__className__", this.className );
+ }
+
+ // toggle whole className
+ this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+ }
+ });
+ },
+
+ hasClass: function( selector ) {
+ var className = " " + selector + " ",
+ i = 0,
+ l = this.length;
+ for ( ; i < l; i++ ) {
+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+ return true;
+ }
+ }
+
+ return false;
+ },
+
+ val: function( value ) {
+ var hooks, ret, isFunction,
+ elem = this[0];
+
+ if ( !arguments.length ) {
+ if ( elem ) {
+ hooks = jQuery.valHooks[ elem.nodeName.toLowerCase() ] || jQuery.valHooks[ elem.type ];
+
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ return typeof ret === "string" ?
+ // handle most common string cases
+ ret.replace(rreturn, "") :
+ // handle cases where value is null/undef or number
+ ret == null ? "" : ret;
+ }
+
+ return undefined;
+ }
+
+ isFunction = jQuery.isFunction( value );
+
+ return this.each(function( i ) {
+ var self = jQuery(this), val;
+
+ if ( this.nodeType !== 1 ) {
+ return;
+ }
+
+ if ( isFunction ) {
+ val = value.call( this, i, self.val() );
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if ( val == null ) {
+ val = "";
+ } else if ( typeof val === "number" ) {
+ val += "";
+ } else if ( jQuery.isArray( val ) ) {
+ val = jQuery.map(val, function ( value ) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[ this.nodeName.toLowerCase() ] || jQuery.valHooks[ this.type ];
+
+ // If set returns undefined, fall back to normal setting
+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+ this.value = val;
+ }
+ });
+ }
+});
+
+jQuery.extend({
+ valHooks: {
+ option: {
+ get: function( elem ) {
+ // attributes.value is undefined in Blackberry 4.7 but
+ // uses .value. See #6932
+ var val = elem.attributes.value;
+ return !val || val.specified ? elem.value : elem.text;
+ }
+ },
+ select: {
+ get: function( elem ) {
+ var value, i, max, option,
+ index = elem.selectedIndex,
+ values = [],
+ options = elem.options,
+ one = elem.type === "select-one";
+
+ // Nothing was selected
+ if ( index < 0 ) {
+ return null;
+ }
+
+ // Loop through all the selected options
+ i = one ? index : 0;
+ max = one ? index + 1 : options.length;
+ for ( ; i < max; i++ ) {
+ option = options[ i ];
+
+ // Don't return options that are disabled or in a disabled optgroup
+ if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+ (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
+
+ // Get the specific value for the option
+ value = jQuery( option ).val();
+
+ // We don't need an array for one selects
+ if ( one ) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push( value );
+ }
+ }
+
+ // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+ if ( one && !values.length && options.length ) {
+ return jQuery( options[ index ] ).val();
+ }
+
+ return values;
+ },
+
+ set: function( elem, value ) {
+ var values = jQuery.makeArray( value );
+
+ jQuery(elem).find("option").each(function() {
+ this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+ });
+
+ if ( !values.length ) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ },
+
+ attrFn: {
+ val: true,
+ css: true,
+ html: true,
+ text: true,
+ data: true,
+ width: true,
+ height: true,
+ offset: true
+ },
+
+ attr: function( elem, name, value, pass ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set attributes on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return undefined;
+ }
+
+ if ( pass && name in jQuery.attrFn ) {
+ return jQuery( elem )[ name ]( value );
+ }
+
+ // Fallback to prop when attributes are not supported
+ if ( !("getAttribute" in elem) ) {
+ return jQuery.prop( elem, name, value );
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ // All attributes are lowercase
+ // Grab necessary hook if one is defined
+ if ( notxml ) {
+ name = name.toLowerCase();
+ hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+ }
+
+ if ( value !== undefined ) {
+
+ if ( value === null ) {
+ jQuery.removeAttr( elem, name );
+ return undefined;
+
+ } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ elem.setAttribute( name, "" + value );
+ return value;
+ }
+
+ } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+
+ ret = elem.getAttribute( name );
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret === null ?
+ undefined :
+ ret;
+ }
+ },
+
+ removeAttr: function( elem, value ) {
+ var propName, attrNames, name, l,
+ i = 0;
+
+ if ( elem.nodeType === 1 ) {
+ attrNames = ( value || "" ).split( rspace );
+ l = attrNames.length;
+
+ for ( ; i < l; i++ ) {
+ name = attrNames[ i ].toLowerCase();
+ propName = jQuery.propFix[ name ] || name;
+
+ // See #9699 for explanation of this approach (setting first, then removal)
+ jQuery.attr( elem, name, "" );
+ elem.removeAttribute( getSetAttribute ? name : propName );
+
+ // Set corresponding property to false for boolean attributes
+ if ( rboolean.test( name ) && propName in elem ) {
+ elem[ propName ] = false;
+ }
+ }
+ }
+ },
+
+ attrHooks: {
+ type: {
+ set: function( elem, value ) {
+ // We can't allow the type property to be changed (since it causes problems in IE)
+ if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+ jQuery.error( "type property can't be changed" );
+ } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+ // Setting the type on a radio button after the value resets the value in IE6-9
+ // Reset value to it's default in case type is set after value
+ // This is for element creation
+ var val = elem.value;
+ elem.setAttribute( "type", value );
+ if ( val ) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ },
+ // Use the value property for back compat
+ // Use the nodeHook for button elements in IE6/7 (#1954)
+ value: {
+ get: function( elem, name ) {
+ if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+ return nodeHook.get( elem, name );
+ }
+ return name in elem ?
+ elem.value :
+ null;
+ },
+ set: function( elem, value, name ) {
+ if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+ return nodeHook.set( elem, value, name );
+ }
+ // Does not return so that setAttribute is also used
+ elem.value = value;
+ }
+ }
+ },
+
+ propFix: {
+ tabindex: "tabIndex",
+ readonly: "readOnly",
+ "for": "htmlFor",
+ "class": "className",
+ maxlength: "maxLength",
+ cellspacing: "cellSpacing",
+ cellpadding: "cellPadding",
+ rowspan: "rowSpan",
+ colspan: "colSpan",
+ usemap: "useMap",
+ frameborder: "frameBorder",
+ contenteditable: "contentEditable"
+ },
+
+ prop: function( elem, name, value ) {
+ var ret, hooks, notxml,
+ nType = elem.nodeType;
+
+ // don't get/set properties on text, comment and attribute nodes
+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+ return undefined;
+ }
+
+ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+ if ( notxml ) {
+ // Fix name and attach hooks
+ name = jQuery.propFix[ name ] || name;
+ hooks = jQuery.propHooks[ name ];
+ }
+
+ if ( value !== undefined ) {
+ if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+ return ret;
+
+ } else {
+ return ( elem[ name ] = value );
+ }
+
+ } else {
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+ return ret;
+
+ } else {
+ return elem[ name ];
+ }
+ }
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function( elem ) {
+ // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+ // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ var attributeNode = elem.getAttributeNode("tabindex");
+
+ return attributeNode && attributeNode.specified ?
+ parseInt( attributeNode.value, 10 ) :
+ rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+ 0 :
+ undefined;
+ }
+ }
+ }
+});
+
+// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
+jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
+
+// Hook for boolean attributes
+boolHook = {
+ get: function( elem, name ) {
+ // Align boolean attributes with corresponding properties
+ // Fall back to attribute presence where some booleans are not supported
+ var attrNode,
+ property = jQuery.prop( elem, name );
+ return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+ name.toLowerCase() :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ var propName;
+ if ( value === false ) {
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr( elem, name );
+ } else {
+ // value is true since we know at this point it's type boolean and not false
+ // Set boolean attributes to the same name and set the DOM property
+ propName = jQuery.propFix[ name ] || name;
+ if ( propName in elem ) {
+ // Only set the IDL specifically if it already exists on the element
+ elem[ propName ] = true;
+ }
+
+ elem.setAttribute( name, name.toLowerCase() );
+ }
+ return name;
+ }
+};
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+ fixSpecified = {
+ name: true,
+ id: true
+ };
+
+ // Use this for any attribute in IE6/7
+ // This fixes almost every IE6/7 issue
+ nodeHook = jQuery.valHooks.button = {
+ get: function( elem, name ) {
+ var ret;
+ ret = elem.getAttributeNode( name );
+ return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
+ ret.nodeValue :
+ undefined;
+ },
+ set: function( elem, value, name ) {
+ // Set the existing or create a new attribute node
+ var ret = elem.getAttributeNode( name );
+ if ( !ret ) {
+ ret = document.createAttribute( name );
+ elem.setAttributeNode( ret );
+ }
+ return ( ret.nodeValue = value + "" );
+ }
+ };
+
+ // Apply the nodeHook to tabindex
+ jQuery.attrHooks.tabindex.set = nodeHook.set;
+
+ // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+ // This is for removals
+ jQuery.each([ "width", "height" ], function( i, name ) {
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ set: function( elem, value ) {
+ if ( value === "" ) {
+ elem.setAttribute( name, "auto" );
+ return value;
+ }
+ }
+ });
+ });
+
+ // Set contenteditable to false on removals(#10429)
+ // Setting to empty string throws an error as an invalid value
+ jQuery.attrHooks.contenteditable = {
+ get: nodeHook.get,
+ set: function( elem, value, name ) {
+ if ( value === "" ) {
+ value = "false";
+ }
+ nodeHook.set( elem, value, name );
+ }
+ };
+}
+
+
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+ jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+ jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+ get: function( elem ) {
+ var ret = elem.getAttribute( name, 2 );
+ return ret === null ? undefined : ret;
+ }
+ });
+ });
+}
+
+if ( !jQuery.support.style ) {
+ jQuery.attrHooks.style = {
+ get: function( elem ) {
+ // Return undefined in the case of empty string
+ // Normalize to lowercase since IE uppercases css property names
+ return elem.style.cssText.toLowerCase() || undefined;
+ },
+ set: function( elem, value ) {
+ return ( elem.style.cssText = "" + value );
+ }
+ };
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+ jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+ get: function( elem ) {
+ var parent = elem.parentNode;
+
+ if ( parent ) {
+ parent.selectedIndex;
+
+ // Make sure that it also works with optgroups, see #5701
+ if ( parent.parentNode ) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ return null;
+ }
+ });
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+ jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+ jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = {
+ get: function( elem ) {
+ // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ }
+ };
+ });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+ jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+ set: function( elem, value ) {
+ if ( jQuery.isArray( value ) ) {
+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+ }
+ }
+ });
+});
+
+
+
+
+var rnamespaces = /\.(.*)$/,
+ rformElems = /^(?:textarea|input|select)$/i,
+ rperiod = /\./g,
+ rspaces = / /g,
+ rescape = /[^\w\s.|`]/g,
+ rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
+ rhoverHack = /\bhover(\.\S+)?/,
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|contextmenu)|click/,
+ rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
+ quickParse = function( selector ) {
+ var quick = rquickIs.exec( selector );
+ if ( quick ) {
+ // 0 1 2 3
+ // [ _, tag, id, class ]
+ quick[1] = ( quick[1] || "" ).toLowerCase();
+ quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
+ }
+ return quick;
+ },
+ quickIs = function( elem, m ) {
+ return (
+ (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
+ (!m[2] || elem.id === m[2]) &&
+ (!m[3] || m[3].test( elem.className ))
+ );
+ },
+ hoverHack = function( events ) {
+ return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+ };
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+ add: function( elem, types, handler, data, selector ) {
+
+ var elemData, eventHandle, events,
+ t, tns, type, namespaces, handleObj,
+ handleObjIn, quick, handlers, special;
+
+ // Don't attach events to noData or text/comment nodes (allow plain objects tho)
+ if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if ( handler.handler ) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if ( !handler.guid ) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ events = elemData.events;
+ if ( !events ) {
+ elemData.events = events = {};
+ }
+ eventHandle = elemData.handle;
+ if ( !eventHandle ) {
+ elemData.handle = eventHandle = function( e ) {
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+ jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+ undefined;
+ };
+ // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+ eventHandle.elem = elem;
+ }
+
+ // Handle multiple events separated by a space
+ // jQuery(...).bind("mouseover mouseout", fn);
+ types = hoverHack(types).split( " " );
+ for ( t = 0; t < types.length; t++ ) {
+
+ tns = rtypenamespace.exec( types[t] ) || [];
+ type = tns[1];
+ namespaces = ( tns[2] || "" ).split( "." ).sort();
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[ type ] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = ( selector ? special.delegateType : special.bindType ) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[ type ] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: tns[1],
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ namespace: namespaces.join(".")
+ }, handleObjIn );
+
+ // Delegated event; pre-analyze selector so it's processed quickly on event dispatch
+ if ( selector ) {
+ handleObj.quick = quickParse( selector );
+ if ( !handleObj.quick && jQuery.expr.match.POS.test( selector ) ) {
+ handleObj.isPositional = true;
+ }
+ }
+
+ // Init the event handler queue if we're the first
+ handlers = events[ type ];
+ if ( !handlers ) {
+ handlers = events[ type ] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener/attachEvent if the special events handler returns false
+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+ // Bind the global event handler to the element
+ if ( elem.addEventListener ) {
+ elem.addEventListener( type, eventHandle, false );
+
+ } else if ( elem.attachEvent ) {
+ elem.attachEvent( "on" + type, eventHandle );
+ }
+ }
+ }
+
+ if ( special.add ) {
+ special.add.call( elem, handleObj );
+
+ if ( !handleObj.handler.guid ) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if ( selector ) {
+ handlers.splice( handlers.delegateCount++, 0, handleObj );
+ } else {
+ handlers.push( handleObj );
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[ type ] = true;
+ }
+
+ // Nullify elem to prevent memory leaks in IE
+ elem = null;
+ },
+
+ global: {},
+
+ // Detach an event or set of events from an element
+ remove: function( elem, types, handler, selector ) {
+
+ var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
+ t, tns, type, namespaces, origCount,
+ j, events, special, handle, eventType, handleObj;
+
+ if ( !elemData || !(events = elemData.events) ) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = hoverHack( types || "" ).split(" ");
+ for ( t = 0; t < types.length; t++ ) {
+ tns = rtypenamespace.exec( types[t] ) || [];
+ type = tns[1];
+ namespaces = tns[2];
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if ( !type ) {
+ namespaces = namespaces? "." + namespaces : "";
+ for ( j in events ) {
+ jQuery.event.remove( elem, j + namespaces, handler, selector );
+ }
+ return;
+ }
+
+ special = jQuery.event.special[ type ] || {};
+ type = ( selector? special.delegateType : special.bindType ) || type;
+ eventType = events[ type ] || [];
+ origCount = eventType.length;
+ namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+
+ // Only need to loop for special events or selective removal
+ if ( handler || namespaces || selector || special.remove ) {
+ for ( j = 0; j < eventType.length; j++ ) {
+ handleObj = eventType[ j ];
+
+ if ( !handler || handler.guid === handleObj.guid ) {
+ if ( !namespaces || namespaces.test( handleObj.namespace ) ) {
+ if ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) {
+ eventType.splice( j--, 1 );
+
+ if ( handleObj.selector ) {
+ eventType.delegateCount--;
+ }
+ if ( special.remove ) {
+ special.remove.call( elem, handleObj );
+ }
+ }
+ }
+ }
+ }
+ } else {
+ // Removing all events
+ eventType.length = 0;
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if ( eventType.length === 0 && origCount !== eventType.length ) {
+ if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
+ jQuery.removeEvent( elem, type, elemData.handle );
+ }
+
+ delete events[ type ];
+ }
+ }
+
+ // Remove the expando if it's no longer used
+ if ( jQuery.isEmptyObject( events ) ) {
+ handle = elemData.handle;
+ if ( handle ) {
+ handle.elem = null;
+ }
+
+ // removeData also checks for emptiness and clears the expando if empty
+ // so use it instead of delete
+ jQuery.removeData( elem, [ "events", "handle" ], true );
+ }
+ },
+
+ // Events that are safe to short-circuit if no handlers are attached.
+ // Native DOM events should not be added, they may have inline handlers.
+ customEvent: {
+ "getData": true,
+ "setData": true,
+ "changeData": true
+ },
+
+ trigger: function( event, data, elem, onlyHandlers ) {
+ // Don't do events on text and comment nodes
+ if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+ return;
+ }
+
+ // Event object or event type
+ var type = event.type || event,
+ namespaces = [],
+ cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
+
+ if ( type.indexOf( "!" ) >= 0 ) {
+ // Exclusive events trigger only for the exact event (no namespaces)
+ type = type.slice(0, -1);
+ exclusive = true;
+ }
+
+ if ( type.indexOf( "." ) >= 0 ) {
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+
+ if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+ // No jQuery handlers for this event type, and it can't have inline handlers
+ return;
+ }
+
+ // Caller can pass in an Event, Object, or just an event type string
+ event = typeof event === "object" ?
+ // jQuery.Event object
+ event[ jQuery.expando ] ? event :
+ // Object literal
+ new jQuery.Event( type, event ) :
+ // Just the event type (string)
+ new jQuery.Event( type );
+
+ event.type = type;
+ event.isTrigger = true;
+ event.exclusive = exclusive;
+ event.namespace = namespaces.join( "." );
+ event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
+ ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+ // triggerHandler() and global events don't bubble or run the default action
+ if ( onlyHandlers || !elem ) {
+ event.preventDefault();
+ }
+
+ // Handle a global trigger
+ if ( !elem ) {
+
+ // TODO: Stop taunting the data cache; remove global events and always attach to document
+ cache = jQuery.cache;
+ for ( i in cache ) {
+ if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+ jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+ }
+ }
+ return;
+ }
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if ( !event.target ) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data != null ? jQuery.makeArray( data ) : [];
+ data.unshift( event );
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[ type ] || {};
+ if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ eventPath = [[ elem, special.bindType || type ]];
+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+ bubbleType = special.delegateType || type;
+ old = null;
+ for ( cur = elem.parentNode; cur; cur = cur.parentNode ) {
+ eventPath.push([ cur, bubbleType ]);
+ old = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if ( old && old === elem.ownerDocument ) {
+ eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
+ }
+ }
+
+ // Fire handlers on the event path
+ for ( i = 0; i < eventPath.length; i++ ) {
+
+ cur = eventPath[i][0];
+ event.type = eventPath[i][1];
+
+ handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+ if ( handle ) {
+ handle.apply( cur, data );
+ }
+ handle = ontype && cur[ ontype ];
+ if ( handle && jQuery.acceptData( cur ) ) {
+ handle.apply( cur, data );
+ }
+
+ if ( event.isPropagationStopped() ) {
+ break;
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if ( !event.isDefaultPrevented() ) {
+
+ if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+ !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+ // Call a native DOM method on the target with the same name name as the event.
+ // Can't use an .isFunction() check here because IE6/7 fails that test.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ // IE<9 dies on focus/blur to hidden element (#1486)
+ if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ old = elem[ ontype ];
+
+ if ( old ) {
+ elem[ ontype ] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+ elem[ type ]();
+ jQuery.event.triggered = undefined;
+
+ if ( old ) {
+ elem[ ontype ] = old;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ dispatch: function( event ) {
+
+ // Make a writable jQuery.Event from the native event object
+ event = jQuery.event.fix( event || window.event );
+
+ var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+ delegateCount = handlers.delegateCount,
+ args = [].slice.call( arguments, 0 ),
+ run_all = !event.exclusive && !event.namespace,
+ specialHandle = ( jQuery.event.special[ event.type ] || {} ).handle,
+ handlerQueue = [],
+ i, j, cur, ret, selMatch, matched, matches, handleObj, sel, hit, related;
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+ event.delegateTarget = this;
+
+ // Determine handlers that should run if there are delegated events
+ // Avoid disabled elements in IE (#6911) and non-left-click bubbling in Firefox (#3861)
+ if ( delegateCount && !event.target.disabled && !(event.button && event.type === "click") ) {
+
+ for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+ selMatch = {};
+ matches = [];
+ for ( i = 0; i < delegateCount; i++ ) {
+ handleObj = handlers[ i ];
+ sel = handleObj.selector;
+ hit = selMatch[ sel ];
+
+ if ( handleObj.isPositional ) {
+ // Since .is() does not work for positionals; see http://jsfiddle.net/eJ4yd/3/
+ hit = ( hit || (selMatch[ sel ] = jQuery( sel )) ).index( cur ) >= 0;
+ } else if ( hit === undefined ) {
+ hit = selMatch[ sel ] = ( handleObj.quick ? quickIs( cur, handleObj.quick ) : jQuery( cur ).is( sel ) );
+ }
+ if ( hit ) {
+ matches.push( handleObj );
+ }
+ }
+ if ( matches.length ) {
+ handlerQueue.push({ elem: cur, matches: matches });
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ if ( handlers.length > delegateCount ) {
+ handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
+ }
+
+ // Run delegates first; they may want to stop propagation beneath us
+ for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+ matched = handlerQueue[ i ];
+ event.currentTarget = matched.elem;
+
+ for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+ handleObj = matched.matches[ j ];
+
+ // Triggered event must either 1) be non-exclusive and have no namespace, or
+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+ if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
+
+ event.data = handleObj.data;
+ event.handleObj = handleObj;
+
+ ret = ( specialHandle || handleObj.handler ).apply( matched.elem, args );
+
+ if ( ret !== undefined ) {
+ event.result = ret;
+ if ( ret === false ) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ // Includes some event props shared by KeyEvent and MouseEvent
+ // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+ props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+ fixHooks: {},
+
+ keyHooks: {
+ props: "char charCode key keyCode".split(" "),
+ filter: function( event, original ) {
+
+ // Add which for key events
+ if ( event.which == null ) {
+ event.which = original.charCode != null ? original.charCode : original.keyCode;
+ }
+
+ return event;
+ }
+ },
+
+ mouseHooks: {
+ props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement wheelDelta".split(" "),
+ filter: function( event, original ) {
+ var eventDoc, doc, body,
+ button = original.button,
+ fromElement = original.fromElement;
+
+ // Calculate pageX/Y if missing and clientX/Y available
+ if ( event.pageX == null && original.clientX != null ) {
+ eventDoc = event.target.ownerDocument || document;
+ doc = eventDoc.documentElement;
+ body = eventDoc.body;
+
+ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );
+ }
+
+ // Add relatedTarget, if necessary
+ if ( !event.relatedTarget && fromElement ) {
+ event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ // Note: button is not normalized, so don't use it
+ if ( !event.which && button !== undefined ) {
+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+ }
+
+ return event;
+ }
+ },
+
+ fix: function( event ) {
+ if ( event[ jQuery.expando ] ) {
+ return event;
+ }
+
+ // Create a writable copy of the event object and normalize some properties
+ var i, prop,
+ originalEvent = event,
+ fixHook = jQuery.event.fixHooks[ event.type ] || {},
+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+ event = jQuery.Event( originalEvent );
+
+ for ( i = copy.length; i; ) {
+ prop = copy[ --i ];
+ event[ prop ] = originalEvent[ prop ];
+ }
+
+ // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+ if ( !event.target ) {
+ event.target = originalEvent.srcElement || document;
+ }
+
+ // Target should not be a text node (#504, Safari)
+ if ( event.target.nodeType === 3 ) {
+ event.target = event.target.parentNode;
+ }
+
+ // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
+ if ( event.metaKey === undefined ) {
+ event.metaKey = event.ctrlKey;
+ }
+
+ return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+ },
+
+ special: {
+ ready: {
+ // Make sure the ready event is setup
+ setup: jQuery.bindReady
+ },
+
+ focus: {
+ delegateType: "focusin",
+ noBubble: true
+ },
+ blur: {
+ delegateType: "focusout",
+ noBubble: true
+ },
+
+ beforeunload: {
+ setup: function( data, namespaces, eventHandle ) {
+ // We only want to do this special case on windows
+ if ( jQuery.isWindow( this ) ) {
+ this.onbeforeunload = eventHandle;
+ }
+ },
+
+ teardown: function( namespaces, eventHandle ) {
+ if ( this.onbeforeunload === eventHandle ) {
+ this.onbeforeunload = null;
+ }
+ }
+ }
+ },
+
+ simulate: function( type, elem, event, bubble ) {
+ // Piggyback on a donor event to simulate a different one.
+ // Fake originalEvent to avoid donor's stopPropagation, but if the
+ // simulated event prevents default then we do the same on the donor.
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ { type: type,
+ isSimulated: true,
+ originalEvent: {}
+ }
+ );
+ if ( bubble ) {
+ jQuery.event.trigger( e, null, elem );
+ } else {
+ jQuery.event.dispatch.call( elem, e );
+ }
+ if ( e.isDefaultPrevented() ) {
+ event.preventDefault();
+ }
+ }
+};
+
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
+
+jQuery.removeEvent = document.removeEventListener ?
+ function( elem, type, handle ) {
+ if ( elem.removeEventListener ) {
+ elem.removeEventListener( type, handle, false );
+ }
+ } :
+ function( elem, type, handle ) {
+ if ( elem.detachEvent ) {
+ elem.detachEvent( "on" + type, handle );
+ }
+ };
+
+jQuery.Event = function( src, props ) {
+ // Allow instantiation without the 'new' keyword
+ if ( !(this instanceof jQuery.Event) ) {
+ return new jQuery.Event( src, props );
+ }
+
+ // Event object
+ if ( src && src.type ) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+ src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if ( props ) {
+ jQuery.extend( this, props );
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || jQuery.now();
+
+ // Mark it as fixed
+ this[ jQuery.expando ] = true;
+};
+
+function returnFalse() {
+ return false;
+}
+function returnTrue() {
+ return true;
+}
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+ preventDefault: function() {
+ this.isDefaultPrevented = returnTrue;
+
+ var e = this.originalEvent;
+ if ( !e ) {
+ return;
+ }
+
+ // if preventDefault exists run it on the original event
+ if ( e.preventDefault ) {
+ e.preventDefault();
+
+ // otherwise set the returnValue property of the original event to false (IE)
+ } else {
+ e.returnValue = false;
+ }
+ },
+ stopPropagation: function() {
+ this.isPropagationStopped = returnTrue;
+
+ var e = this.originalEvent;
+ if ( !e ) {
+ return;
+ }
+ // if stopPropagation exists run it on the original event
+ if ( e.stopPropagation ) {
+ e.stopPropagation();
+ }
+ // otherwise set the cancelBubble property of the original event to true (IE)
+ e.cancelBubble = true;
+ },
+ stopImmediatePropagation: function() {
+ this.isImmediatePropagationStopped = returnTrue;
+ this.stopPropagation();
+ },
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout"
+}, function( orig, fix ) {
+ jQuery.event.special[ orig ] = jQuery.event.special[ fix ] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function( event ) {
+ var target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj,
+ selector = handleObj.selector,
+ oldType, ret;
+
+ // For a real mouseover/out, always call the handler; for
+ // mousenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if ( !related || handleObj.origType === event.type || (related !== target && !jQuery.contains( target, related )) ) {
+ oldType = event.type;
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply( this, arguments );
+ event.type = oldType;
+ }
+ return ret;
+ }
+ };
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+ jQuery.event.special.submit = {
+ setup: function() {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
+ return false;
+ }
+
+ // Lazy-add a submit handler when a descendant form may potentially be submitted
+ jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+ // Node name check avoids a VML-related crash in IE (#9807)
+ var elem = e.target,
+ form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+ if ( form && !form._submit_attached ) {
+ jQuery.event.add( form, "submit._submit", function( event ) {
+ // Form was submitted, bubble the event up the tree
+ if ( this.parentNode ) {
+ jQuery.event.simulate( "submit", this.parentNode, event, true );
+ }
+ });
+ form._submit_attached = true;
+ }
+ });
+ // return undefined since we don't need an event listener
+ },
+
+ teardown: function() {
+ // Only need this for delegated form submit events
+ if ( jQuery.nodeName( this, "form" ) ) {
+ return false;
+ }
+
+ // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+ jQuery.event.remove( this, "._submit" );
+ }
+ };
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+ jQuery.event.special.change = {
+
+ setup: function() {
+
+ if ( rformElems.test( this.nodeName ) ) {
+ // IE doesn't fire change on a check/radio until blur; trigger it on click
+ // after a propertychange. Eat the blur-change in special.change.handle.
+ // This still fires onchange a second time for check/radio after blur.
+ if ( this.type === "checkbox" || this.type === "radio" ) {
+ jQuery.event.add( this, "propertychange._change", function( event ) {
+ if ( event.originalEvent.propertyName === "checked" ) {
+ this._just_changed = true;
+ }
+ });
+ jQuery.event.add( this, "click._change", function( event ) {
+ if ( this._just_changed ) {
+ this._just_changed = false;
+ jQuery.event.simulate( "change", this, event, true );
+ }
+ });
+ }
+ return false;
+ }
+ // Delegated event; lazy-add a change handler on descendant inputs
+ jQuery.event.add( this, "beforeactivate._change", function( e ) {
+ var elem = e.target;
+
+ if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
+ jQuery.event.add( elem, "change._change", function( event ) {
+ if ( this.parentNode && !event.isSimulated ) {
+ jQuery.event.simulate( "change", this.parentNode, event, true );
+ }
+ });
+ elem._change_attached = true;
+ }
+ });
+ },
+
+ handle: function( event ) {
+ var elem = event.target;
+
+ // Swallow native change events from checkbox/radio, we already triggered them above
+ if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+ return event.handleObj.handler.apply( this, arguments );
+ }
+ },
+
+ teardown: function() {
+ jQuery.event.remove( this, "._change" );
+
+ return rformElems.test( this.nodeName );
+ }
+ };
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+ // Attach a single capturing handler while someone wants focusin/focusout
+ var attaches = 0,
+ handler = function( event ) {
+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+ };
+
+ jQuery.event.special[ fix ] = {
+ setup: function() {
+ if ( attaches++ === 0 ) {
+ document.addEventListener( orig, handler, true );
+ }
+ },
+ teardown: function() {
+ if ( --attaches === 0 ) {
+ document.removeEventListener( orig, handler, true );
+ }
+ }
+ };
+ });
+}
+
+jQuery.fn.extend({
+
+ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if ( typeof types === "object" ) {
+ // ( types-Object, selector, data )
+ if ( typeof selector !== "string" ) {
+ // ( types-Object, data )
+ data = selector;
+ selector = undefined;
+ }
+ for ( type in types ) {
+ this.on( type, selector, data, types[ type ], one );
+ }
+ return this;
+ }
+
+ if ( data == null && fn == null ) {
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if ( fn == null ) {
+ if ( typeof selector === "string" ) {
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ } else if ( !fn ) {
+ return this;
+ }
+
+ if ( one === 1 ) {
+ origFn = fn;
+ fn = function( event ) {
+ // Can use an empty set, since event contains the info
+ jQuery().off( event );
+ return origFn.apply( this, arguments );
+ };
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+ }
+ return this.each( function() {
+ jQuery.event.add( this, types, fn, data, selector );
+ });
+ },
+ one: function( types, selector, data, fn ) {
+ return this.on.call( this, types, selector, data, fn, 1 );
+ },
+ off: function( types, selector, fn ) {
+ if ( types && types.preventDefault && types.handleObj ) {
+ // ( event ) dispatched jQuery.Event
+ var handleObj = types.handleObj;
+ jQuery( types.delegateTarget ).off(
+ handleObj.namespace? handleObj.type + "." + handleObj.namespace : handleObj.type,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if ( typeof types === "object" ) {
+ // ( types-object [, selector] )
+ for ( var type in types ) {
+ this.off( type, selector, types[ type ] );
+ }
+ return this;
+ }
+ if ( selector === false || typeof selector === "function" ) {
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if ( fn === false ) {
+ fn = returnFalse;
+ }
+ return this.each(function() {
+ jQuery.event.remove( this, types, fn, selector );
+ });
+ },
+
+ bind: function( types, data, fn ) {
+ return this.on( types, null, data, fn );
+ },
+ unbind: function( types, fn ) {
+ return this.off( types, null, fn );
+ },
+
+ live: function( types, data, fn ) {
+ jQuery( this.context ).on( types, this.selector, data, fn );
+ return this;
+ },
+ die: function( types, fn ) {
+ jQuery( this.context ).off( types, this.selector || "**", fn );
+ return this;
+ },
+
+ delegate: function( selector, types, data, fn ) {
+ return this.on( types, selector, data, fn );
+ },
+ undelegate: function( selector, types, fn ) {
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
+ },
+
+ trigger: function( type, data ) {
+ return this.each(function() {
+ jQuery.event.trigger( type, data, this );
+ });
+ },
+ triggerHandler: function( type, data ) {
+ if ( this[0] ) {
+ return jQuery.event.trigger( type, data, this[0], true );
+ }
+ },
+
+ toggle: function( fn ) {
+ // Save reference to arguments for access in closure
+ var args = arguments,
+ guid = fn.guid || jQuery.guid++,
+ i = 0,
+ toggler = function( event ) {
+ // Figure out which function to execute
+ var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+ jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
+
+ // Make sure that clicks stop
+ event.preventDefault();
+
+ // and execute the function
+ return args[ lastToggle ].apply( this, arguments ) || false;
+ };
+
+ // link all the functions, so any of them can unbind this click handler
+ toggler.guid = guid;
+ while ( i < args.length ) {
+ args[ i++ ].guid = guid;
+ }
+
+ return this.click( toggler );
+ },
+
+ hover: function( fnOver, fnOut ) {
+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+ }
+});
+
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+ // Handle event binding
+ jQuery.fn[ name ] = function( data, fn ) {
+ if ( fn == null ) {
+ fn = data;
+ data = null;
+ }
+
+ return arguments.length > 0 ?
+ this.bind( name, data, fn ) :
+ this.trigger( name );
+ };
+
+ if ( jQuery.attrFn ) {
+ jQuery.attrFn[ name ] = true;
+ }
+
+ if ( rkeyEvent.test( name ) ) {
+ jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
+ }
+
+ if ( rmouseEvent.test( name ) ) {
+ jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+ }
+});
+
+
+
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2011, The Dojo Foundation
+ * Released under the MIT, BSD, and GPL Licenses.
+ * More information: http://sizzlejs.com/
+ */
+(function(){
+
+var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
+ expando = "sizcache" + (Math.random() + '').replace('.', ''),
+ done = 0,
+ toString = Object.prototype.toString,
+ hasDuplicate = false,
+ baseHasDuplicate = true,
+ rBackslash = /\\/g,
+ rReturn = /\r\n/g,
+ rNonWord = /\W/;
+
+// Here we check if the JavaScript engine is using some sort of
+// optimization where it does not always call our comparision
+// function. If that is the case, discard the hasDuplicate value.
+// Thus far that includes Google Chrome.
+[0, 0].sort(function() {
+ baseHasDuplicate = false;
+ return 0;
+});
+
+var Sizzle = function( selector, context, results, seed ) {
+ results = results || [];
+ context = context || document;
+
+ var origContext = context;
+
+ if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
+ return [];
+ }
+
+ if ( !selector || typeof selector !== "string" ) {
+ return results;
+ }
+
+ var m, set, checkSet, extra, ret, cur, pop, i,
+ prune = true,
+ contextXML = Sizzle.isXML( context ),
+ parts = [],
+ soFar = selector;
+
+ // Reset the position of the chunker regexp (start from head)
+ do {
+ chunker.exec( "" );
+ m = chunker.exec( soFar );
+
+ if ( m ) {
+ soFar = m[3];
+
+ parts.push( m[1] );
+
+ if ( m[2] ) {
+ extra = m[3];
+ break;
+ }
+ }
+ } while ( m );
+
+ if ( parts.length > 1 && origPOS.exec( selector ) ) {
+
+ if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
+ set = posProcess( parts[0] + parts[1], context, seed );
+
+ } else {
+ set = Expr.relative[ parts[0] ] ?
+ [ context ] :
+ Sizzle( parts.shift(), context );
+
+ while ( parts.length ) {
+ selector = parts.shift();
+
+ if ( Expr.relative[ selector ] ) {
+ selector += parts.shift();
+ }
+
+ set = posProcess( selector, set, seed );
+ }
+ }
+
+ } else {
+ // Take a shortcut and set the context if the root selector is an ID
+ // (but not if it'll be faster if the inner selector is an ID)
+ if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
+ Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
+
+ ret = Sizzle.find( parts.shift(), context, contextXML );
+ context = ret.expr ?
+ Sizzle.filter( ret.expr, ret.set )[0] :
+ ret.set[0];
+ }
+
+ if ( context ) {
+ ret = seed ?
+ { expr: parts.pop(), set: makeArray(seed) } :
+ Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
+
+ set = ret.expr ?
+ Sizzle.filter( ret.expr, ret.set ) :
+ ret.set;
+
+ if ( parts.length > 0 ) {
+ checkSet = makeArray( set );
+
+ } else {
+ prune = false;
+ }
+
+ while ( parts.length ) {
+ cur = parts.pop();
+ pop = cur;
+
+ if ( !Expr.relative[ cur ] ) {
+ cur = "";
+ } else {
+ pop = parts.pop();
+ }
+
+ if ( pop == null ) {
+ pop = context;
+ }
+
+ Expr.relative[ cur ]( checkSet, pop, contextXML );
+ }
+
+ } else {
+ checkSet = parts = [];
+ }
+ }
+
+ if ( !checkSet ) {
+ checkSet = set;
+ }
+
+ if ( !checkSet ) {
+ Sizzle.error( cur || selector );
+ }
+
+ if ( toString.call(checkSet) === "[object Array]" ) {
+ if ( !prune ) {
+ results.push.apply( results, checkSet );
+
+ } else if ( context && context.nodeType === 1 ) {
+ for ( i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
+ results.push( set[i] );
+ }
+ }
+
+ } else {
+ for ( i = 0; checkSet[i] != null; i++ ) {
+ if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
+ results.push( set[i] );
+ }
+ }
+ }
+
+ } else {
+ makeArray( checkSet, results );
+ }
+
+ if ( extra ) {
+ Sizzle( extra, origContext, results, seed );
+ Sizzle.uniqueSort( results );
+ }
+
+ return results;
+};
+
+Sizzle.uniqueSort = function( results ) {
+ if ( sortOrder ) {
+ hasDuplicate = baseHasDuplicate;
+ results.sort( sortOrder );
+
+ if ( hasDuplicate ) {
+ for ( var i = 1; i < results.length; i++ ) {
+ if ( results[i] === results[ i - 1 ] ) {
+ results.splice( i--, 1 );
+ }
+ }
+ }
+ }
+
+ return results;
+};
+
+Sizzle.matches = function( expr, set ) {
+ return Sizzle( expr, null, null, set );
+};
+
+Sizzle.matchesSelector = function( node, expr ) {
+ return Sizzle( expr, null, null, [node] ).length > 0;
+};
+
+Sizzle.find = function( expr, context, isXML ) {
+ var set, i, len, match, type, left;
+
+ if ( !expr ) {
+ return [];
+ }
+
+ for ( i = 0, len = Expr.order.length; i < len; i++ ) {
+ type = Expr.order[i];
+
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
+ left = match[1];
+ match.splice( 1, 1 );
+
+ if ( left.substr( left.length - 1 ) !== "\\" ) {
+ match[1] = (match[1] || "").replace( rBackslash, "" );
+ set = Expr.find[ type ]( match, context, isXML );
+
+ if ( set != null ) {
+ expr = expr.replace( Expr.match[ type ], "" );
+ break;
+ }
+ }
+ }
+ }
+
+ if ( !set ) {
+ set = typeof context.getElementsByTagName !== "undefined" ?
+ context.getElementsByTagName( "*" ) :
+ [];
+ }
+
+ return { set: set, expr: expr };
+};
+
+Sizzle.filter = function( expr, set, inplace, not ) {
+ var match, anyFound,
+ type, found, item, filter, left,
+ i, pass,
+ old = expr,
+ result = [],
+ curLoop = set,
+ isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
+
+ while ( expr && set.length ) {
+ for ( type in Expr.filter ) {
+ if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
+ filter = Expr.filter[ type ];
+ left = match[1];
+
+ anyFound = false;
+
+ match.splice(1,1);
+
+ if ( left.substr( left.length - 1 ) === "\\" ) {
+ continue;
+ }
+
+ if ( curLoop === result ) {
+ result = [];
+ }
+
+ if ( Expr.preFilter[ type ] ) {
+ match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
+
+ if ( !match ) {
+ anyFound = found = true;
+
+ } else if ( match === true ) {
+ continue;
+ }
+ }
+
+ if ( match ) {
+ for ( i = 0; (item = curLoop[i]) != null; i++ ) {
+ if ( item ) {
+ found = filter( item, match, i, curLoop );
+ pass = not ^ found;
+
+ if ( inplace && found != null ) {
+ if ( pass ) {
+ anyFound = true;
+
+ } else {
+ curLoop[i] = false;
+ }
+
+ } else if ( pass ) {
+ result.push( item );
+ anyFound = true;
+ }
+ }
+ }
+ }
+
+ if ( found !== undefined ) {
+ if ( !inplace ) {
+ curLoop = result;
+ }
+
+ expr = expr.replace( Expr.match[ type ], "" );
+
+ if ( !anyFound ) {
+ return [];
+ }
+
+ break;
+ }
+ }
+ }
+
+ // Improper expression
+ if ( expr === old ) {
+ if ( anyFound == null ) {
+ Sizzle.error( expr );
+
+ } else {
+ break;
+ }
+ }
+
+ old = expr;
+ }
+
+ return curLoop;
+};
+
+Sizzle.error = function( msg ) {
+ throw "Syntax error, unrecognized expression: " + msg;
+};
+
+/**
+ * Utility function for retreiving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+var getText = Sizzle.getText = function( elem ) {
+ var i, node,
+ nodeType = elem.nodeType,
+ ret = "";
+
+ if ( nodeType ) {
+ if ( nodeType === 1 ) {
+ // Use textContent || innerText for elements
+ if ( typeof elem.textContent === 'string' ) {
+ return elem.textContent;
+ } else if ( typeof elem.innerText === 'string' ) {
+ // Replace IE's carriage returns
+ return elem.innerText.replace( rReturn, '' );
+ } else {
+ // Traverse it's children
+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
+ ret += getText( elem );
+ }
+ }
+ } else if ( nodeType === 3 || nodeType === 4 ) {
+ return elem.nodeValue;
+ }
+ } else {
+
+ // If no nodeType, this is expected to be an array
+ for ( i = 0; (node = elem[i]); i++ ) {
+ // Do not traverse comment nodes
+ if ( node.nodeType !== 8 ) {
+ ret += getText( node );
+ }
+ }
+ }
+ return ret;
+};
+
+var Expr = Sizzle.selectors = {
+ order: [ "ID", "NAME", "TAG" ],
+
+ match: {
+ ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+ CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
+ NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
+ ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
+ TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
+ CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
+ POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
+ PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
+ },
+
+ leftMatch: {},
+
+ attrMap: {
+ "class": "className",
+ "for": "htmlFor"
+ },
+
+ attrHandle: {
+ href: function( elem ) {
+ return elem.getAttribute( "href" );
+ },
+ type: function( elem ) {
+ return elem.getAttribute( "type" );
+ }
+ },
+
+ relative: {
+ "+": function(checkSet, part){
+ var isPartStr = typeof part === "string",
+ isTag = isPartStr && !rNonWord.test( part ),
+ isPartStrNotTag = isPartStr && !isTag;
+
+ if ( isTag ) {
+ part = part.toLowerCase();
+ }
+
+ for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
+ if ( (elem = checkSet[i]) ) {
+ while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
+
+ checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
+ elem || false :
+ elem === part;
+ }
+ }
+
+ if ( isPartStrNotTag ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ },
+
+ ">": function( checkSet, part ) {
+ var elem,
+ isPartStr = typeof part === "string",
+ i = 0,
+ l = checkSet.length;
+
+ if ( isPartStr && !rNonWord.test( part ) ) {
+ part = part.toLowerCase();
+
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
+
+ if ( elem ) {
+ var parent = elem.parentNode;
+ checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
+ }
+ }
+
+ } else {
+ for ( ; i < l; i++ ) {
+ elem = checkSet[i];
+
+ if ( elem ) {
+ checkSet[i] = isPartStr ?
+ elem.parentNode :
+ elem.parentNode === part;
+ }
+ }
+
+ if ( isPartStr ) {
+ Sizzle.filter( part, checkSet, true );
+ }
+ }
+ },
+
+ "": function(checkSet, part, isXML){
+ var nodeCheck,
+ doneName = done++,
+ checkFn = dirCheck;
+
+ if ( typeof part === "string" && !rNonWord.test( part ) ) {
+ part = part.toLowerCase();
+ nodeCheck = part;
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
+ },
+
+ "~": function( checkSet, part, isXML ) {
+ var nodeCheck,
+ doneName = done++,
+ checkFn = dirCheck;
+
+ if ( typeof part === "string" && !rNonWord.test( part ) ) {
+ part = part.toLowerCase();
+ nodeCheck = part;
+ checkFn = dirNodeCheck;
+ }
+
+ checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
+ }
+ },
+
+ find: {
+ ID: function( match, context, isXML ) {
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ return m && m.parentNode ? [m] : [];
+ }
+ },
+
+ NAME: function( match, context ) {
+ if ( typeof context.getElementsByName !== "undefined" ) {
+ var ret = [],
+ results = context.getElementsByName( match[1] );
+
+ for ( var i = 0, l = results.length; i < l; i++ ) {
+ if ( results[i].getAttribute("name") === match[1] ) {
+ ret.push( results[i] );
+ }
+ }
+
+ return ret.length === 0 ? null : ret;
+ }
+ },
+
+ TAG: function( match, context ) {
+ if ( typeof context.getElementsByTagName !== "undefined" ) {
+ return context.getElementsByTagName( match[1] );
+ }
+ }
+ },
+ preFilter: {
+ CLASS: function( match, curLoop, inplace, result, not, isXML ) {
+ match = " " + match[1].replace( rBackslash, "" ) + " ";
+
+ if ( isXML ) {
+ return match;
+ }
+
+ for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
+ if ( elem ) {
+ if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
+ if ( !inplace ) {
+ result.push( elem );
+ }
+
+ } else if ( inplace ) {
+ curLoop[i] = false;
+ }
+ }
+ }
+
+ return false;
+ },
+
+ ID: function( match ) {
+ return match[1].replace( rBackslash, "" );
+ },
+
+ TAG: function( match, curLoop ) {
+ return match[1].replace( rBackslash, "" ).toLowerCase();
+ },
+
+ CHILD: function( match ) {
+ if ( match[1] === "nth" ) {
+ if ( !match[2] ) {
+ Sizzle.error( match[0] );
+ }
+
+ match[2] = match[2].replace(/^\+|\s*/g, '');
+
+ // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
+ var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
+ match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
+ !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
+
+ // calculate the numbers (first)n+(last) including if they are negative
+ match[2] = (test[1] + (test[2] || 1)) - 0;
+ match[3] = test[3] - 0;
+ }
+ else if ( match[2] ) {
+ Sizzle.error( match[0] );
+ }
+
+ // TODO: Move to normal caching system
+ match[0] = done++;
+
+ return match;
+ },
+
+ ATTR: function( match, curLoop, inplace, result, not, isXML ) {
+ var name = match[1] = match[1].replace( rBackslash, "" );
+
+ if ( !isXML && Expr.attrMap[name] ) {
+ match[1] = Expr.attrMap[name];
+ }
+
+ // Handle if an un-quoted value was used
+ match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+
+ if ( match[2] === "~=" ) {
+ match[4] = " " + match[4] + " ";
+ }
+
+ return match;
+ },
+
+ PSEUDO: function( match, curLoop, inplace, result, not ) {
+ if ( match[1] === "not" ) {
+ // If we're dealing with a complex expression, or a simple one
+ if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
+ match[3] = Sizzle(match[3], null, null, curLoop);
+
+ } else {
+ var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+
+ if ( !inplace ) {
+ result.push.apply( result, ret );
+ }
+
+ return false;
+ }
+
+ } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
+ return true;
+ }
+
+ return match;
+ },
+
+ POS: function( match ) {
+ match.unshift( true );
+
+ return match;
+ }
+ },
+
+ filters: {
+ enabled: function( elem ) {
+ return elem.disabled === false && elem.type !== "hidden";
+ },
+
+ disabled: function( elem ) {
+ return elem.disabled === true;
+ },
+
+ checked: function( elem ) {
+ return elem.checked === true;
+ },
+
+ selected: function( elem ) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if ( elem.parentNode ) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ parent: function( elem ) {
+ return !!elem.firstChild;
+ },
+
+ empty: function( elem ) {
+ return !elem.firstChild;
+ },
+
+ has: function( elem, i, match ) {
+ return !!Sizzle( match[3], elem ).length;
+ },
+
+ header: function( elem ) {
+ return (/h\d/i).test( elem.nodeName );
+ },
+
+ text: function( elem ) {
+ var attr = elem.getAttribute( "type" ), type = elem.type;
+ // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+ // use getAttribute instead to test this case
+ return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
+ },
+
+ radio: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
+ },
+
+ checkbox: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
+ },
+
+ file: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
+ },
+
+ password: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
+ },
+
+ submit: function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && "submit" === elem.type;
+ },
+
+ image: function( elem ) {
+ return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
+ },
+
+ reset: function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && "reset" === elem.type;
+ },
+
+ button: function( elem ) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && "button" === elem.type || name === "button";
+ },
+
+ input: function( elem ) {
+ return (/input|select|textarea|button/i).test( elem.nodeName );
+ },
+
+ focus: function( elem ) {
+ return elem === elem.ownerDocument.activeElement;
+ }
+ },
+ setFilters: {
+ first: function( elem, i ) {
+ return i === 0;
+ },
+
+ last: function( elem, i, match, array ) {
+ return i === array.length - 1;
+ },
+
+ even: function( elem, i ) {
+ return i % 2 === 0;
+ },
+
+ odd: function( elem, i ) {
+ return i % 2 === 1;
+ },
+
+ lt: function( elem, i, match ) {
+ return i < match[3] - 0;
+ },
+
+ gt: function( elem, i, match ) {
+ return i > match[3] - 0;
+ },
+
+ nth: function( elem, i, match ) {
+ return match[3] - 0 === i;
+ },
+
+ eq: function( elem, i, match ) {
+ return match[3] - 0 === i;
+ }
+ },
+ filter: {
+ PSEUDO: function( elem, match, i, array ) {
+ var name = match[1],
+ filter = Expr.filters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+
+ } else if ( name === "contains" ) {
+ return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+
+ } else if ( name === "not" ) {
+ var not = match[3];
+
+ for ( var j = 0, l = not.length; j < l; j++ ) {
+ if ( not[j] === elem ) {
+ return false;
+ }
+ }
+
+ return true;
+
+ } else {
+ Sizzle.error( name );
+ }
+ },
+
+ CHILD: function( elem, match ) {
+ var first, last,
+ doneName, parent, cache,
+ count, diff,
+ type = match[1],
+ node = elem;
+
+ switch ( type ) {
+ case "only":
+ case "first":
+ while ( (node = node.previousSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+
+ if ( type === "first" ) {
+ return true;
+ }
+
+ node = elem;
+
+ case "last":
+ while ( (node = node.nextSibling) ) {
+ if ( node.nodeType === 1 ) {
+ return false;
+ }
+ }
+
+ return true;
+
+ case "nth":
+ first = match[2];
+ last = match[3];
+
+ if ( first === 1 && last === 0 ) {
+ return true;
+ }
+
+ doneName = match[0];
+ parent = elem.parentNode;
+
+ if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
+ count = 0;
+
+ for ( node = parent.firstChild; node; node = node.nextSibling ) {
+ if ( node.nodeType === 1 ) {
+ node.nodeIndex = ++count;
+ }
+ }
+
+ parent[ expando ] = doneName;
+ }
+
+ diff = elem.nodeIndex - last;
+
+ if ( first === 0 ) {
+ return diff === 0;
+
+ } else {
+ return ( diff % first === 0 && diff / first >= 0 );
+ }
+ }
+ },
+
+ ID: function( elem, match ) {
+ return elem.nodeType === 1 && elem.getAttribute("id") === match;
+ },
+
+ TAG: function( elem, match ) {
+ return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
+ },
+
+ CLASS: function( elem, match ) {
+ return (" " + (elem.className || elem.getAttribute("class")) + " ")
+ .indexOf( match ) > -1;
+ },
+
+ ATTR: function( elem, match ) {
+ var name = match[1],
+ result = Sizzle.attr ?
+ Sizzle.attr( elem, name ) :
+ Expr.attrHandle[ name ] ?
+ Expr.attrHandle[ name ]( elem ) :
+ elem[ name ] != null ?
+ elem[ name ] :
+ elem.getAttribute( name ),
+ value = result + "",
+ type = match[2],
+ check = match[4];
+
+ return result == null ?
+ type === "!=" :
+ !type && Sizzle.attr ?
+ result != null :
+ type === "=" ?
+ value === check :
+ type === "*=" ?
+ value.indexOf(check) >= 0 :
+ type === "~=" ?
+ (" " + value + " ").indexOf(check) >= 0 :
+ !check ?
+ value && result !== false :
+ type === "!=" ?
+ value !== check :
+ type === "^=" ?
+ value.indexOf(check) === 0 :
+ type === "$=" ?
+ value.substr(value.length - check.length) === check :
+ type === "|=" ?
+ value === check || value.substr(0, check.length + 1) === check + "-" :
+ false;
+ },
+
+ POS: function( elem, match, i, array ) {
+ var name = match[2],
+ filter = Expr.setFilters[ name ];
+
+ if ( filter ) {
+ return filter( elem, i, match, array );
+ }
+ }
+ }
+};
+
+var origPOS = Expr.match.POS,
+ fescape = function(all, num){
+ return "\\" + (num - 0 + 1);
+ };
+
+for ( var type in Expr.match ) {
+ Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
+ Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+}
+
+var makeArray = function( array, results ) {
+ array = Array.prototype.slice.call( array, 0 );
+
+ if ( results ) {
+ results.push.apply( results, array );
+ return results;
+ }
+
+ return array;
+};
+
+// Perform a simple check to determine if the browser is capable of
+// converting a NodeList to an array using builtin methods.
+// Also verifies that the returned array holds DOM nodes
+// (which is not the case in the Blackberry browser)
+try {
+ Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+
+// Provide a fallback method if it does not work
+} catch( e ) {
+ makeArray = function( array, results ) {
+ var i = 0,
+ ret = results || [];
+
+ if ( toString.call(array) === "[object Array]" ) {
+ Array.prototype.push.apply( ret, array );
+
+ } else {
+ if ( typeof array.length === "number" ) {
+ for ( var l = array.length; i < l; i++ ) {
+ ret.push( array[i] );
+ }
+
+ } else {
+ for ( ; array[i]; i++ ) {
+ ret.push( array[i] );
+ }
+ }
+ }
+
+ return ret;
+ };
+}
+
+var sortOrder, siblingCheck;
+
+if ( document.documentElement.compareDocumentPosition ) {
+ sortOrder = function( a, b ) {
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
+ return a.compareDocumentPosition ? -1 : 1;
+ }
+
+ return a.compareDocumentPosition(b) & 4 ? -1 : 1;
+ };
+
+} else {
+ sortOrder = function( a, b ) {
+ // The nodes are identical, we can exit early
+ if ( a === b ) {
+ hasDuplicate = true;
+ return 0;
+
+ // Fallback to using sourceIndex (in IE) if it's available on both nodes
+ } else if ( a.sourceIndex && b.sourceIndex ) {
+ return a.sourceIndex - b.sourceIndex;
+ }
+
+ var al, bl,
+ ap = [],
+ bp = [],
+ aup = a.parentNode,
+ bup = b.parentNode,
+ cur = aup;
+
+ // If the nodes are siblings (or identical) we can do a quick check
+ if ( aup === bup ) {
+ return siblingCheck( a, b );
+
+ // If no parents were found then the nodes are disconnected
+ } else if ( !aup ) {
+ return -1;
+
+ } else if ( !bup ) {
+ return 1;
+ }
+
+ // Otherwise they're somewhere else in the tree so we need
+ // to build up a full list of the parentNodes for comparison
+ while ( cur ) {
+ ap.unshift( cur );
+ cur = cur.parentNode;
+ }
+
+ cur = bup;
+
+ while ( cur ) {
+ bp.unshift( cur );
+ cur = cur.parentNode;
+ }
+
+ al = ap.length;
+ bl = bp.length;
+
+ // Start walking down the tree looking for a discrepancy
+ for ( var i = 0; i < al && i < bl; i++ ) {
+ if ( ap[i] !== bp[i] ) {
+ return siblingCheck( ap[i], bp[i] );
+ }
+ }
+
+ // We ended someplace up the tree so do a sibling check
+ return i === al ?
+ siblingCheck( a, bp[i], -1 ) :
+ siblingCheck( ap[i], b, 1 );
+ };
+
+ siblingCheck = function( a, b, ret ) {
+ if ( a === b ) {
+ return ret;
+ }
+
+ var cur = a.nextSibling;
+
+ while ( cur ) {
+ if ( cur === b ) {
+ return -1;
+ }
+
+ cur = cur.nextSibling;
+ }
+
+ return 1;
+ };
+}
+
+// Check to see if the browser returns elements by name when
+// querying by getElementById (and provide a workaround)
+(function(){
+ // We're going to inject a fake input element with a specified name
+ var form = document.createElement("div"),
+ id = "script" + (new Date()).getTime(),
+ root = document.documentElement;
+
+ form.innerHTML = "<a name='" + id + "'/>";
+
+ // Inject it into the root element, check its status, and remove it quickly
+ root.insertBefore( form, root.firstChild );
+
+ // The workaround has to do additional checks after a getElementById
+ // Which slows things down for other browsers (hence the branching)
+ if ( document.getElementById( id ) ) {
+ Expr.find.ID = function( match, context, isXML ) {
+ if ( typeof context.getElementById !== "undefined" && !isXML ) {
+ var m = context.getElementById(match[1]);
+
+ return m ?
+ m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
+ [m] :
+ undefined :
+ [];
+ }
+ };
+
+ Expr.filter.ID = function( elem, match ) {
+ var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+
+ return elem.nodeType === 1 && node && node.nodeValue === match;
+ };
+ }
+
+ root.removeChild( form );
+
+ // release memory in IE
+ root = form = null;
+})();
+
+(function(){
+ // Check to see if the browser returns only elements
+ // when doing getElementsByTagName("*")
+
+ // Create a fake element
+ var div = document.createElement("div");
+ div.appendChild( document.createComment("") );
+
+ // Make sure no comments are found
+ if ( div.getElementsByTagName("*").length > 0 ) {
+ Expr.find.TAG = function( match, context ) {
+ var results = context.getElementsByTagName( match[1] );
+
+ // Filter out possible comments
+ if ( match[1] === "*" ) {
+ var tmp = [];
+
+ for ( var i = 0; results[i]; i++ ) {
+ if ( results[i].nodeType === 1 ) {
+ tmp.push( results[i] );
+ }
+ }
+
+ results = tmp;
+ }
+
+ return results;
+ };
+ }
+
+ // Check to see if an attribute returns normalized href attributes
+ div.innerHTML = "<a href='#'></a>";
+
+ if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
+ div.firstChild.getAttribute("href") !== "#" ) {
+
+ Expr.attrHandle.href = function( elem ) {
+ return elem.getAttribute( "href", 2 );
+ };
+ }
+
+ // release memory in IE
+ div = null;
+})();
+
+if ( document.querySelectorAll ) {
+ (function(){
+ var oldSizzle = Sizzle,
+ div = document.createElement("div"),
+ id = "__sizzle__";
+
+ div.innerHTML = "<p class='TEST'></p>";
+
+ // Safari can't handle uppercase or unicode characters when
+ // in quirks mode.
+ if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
+ return;
+ }
+
+ Sizzle = function( query, context, extra, seed ) {
+ context = context || document;
+
+ // Only use querySelectorAll on non-XML documents
+ // (ID selectors don't work in non-HTML documents)
+ if ( !seed && !Sizzle.isXML(context) ) {
+ // See if we find a selector to speed up
+ var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+
+ if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
+ // Speed-up: Sizzle("TAG")
+ if ( match[1] ) {
+ return makeArray( context.getElementsByTagName( query ), extra );
+
+ // Speed-up: Sizzle(".CLASS")
+ } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
+ return makeArray( context.getElementsByClassName( match[2] ), extra );
+ }
+ }
+
+ if ( context.nodeType === 9 ) {
+ // Speed-up: Sizzle("body")
+ // The body element only exists once, optimize finding it
+ if ( query === "body" && context.body ) {
+ return makeArray( [ context.body ], extra );
+
+ // Speed-up: Sizzle("#ID")
+ } else if ( match && match[3] ) {
+ var elem = context.getElementById( match[3] );
+
+ // Check parentNode to catch when Blackberry 4.6 returns
+ // nodes that are no longer in the document #6963
+ if ( elem && elem.parentNode ) {
+ // Handle the case where IE and Opera return items
+ // by name instead of ID
+ if ( elem.id === match[3] ) {
+ return makeArray( [ elem ], extra );
+ }
+
+ } else {
+ return makeArray( [], extra );
+ }
+ }
+
+ try {
+ return makeArray( context.querySelectorAll(query), extra );
+ } catch(qsaError) {}
+
+ // qSA works strangely on Element-rooted queries
+ // We can work around this by specifying an extra ID on the root
+ // and working up from there (Thanks to Andrew Dupont for the technique)
+ // IE 8 doesn't work on object elements
+ } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+ var oldContext = context,
+ old = context.getAttribute( "id" ),
+ nid = old || id,
+ hasParent = context.parentNode,
+ relativeHierarchySelector = /^\s*[+~]/.test( query );
+
+ if ( !old ) {
+ context.setAttribute( "id", nid );
+ } else {
+ nid = nid.replace( /'/g, "\\$&" );
+ }
+ if ( relativeHierarchySelector && hasParent ) {
+ context = context.parentNode;
+ }
+
+ try {
+ if ( !relativeHierarchySelector || hasParent ) {
+ return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
+ }
+
+ } catch(pseudoError) {
+ } finally {
+ if ( !old ) {
+ oldContext.removeAttribute( "id" );
+ }
+ }
+ }
+ }
+
+ return oldSizzle(query, context, extra, seed);
+ };
+
+ for ( var prop in oldSizzle ) {
+ Sizzle[ prop ] = oldSizzle[ prop ];
+ }
+
+ // release memory in IE
+ div = null;
+ })();
+}
+
+(function(){
+ var html = document.documentElement,
+ matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+
+ if ( matches ) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9 fails this)
+ var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
+ pseudoWorks = false;
+
+ try {
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call( document.documentElement, "[test!='']:sizzle" );
+
+ } catch( pseudoError ) {
+ pseudoWorks = true;
+ }
+
+ Sizzle.matchesSelector = function( node, expr ) {
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+
+ if ( !Sizzle.isXML( node ) ) {
+ try {
+ if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
+ var ret = matches.call( node, expr );
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if ( ret || !disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9, so check for that
+ node.document && node.document.nodeType !== 11 ) {
+ return ret;
+ }
+ }
+ } catch(e) {}
+ }
+
+ return Sizzle(expr, null, null, [node]).length > 0;
+ };
+ }
+})();
+
+(function(){
+ var div = document.createElement("div");
+
+ div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+
+ // Opera can't find a second classname (in 9.6)
+ // Also, make sure that getElementsByClassName actually exists
+ if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
+ return;
+ }
+
+ // Safari caches class attributes, doesn't catch changes (in 3.2)
+ div.lastChild.className = "e";
+
+ if ( div.getElementsByClassName("e").length === 1 ) {
+ return;
+ }
+
+ Expr.order.splice(1, 0, "CLASS");
+ Expr.find.CLASS = function( match, context, isXML ) {
+ if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
+ return context.getElementsByClassName(match[1]);
+ }
+ };
+
+ // release memory in IE
+ div = null;
+})();
+
+function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+
+ if ( elem ) {
+ var match = false;
+
+ elem = elem[dir];
+
+ while ( elem ) {
+ if ( elem[ expando ] === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 && !isXML ){
+ elem[ expando ] = doneName;
+ elem.sizset = i;
+ }
+
+ if ( elem.nodeName.toLowerCase() === cur ) {
+ match = elem;
+ break;
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
+ for ( var i = 0, l = checkSet.length; i < l; i++ ) {
+ var elem = checkSet[i];
+
+ if ( elem ) {
+ var match = false;
+
+ elem = elem[dir];
+
+ while ( elem ) {
+ if ( elem[ expando ] === doneName ) {
+ match = checkSet[elem.sizset];
+ break;
+ }
+
+ if ( elem.nodeType === 1 ) {
+ if ( !isXML ) {
+ elem[ expando ] = doneName;
+ elem.sizset = i;
+ }
+
+ if ( typeof cur !== "string" ) {
+ if ( elem === cur ) {
+ match = true;
+ break;
+ }
+
+ } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
+ match = elem;
+ break;
+ }
+ }
+
+ elem = elem[dir];
+ }
+
+ checkSet[i] = match;
+ }
+ }
+}
+
+if ( document.documentElement.contains ) {
+ Sizzle.contains = function( a, b ) {
+ return a !== b && (a.contains ? a.contains(b) : true);
+ };
+
+} else if ( document.documentElement.compareDocumentPosition ) {
+ Sizzle.contains = function( a, b ) {
+ return !!(a.compareDocumentPosition(b) & 16);
+ };
+
+} else {
+ Sizzle.contains = function() {
+ return false;
+ };
+}
+
+Sizzle.isXML = function( elem ) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+var posProcess = function( selector, context, seed ) {
+ var match,
+ tmpSet = [],
+ later = "",
+ root = context.nodeType ? [context] : context;
+
+ // Position selectors must be done after the filter
+ // And so must :not(positional) so we move all PSEUDOs to the end
+ while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
+ later += match[0];
+ selector = selector.replace( Expr.match.PSEUDO, "" );
+ }
+
+ selector = Expr.relative[selector] ? selector + "*" : selector;
+
+ for ( var i = 0, l = root.length; i < l; i++ ) {
+ Sizzle( selector, root[i], tmpSet, seed );
+ }
+
+ return Sizzle.filter( later, tmpSet );
+};
+
+// EXPOSE
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+Sizzle.selectors.attrMap = {};
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.filters;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})();
+
+
+var runtil = /Until$/,
+ rparentsprev = /^(?:parents|prevUntil|prevAll)/,
+ // Note: This RegExp should be improved, or likely pulled from Sizzle
+ rmultiselector = /,/,
+ isSimple = /^.[^:#\[\.,]*$/,
+ slice = Array.prototype.slice,
+ POS = jQuery.expr.match.POS,
+ // methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+jQuery.fn.extend({
+ find: function( selector ) {
+ var self = this,
+ i, l;
+
+ if ( typeof selector !== "string" ) {
+ return jQuery( selector ).filter(function() {
+ for ( i = 0, l = self.length; i < l; i++ ) {
+ if ( jQuery.contains( self[ i ], this ) ) {
+ return true;
+ }
+ }
+ });
+ }
+
+ var ret = this.pushStack( "", "find", selector ),
+ length, n, r;
+
+ for ( i = 0, l = this.length; i < l; i++ ) {
+ length = ret.length;
+ jQuery.find( selector, this[i], ret );
+
+ if ( i > 0 ) {
+ // Make sure that the results are unique
+ for ( n = length; n < ret.length; n++ ) {
+ for ( r = 0; r < length; r++ ) {
+ if ( ret[r] === ret[n] ) {
+ ret.splice(n--, 1);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ return ret;
+ },
+
+ has: function( target ) {
+ var targets = jQuery( target );
+ return this.filter(function() {
+ for ( var i = 0, l = targets.length; i < l; i++ ) {
+ if ( jQuery.contains( this, targets[i] ) ) {
+ return true;
+ }
+ }
+ });
+ },
+
+ not: function( selector ) {
+ return this.pushStack( winnow(this, selector, false), "not", selector);
+ },
+
+ filter: function( selector ) {
+ return this.pushStack( winnow(this, selector, true), "filter", selector );
+ },
+
+ is: function( selector ) {
+ return !!selector && (
+ typeof selector === "string" ?
+ // If this is a positional selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ POS.test( selector ) ?
+ jQuery( selector, this.context ).index( this[0] ) >= 0 :
+ jQuery.filter( selector, this ).length > 0 :
+ this.filter( selector ).length > 0 );
+ },
+
+ closest: function( selectors, context ) {
+ var ret = [], i, l, cur = this[0];
+
+ // Array (deprecated as of jQuery 1.7)
+ if ( jQuery.isArray( selectors ) ) {
+ var level = 1;
+
+ while ( cur && cur.ownerDocument && cur !== context ) {
+ for ( i = 0; i < selectors.length; i++ ) {
+
+ if ( jQuery( cur ).is( selectors[ i ] ) ) {
+ ret.push({ selector: selectors[ i ], elem: cur, level: level });
+ }
+ }
+
+ cur = cur.parentNode;
+ level++;
+ }
+
+ return ret;
+ }
+
+ // String
+ var pos = POS.test( selectors ) || typeof selectors !== "string" ?
+ jQuery( selectors, context || this.context ) :
+ 0;
+
+ for ( i = 0, l = this.length; i < l; i++ ) {
+ cur = this[i];
+
+ while ( cur ) {
+ if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+ ret.push( cur );
+ break;
+
+ } else {
+ cur = cur.parentNode;
+ if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
+ break;
+ }
+ }
+ }
+ }
+
+ ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+
+ return this.pushStack( ret, "closest", selectors );
+ },
+
+ // Determine the position of an element within
+ // the matched set of elements
+ index: function( elem ) {
+
+ // No argument, return index in parent
+ if ( !elem ) {
+ return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+ }
+
+ // index in selector
+ if ( typeof elem === "string" ) {
+ return jQuery.inArray( this[0], jQuery( elem ) );
+ }
+
+ // Locate the position of the desired element
+ return jQuery.inArray(
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[0] : elem, this );
+ },
+
+ add: function( selector, context ) {
+ var set = typeof selector === "string" ?
+ jQuery( selector, context ) :
+ jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+ all = jQuery.merge( this.get(), set );
+
+ return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+ all :
+ jQuery.unique( all ) );
+ },
+
+ andSelf: function() {
+ return this.add( this.prevObject );
+ }
+});
+
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+ return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+jQuery.each({
+ parent: function( elem ) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function( elem ) {
+ return jQuery.dir( elem, "parentNode" );
+ },
+ parentsUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "parentNode", until );
+ },
+ next: function( elem ) {
+ return jQuery.nth( elem, 2, "nextSibling" );
+ },
+ prev: function( elem ) {
+ return jQuery.nth( elem, 2, "previousSibling" );
+ },
+ nextAll: function( elem ) {
+ return jQuery.dir( elem, "nextSibling" );
+ },
+ prevAll: function( elem ) {
+ return jQuery.dir( elem, "previousSibling" );
+ },
+ nextUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "nextSibling", until );
+ },
+ prevUntil: function( elem, i, until ) {
+ return jQuery.dir( elem, "previousSibling", until );
+ },
+ siblings: function( elem ) {
+ return jQuery.sibling( elem.parentNode.firstChild, elem );
+ },
+ children: function( elem ) {
+ return jQuery.sibling( elem.firstChild );
+ },
+ contents: function( elem ) {
+ return jQuery.nodeName( elem, "iframe" ) ?
+ elem.contentDocument || elem.contentWindow.document :
+ jQuery.makeArray( elem.childNodes );
+ }
+}, function( name, fn ) {
+ jQuery.fn[ name ] = function( until, selector ) {
+ var ret = jQuery.map( this, fn, until ),
+ // The variable 'args' was introduced in
+ // https://github.com/jquery/jquery/commit/52a0238
+ // to work around a bug in Chrome 10 (Dev) and should be removed when the bug is fixed.
+ // http://code.google.com/p/v8/issues/detail?id=1050
+ args = slice.call(arguments);
+
+ if ( !runtil.test( name ) ) {
+ selector = until;
+ }
+
+ if ( selector && typeof selector === "string" ) {
+ ret = jQuery.filter( selector, ret );
+ }
+
+ ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+ if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
+ ret = ret.reverse();
+ }
+
+ return this.pushStack( ret, name, args.join(",") );
+ };
+});
+
+jQuery.extend({
+ filter: function( expr, elems, not ) {
+ if ( not ) {
+ expr = ":not(" + expr + ")";
+ }
+
+ return elems.length === 1 ?
+ jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+ jQuery.find.matches(expr, elems);
+ },
+
+ dir: function( elem, dir, until ) {
+ var matched = [],
+ cur = elem[ dir ];
+
+ while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+ if ( cur.nodeType === 1 ) {
+ matched.push( cur );
+ }
+ cur = cur[dir];
+ }
+ return matched;
+ },
+
+ nth: function( cur, result, dir, elem ) {
+ result = result || 1;
+ var num = 0;
+
+ for ( ; cur; cur = cur[dir] ) {
+ if ( cur.nodeType === 1 && ++num === result ) {
+ break;
+ }
+ }
+
+ return cur;
+ },
+
+ sibling: function( n, elem ) {
+ var r = [];
+
+ for ( ; n; n = n.nextSibling ) {
+ if ( n.nodeType === 1 && n !== elem ) {
+ r.push( n );
+ }
+ }
+
+ return r;
+ }
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+ // Can't pass null or undefined to indexOf in Firefox 4
+ // Set to 0 to skip string check
+ qualifier = qualifier || 0;
+
+ if ( jQuery.isFunction( qualifier ) ) {
+ return jQuery.grep(elements, function( elem, i ) {
+ var retVal = !!qualifier.call( elem, i, elem );
+ return retVal === keep;
+ });
+
+ } else if ( qualifier.nodeType ) {
+ return jQuery.grep(elements, function( elem, i ) {
+ return ( elem === qualifier ) === keep;
+ });
+
+ } else if ( typeof qualifier === "string" ) {
+ var filtered = jQuery.grep(elements, function( elem ) {
+ return elem.nodeType === 1;
+ });
+
+ if ( isSimple.test( qualifier ) ) {
+ return jQuery.filter(qualifier, filtered, !keep);
+ } else {
+ qualifier = jQuery.filter( qualifier, filtered );
+ }
+ }
+
+ return jQuery.grep(elements, function( elem, i ) {
+ return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+ });
+}
+
+
+
+
+function createSafeFragment( document ) {
+ var list = nodeNames.split( " " ),
+ safeFrag = document.createDocumentFragment();
+
+ if ( safeFrag.createElement ) {
+ while ( list.length ) {
+ safeFrag.createElement(
+ list.pop()
+ );
+ }
+ }
+ return safeFrag;
+}
+
+var nodeNames = "abbr article aside audio canvas datalist details figcaption figure footer " +
+ "header hgroup mark meter nav output progress section summary time video",
+ rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
+ rleadingWhitespace = /^\s+/,
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
+ rtagName = /<([\w:]+)/,
+ rtbody = /<tbody/i,
+ rhtml = /<|&#?\w+;/,
+ rnoInnerhtml = /<(?:script|style)/i,
+ rnocache = /<(?:script|object|embed|option|style)/i,
+ rnoshimcache = new RegExp("<(?:" + nodeNames.replace(" ", "|") + ")", "i"),
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rscriptType = /\/(java|ecma)script/i,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
+ wrapMap = {
+ option: [ 1, "<select multiple='multiple'>", "</select>" ],
+ legend: [ 1, "<fieldset>", "</fieldset>" ],
+ thead: [ 1, "<table>", "</table>" ],
+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+ col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+ area: [ 1, "<map>", "</map>" ],
+ _default: [ 0, "", "" ]
+ },
+ safeFragment = createSafeFragment( document );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE can't serialize <link> and <script> tags normally
+if ( !jQuery.support.htmlSerialize ) {
+ wrapMap._default = [ 1, "div<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+ text: function( text ) {
+ if ( jQuery.isFunction(text) ) {
+ return this.each(function(i) {
+ var self = jQuery( this );
+
+ self.text( text.call(this, i, self.text()) );
+ });
+ }
+
+ if ( typeof text !== "object" && text !== undefined ) {
+ return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) );
+ }
+
+ return jQuery.text( this );
+ },
+
+ wrapAll: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapAll( html.call(this, i) );
+ });
+ }
+
+ if ( this[0] ) {
+ // The elements to wrap the target around
+ var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+ if ( this[0].parentNode ) {
+ wrap.insertBefore( this[0] );
+ }
+
+ wrap.map(function() {
+ var elem = this;
+
+ while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+ elem = elem.firstChild;
+ }
+
+ return elem;
+ }).append( this );
+ }
+
+ return this;
+ },
+
+ wrapInner: function( html ) {
+ if ( jQuery.isFunction( html ) ) {
+ return this.each(function(i) {
+ jQuery(this).wrapInner( html.call(this, i) );
+ });
+ }
+
+ return this.each(function() {
+ var self = jQuery( this ),
+ contents = self.contents();
+
+ if ( contents.length ) {
+ contents.wrapAll( html );
+
+ } else {
+ self.append( html );
+ }
+ });
+ },
+
+ wrap: function( html ) {
+ return this.each(function() {
+ jQuery( this ).wrapAll( html );
+ });
+ },
+
+ unwrap: function() {
+ return this.parent().each(function() {
+ if ( !jQuery.nodeName( this, "body" ) ) {
+ jQuery( this ).replaceWith( this.childNodes );
+ }
+ }).end();
+ },
+
+ append: function() {
+ return this.domManip(arguments, true, function( elem ) {
+ if ( this.nodeType === 1 ) {
+ this.appendChild( elem );
+ }
+ });
+ },
+
+ prepend: function() {
+ return this.domManip(arguments, true, function( elem ) {
+ if ( this.nodeType === 1 ) {
+ this.insertBefore( elem, this.firstChild );
+ }
+ });
+ },
+
+ before: function() {
+ if ( this[0] && this[0].parentNode ) {
+ return this.domManip(arguments, false, function( elem ) {
+ this.parentNode.insertBefore( elem, this );
+ });
+ } else if ( arguments.length ) {
+ var set = jQuery(arguments[0]);
+ set.push.apply( set, this.toArray() );
+ return this.pushStack( set, "before", arguments );
+ }
+ },
+
+ after: function() {
+ if ( this[0] && this[0].parentNode ) {
+ return this.domManip(arguments, false, function( elem ) {
+ this.parentNode.insertBefore( elem, this.nextSibling );
+ });
+ } else if ( arguments.length ) {
+ var set = this.pushStack( this, "after", arguments );
+ set.push.apply( set, jQuery(arguments[0]).toArray() );
+ return set;
+ }
+ },
+
+ // keepData is for internal use only--do not document
+ remove: function( selector, keepData ) {
+ for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+ if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+ if ( !keepData && elem.nodeType === 1 ) {
+ jQuery.cleanData( elem.getElementsByTagName("*") );
+ jQuery.cleanData( [ elem ] );
+ }
+
+ if ( elem.parentNode ) {
+ elem.parentNode.removeChild( elem );
+ }
+ }
+ }
+
+ return this;
+ },
+
+ empty: function() {
+ for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ if ( elem.nodeType === 1 ) {
+ jQuery.cleanData( elem.getElementsByTagName("*") );
+ }
+
+ // Remove any remaining nodes
+ while ( elem.firstChild ) {
+ elem.removeChild( elem.firstChild );
+ }
+ }
+
+ return this;
+ },
+
+ clone: function( dataAndEvents, deepDataAndEvents ) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map( function () {
+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+ });
+ },
+
+ html: function( value ) {
+ if ( value === undefined ) {
+ return this[0] && this[0].nodeType === 1 ?
+ this[0].innerHTML.replace(rinlinejQuery, "") :
+ null;
+
+ // See if we can take a shortcut and just use innerHTML
+ } else if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+ (jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value )) &&
+ !wrapMap[ (rtagName.exec( value ) || ["", ""])[1].toLowerCase() ] ) {
+
+ value = value.replace(rxhtmlTag, "<$1></$2>");
+
+ try {
+ for ( var i = 0, l = this.length; i < l; i++ ) {
+ // Remove element nodes and prevent memory leaks
+ if ( this[i].nodeType === 1 ) {
+ jQuery.cleanData( this[i].getElementsByTagName("*") );
+ this[i].innerHTML = value;
+ }
+ }
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch(e) {
+ this.empty().append( value );
+ }
+
+ } else if ( jQuery.isFunction( value ) ) {
+ this.each(function(i){
+ var self = jQuery( this );
+
+ self.html( value.call(this, i, self.html()) );
+ });
+
+ } else {
+ this.empty().append( value );
+ }
+
+ return this;
+ },
+
+ replaceWith: function( value ) {
+ if ( this[0] && this[0].parentNode ) {
+ // Make sure that the elements are removed from the DOM before they are inserted
+ // this can help fix replacing a parent with child elements
+ if ( jQuery.isFunction( value ) ) {
+ return this.each(function(i) {
+ var self = jQuery(this), old = self.html();
+ self.replaceWith( value.call( this, i, old ) );
+ });
+ }
+
+ if ( typeof value !== "string" ) {
+ value = jQuery( value ).detach();
+ }
+
+ return this.each(function() {
+ var next = this.nextSibling,
+ parent = this.parentNode;
+
+ jQuery( this ).remove();
+
+ if ( next ) {
+ jQuery(next).before( value );
+ } else {
+ jQuery(parent).append( value );
+ }
+ });
+ } else {
+ return this.length ?
+ this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+ this;
+ }
+ },
+
+ detach: function( selector ) {
+ return this.remove( selector, true );
+ },
+
+ domManip: function( args, table, callback ) {
+ var results, first, fragment, parent,
+ value = args[0],
+ scripts = [];
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
+ return this.each(function() {
+ jQuery(this).domManip( args, table, callback, true );
+ });
+ }
+
+ if ( jQuery.isFunction(value) ) {
+ return this.each(function(i) {
+ var self = jQuery(this);
+ args[0] = value.call(this, i, table ? self.html() : undefined);
+ self.domManip( args, table, callback );
+ });
+ }
+
+ if ( this[0] ) {
+ parent = value && value.parentNode;
+
+ // If we're in a fragment, just use that instead of building a new one
+ if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
+ results = { fragment: parent };
+
+ } else {
+ results = jQuery.buildFragment( args, this, scripts );
+ }
+
+ fragment = results.fragment;
+
+ if ( fragment.childNodes.length === 1 ) {
+ first = fragment = fragment.firstChild;
+ } else {
+ first = fragment.firstChild;
+ }
+
+ if ( first ) {
+ table = table && jQuery.nodeName( first, "tr" );
+
+ for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
+ callback.call(
+ table ?
+ root(this[i], first) :
+ this[i],
+ // Make sure that we do not leak memory by inadvertently discarding
+ // the original fragment (which might have attached data) instead of
+ // using it; in addition, use the original fragment object for the last
+ // item instead of first because it can end up being emptied incorrectly
+ // in certain situations (Bug #8070).
+ // Fragments from the fragment cache must always be cloned and never used
+ // in place.
+ results.cacheable || ( l > 1 && i < lastIndex ) ?
+ jQuery.clone( fragment, true, true ) :
+ fragment
+ );
+ }
+ }
+
+ if ( scripts.length ) {
+ jQuery.each( scripts, evalScript );
+ }
+ }
+
+ return this;
+ }
+});
+
+function root( elem, cur ) {
+ return jQuery.nodeName(elem, "table") ?
+ (elem.getElementsByTagName("tbody")[0] ||
+ elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
+ elem;
+}
+
+function cloneCopyEvent( src, dest ) {
+
+ if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+ return;
+ }
+
+ var type, i, l,
+ oldData = jQuery._data( src ),
+ curData = jQuery._data( dest, oldData ),
+ events = oldData.events;
+
+ if ( events ) {
+ delete curData.handle;
+ curData.events = {};
+
+ for ( type in events ) {
+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+ jQuery.event.add( dest, type + ( events[ type ][ i ].namespace ? "." : "" ) + events[ type ][ i ].namespace, events[ type ][ i ], events[ type ][ i ].data );
+ }
+ }
+ }
+
+ // make the cloned public data object a copy from the original
+ if ( curData.data ) {
+ curData.data = jQuery.extend( {}, curData.data );
+ }
+}
+
+function cloneFixAttributes( src, dest ) {
+ var nodeName;
+
+ // We do not need to do anything for non-Elements
+ if ( dest.nodeType !== 1 ) {
+ return;
+ }
+
+ // clearAttributes removes the attributes, which we don't want,
+ // but also removes the attachEvent events, which we *do* want
+ if ( dest.clearAttributes ) {
+ dest.clearAttributes();
+ }
+
+ // mergeAttributes, in contrast, only merges back on the
+ // original attributes, not the events
+ if ( dest.mergeAttributes ) {
+ dest.mergeAttributes( src );
+ }
+
+ nodeName = dest.nodeName.toLowerCase();
+
+ // IE6-8 fail to clone children inside object elements that use
+ // the proprietary classid attribute value (rather than the type
+ // attribute) to identify the type of content to display
+ if ( nodeName === "object" ) {
+ dest.outerHTML = src.outerHTML;
+
+ } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
+ // IE6-8 fails to persist the checked state of a cloned checkbox
+ // or radio button. Worse, IE6-7 fail to give the cloned element
+ // a checked appearance if the defaultChecked value isn't also set
+ if ( src.checked ) {
+ dest.defaultChecked = dest.checked = src.checked;
+ }
+
+ // IE6-7 get confused and end up setting the value of a cloned
+ // checkbox/radio button to an empty string instead of "on"
+ if ( dest.value !== src.value ) {
+ dest.value = src.value;
+ }
+
+ // IE6-8 fails to return the selected option to the default selected
+ // state when cloning options
+ } else if ( nodeName === "option" ) {
+ dest.selected = src.defaultSelected;
+
+ // IE6-8 fails to set the defaultValue to the correct value when
+ // cloning other types of input fields
+ } else if ( nodeName === "input" || nodeName === "textarea" ) {
+ dest.defaultValue = src.defaultValue;
+ }
+
+ // Event data gets referenced instead of copied if the expando
+ // gets copied too
+ dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, nodes, scripts ) {
+ var fragment, cacheable, cacheresults, doc,
+ first = args[ 0 ];
+
+ // nodes may contain either an explicit document object,
+ // a jQuery collection or context object.
+ // If nodes[0] contains a valid object to assign to doc
+ if ( nodes && nodes[0] ) {
+ doc = nodes[0].ownerDocument || nodes[0];
+ }
+
+ // Ensure that an attr object doesn't incorrectly stand in as a document object
+ // Chrome and Firefox seem to allow this to occur and will throw exception
+ // Fixes #8950
+ if ( !doc.createDocumentFragment ) {
+ doc = document;
+ }
+
+ // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+ // Cloning options loses the selected state, so don't cache them
+ // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+ // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+ // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+ if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
+ first.charAt(0) === "<" && !rnocache.test( first ) &&
+ (jQuery.support.checkClone || !rchecked.test( first )) &&
+ (!jQuery.support.unknownElems && rnoshimcache.test( first )) ) {
+
+ cacheable = true;
+
+ cacheresults = jQuery.fragments[ first ];
+ if ( cacheresults && cacheresults !== 1 ) {
+ fragment = cacheresults;
+ }
+ }
+
+ if ( !fragment ) {
+ fragment = doc.createDocumentFragment();
+ jQuery.clean( args, doc, fragment, scripts );
+ }
+
+ if ( cacheable ) {
+ jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+ }
+
+ return { fragment: fragment, cacheable: cacheable };
+};
+
+jQuery.fragments = {};
+
+jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+}, function( name, original ) {
+ jQuery.fn[ name ] = function( selector ) {
+ var ret = [],
+ insert = jQuery( selector ),
+ parent = this.length === 1 && this[0].parentNode;
+
+ if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
+ insert[ original ]( this[0] );
+ return this;
+
+ } else {
+ for ( var i = 0, l = insert.length; i < l; i++ ) {
+ var elems = ( i > 0 ? this.clone(true) : this ).get();
+ jQuery( insert[i] )[ original ]( elems );
+ ret = ret.concat( elems );
+ }
+
+ return this.pushStack( ret, name, insert.selector );
+ }
+ };
+});
+
+function getAll( elem ) {
+ if ( typeof elem.getElementsByTagName !== "undefined" ) {
+ return elem.getElementsByTagName( "*" );
+
+ } else if ( typeof elem.querySelectorAll !== "undefined" ) {
+ return elem.querySelectorAll( "*" );
+
+ } else {
+ return [];
+ }
+}
+
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+ if ( elem.type === "checkbox" || elem.type === "radio" ) {
+ elem.defaultChecked = elem.checked;
+ }
+}
+// Finds all inputs and passes them to fixDefaultChecked
+function findInputs( elem ) {
+ var nodeName = ( elem.nodeName || "" ).toLowerCase();
+ if ( nodeName === "input" ) {
+ fixDefaultChecked( elem );
+ // Skip scripts, get other children
+ } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
+ jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+ }
+}
+
+jQuery.extend({
+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+ var clone = elem.cloneNode(true),
+ srcElements,
+ destElements,
+ i;
+
+ if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+ (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+ // IE copies events bound via attachEvent when using cloneNode.
+ // Calling detachEvent on the clone will also remove the events
+ // from the original. In order to get around this, we use some
+ // proprietary methods to clear the events. Thanks to MooTools
+ // guys for this hotness.
+
+ cloneFixAttributes( elem, clone );
+
+ // Using Sizzle here is crazy slow, so we use getElementsByTagName
+ // instead
+ srcElements = getAll( elem );
+ destElements = getAll( clone );
+
+ // Weird iteration because IE will replace the length property
+ // with an element if you are cloning the body and one of the
+ // elements on the page has a name or id of "length"
+ for ( i = 0; srcElements[i]; ++i ) {
+ // Ensure that the destination node is not null; Fixes #9587
+ if ( destElements[i] ) {
+ cloneFixAttributes( srcElements[i], destElements[i] );
+ }
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if ( dataAndEvents ) {
+ cloneCopyEvent( elem, clone );
+
+ if ( deepDataAndEvents ) {
+ srcElements = getAll( elem );
+ destElements = getAll( clone );
+
+ for ( i = 0; srcElements[i]; ++i ) {
+ cloneCopyEvent( srcElements[i], destElements[i] );
+ }
+ }
+ }
+
+ srcElements = destElements = null;
+
+ // Return the cloned set
+ return clone;
+ },
+
+ clean: function( elems, context, fragment, scripts ) {
+ var checkScriptType;
+
+ context = context || document;
+
+ // !context.createElement fails in IE with an error but returns typeof 'object'
+ if ( typeof context.createElement === "undefined" ) {
+ context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+ }
+
+ var ret = [], j;
+
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ if ( typeof elem === "number" ) {
+ elem += "";
+ }
+
+ if ( !elem ) {
+ continue;
+ }
+
+ // Convert html string into DOM nodes
+ if ( typeof elem === "string" ) {
+ if ( !rhtml.test( elem ) ) {
+ elem = context.createTextNode( elem );
+ } else {
+ // Fix "XHTML"-style tags in all browsers
+ elem = elem.replace(rxhtmlTag, "<$1></$2>");
+
+ // Trim whitespace, otherwise indexOf won't work as expected
+ var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
+ wrap = wrapMap[ tag ] || wrapMap._default,
+ depth = wrap[0],
+ div = context.createElement("div");
+
+ // Append wrapper element to unknown element safe doc fragment
+ if ( context === document ) {
+ // Use the fragment we've already created for this document
+ safeFragment.appendChild( div );
+ } else {
+ // Use a fragment created with the owner document
+ createSafeFragment( context ).appendChild( div );
+ }
+
+ // Go to html and back, then peel off extra wrappers
+ div.innerHTML = wrap[1] + elem + wrap[2];
+
+ // Move to the right depth
+ while ( depth-- ) {
+ div = div.lastChild;
+ }
+
+ // Remove IE's autoinserted <tbody> from table fragments
+ if ( !jQuery.support.tbody ) {
+
+ // String was a <table>, *may* have spurious <tbody>
+ var hasBody = rtbody.test(elem),
+ tbody = tag === "table" && !hasBody ?
+ div.firstChild && div.firstChild.childNodes :
+
+ // String was a bare <thead> or <tfoot>
+ wrap[1] === "<table>" && !hasBody ?
+ div.childNodes :
+ [];
+
+ for ( j = tbody.length - 1; j >= 0 ; --j ) {
+ if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+ tbody[ j ].parentNode.removeChild( tbody[ j ] );
+ }
+ }
+ }
+
+ // IE completely kills leading whitespace when innerHTML is used
+ if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+ div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+ }
+
+ elem = div.childNodes;
+ }
+ }
+
+ // Resets defaultChecked for any radios and checkboxes
+ // about to be appended to the DOM in IE 6/7 (#8060)
+ var len;
+ if ( !jQuery.support.appendChecked ) {
+ if ( elem[0] && typeof (len = elem.length) === "number" ) {
+ for ( j = 0; j < len; j++ ) {
+ findInputs( elem[j] );
+ }
+ } else {
+ findInputs( elem );
+ }
+ }
+
+ if ( elem.nodeType ) {
+ ret.push( elem );
+ } else {
+ ret = jQuery.merge( ret, elem );
+ }
+ }
+
+ if ( fragment ) {
+ checkScriptType = function( elem ) {
+ return !elem.type || rscriptType.test( elem.type );
+ };
+ for ( i = 0; ret[i]; i++ ) {
+ if ( scripts && jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) {
+ scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] );
+
+ } else {
+ if ( ret[i].nodeType === 1 ) {
+ var jsTags = jQuery.grep( ret[i].getElementsByTagName( "script" ), checkScriptType );
+
+ ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+ }
+ fragment.appendChild( ret[i] );
+ }
+ }
+ }
+
+ return ret;
+ },
+
+ cleanData: function( elems ) {
+ var data, id,
+ cache = jQuery.cache,
+ special = jQuery.event.special,
+ deleteExpando = jQuery.support.deleteExpando;
+
+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+ if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
+ continue;
+ }
+
+ id = elem[ jQuery.expando ];
+
+ if ( id ) {
+ data = cache[ id ];
+
+ if ( data && data.events ) {
+ for ( var type in data.events ) {
+ if ( special[ type ] ) {
+ jQuery.event.remove( elem, type );
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent( elem, type, data.handle );
+ }
+ }
+
+ // Null the DOM reference to avoid IE6/7/8 leak (#7054)
+ if ( data.handle ) {
+ data.handle.elem = null;
+ }
+ }
+
+ if ( deleteExpando ) {
+ delete elem[ jQuery.expando ];
+
+ } else if ( elem.removeAttribute ) {
+ elem.removeAttribute( jQuery.expando );
+ }
+
+ delete cache[ id ];
+ }
+ }
+ }
+});
+
+function evalScript( i, elem ) {
+ if ( elem.src ) {
+ jQuery.ajax({
+ url: elem.src,
+ async: false,
+ dataType: "script"
+ });
+ } else {
+ jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+ }
+
+ if ( elem.parentNode ) {
+ elem.parentNode.removeChild( elem );
+ }
+}
+
+
+
+
+var ralpha = /alpha\([^)]*\)/i,
+ ropacity = /opacity=([^)]*)/,
+ // fixed for IE9, see #8346
+ rupper = /([A-Z]|^ms)/g,
+ rnumpx = /^-?\d+(?:px)?$/i,
+ rnum = /^-?\d/,
+ rrelNum = /^([\-+])=([\-+.\de]+)/,
+
+ cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+ cssWidth = [ "Left", "Right" ],
+ cssHeight = [ "Top", "Bottom" ],
+ curCSS,
+
+ getComputedStyle,
+ currentStyle;
+
+jQuery.fn.css = function( name, value ) {
+ // Setting 'undefined' is a no-op
+ if ( arguments.length === 2 && value === undefined ) {
+ return this;
+ }
+
+ return jQuery.access( this, name, value, true, function( elem, name, value ) {
+ return value !== undefined ?
+ jQuery.style( elem, name, value ) :
+ jQuery.css( elem, name );
+ });
+};
+
+jQuery.extend({
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function( elem, computed ) {
+ if ( computed ) {
+ // We should always get a number back from opacity
+ var ret = curCSS( elem, "opacity", "opacity" );
+ return ret === "" ? "1" : ret;
+
+ } else {
+ return elem.style.opacity;
+ }
+ }
+ }
+ },
+
+ // Exclude the following css properties to add px
+ cssNumber: {
+ "fillOpacity": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {
+ // normalize float css property
+ "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+ },
+
+ // Get and set the style property on a DOM Node
+ style: function( elem, name, value, extra ) {
+ // Don't set styles on text and comment nodes
+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, origName = jQuery.camelCase( name ),
+ style = elem.style, hooks = jQuery.cssHooks[ origName ];
+
+ name = jQuery.cssProps[ origName ] || origName;
+
+ // Check if we're setting a value
+ if ( value !== undefined ) {
+ type = typeof value;
+
+ // convert relative number strings (+= or -=) to relative numbers. #7345
+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+ value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that NaN and null values aren't set. See: #7116
+ if ( value == null || type === "number" && isNaN( value ) ) {
+ return;
+ }
+
+ // If a number was passed in, add 'px' to the (except for certain CSS properties)
+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+ value += "px";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
+ // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+ // Fixes bug #5509
+ try {
+ style[ name ] = value;
+ } catch(e) {}
+ }
+
+ } else {
+ // If a hook was provided get the non-computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[ name ];
+ }
+ },
+
+ css: function( elem, name, extra ) {
+ var ret, hooks;
+
+ // Make sure that we're working with the right name
+ name = jQuery.camelCase( name );
+ hooks = jQuery.cssHooks[ name ];
+ name = jQuery.cssProps[ name ] || name;
+
+ // cssFloat needs a special treatment
+ if ( name === "cssFloat" ) {
+ name = "float";
+ }
+
+ // If a hook was provided get the computed value from there
+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
+ return ret;
+
+ // Otherwise, if a way to get the computed value exists, use that
+ } else if ( curCSS ) {
+ return curCSS( elem, name );
+ }
+ },
+
+ // A method for quickly swapping in/out CSS properties to get correct calculations
+ swap: function( elem, options, callback ) {
+ var old = {};
+
+ // Remember the old values, and insert the new ones
+ for ( var name in options ) {
+ old[ name ] = elem.style[ name ];
+ elem.style[ name ] = options[ name ];
+ }
+
+ callback.call( elem );
+
+ // Revert the old values
+ for ( name in options ) {
+ elem.style[ name ] = old[ name ];
+ }
+ }
+});
+
+// DEPRECATED, Use jQuery.css() instead
+jQuery.curCSS = jQuery.css;
+
+jQuery.each(["height", "width"], function( i, name ) {
+ jQuery.cssHooks[ name ] = {
+ get: function( elem, computed, extra ) {
+ var val;
+
+ if ( computed ) {
+ if ( elem.offsetWidth !== 0 ) {
+ return getWH( elem, name, extra );
+ } else {
+ jQuery.swap( elem, cssShow, function() {
+ val = getWH( elem, name, extra );
+ });
+ }
+
+ return val;
+ }
+ },
+
+ set: function( elem, value ) {
+ if ( rnumpx.test( value ) ) {
+ // ignore negative width and height values #1599
+ value = parseFloat( value );
+
+ if ( value >= 0 ) {
+ return value + "px";
+ }
+
+ } else {
+ return value;
+ }
+ }
+ };
+});
+
+if ( !jQuery.support.opacity ) {
+ jQuery.cssHooks.opacity = {
+ get: function( elem, computed ) {
+ // IE uses filters for opacity
+ return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+ ( parseFloat( RegExp.$1 ) / 100 ) + "" :
+ computed ? "1" : "";
+ },
+
+ set: function( elem, value ) {
+ var style = elem.style,
+ currentStyle = elem.currentStyle,
+ opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+ filter = currentStyle && currentStyle.filter || style.filter || "";
+
+ // IE has trouble with opacity if it does not have layout
+ // Force it by setting the zoom level
+ style.zoom = 1;
+
+ // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+ if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+
+ // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+ // if "filter:" is present at all, clearType is disabled, we want to avoid this
+ // style.removeAttribute is IE Only, but so apparently is this code path...
+ style.removeAttribute( "filter" );
+
+ // if there there is no filter style applied in a css rule, we are done
+ if ( currentStyle && !currentStyle.filter ) {
+ return;
+ }
+ }
+
+ // otherwise, set new filter values
+ style.filter = ralpha.test( filter ) ?
+ filter.replace( ralpha, opacity ) :
+ filter + " " + opacity;
+ }
+ };
+}
+
+jQuery(function() {
+ // This hook cannot be added until DOM ready because the support test
+ // for it is not run until after DOM ready
+ if ( !jQuery.support.reliableMarginRight ) {
+ jQuery.cssHooks.marginRight = {
+ get: function( elem, computed ) {
+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+ // Work around by temporarily setting element display to inline-block
+ var ret;
+ jQuery.swap( elem, { "display": "inline-block" }, function() {
+ if ( computed ) {
+ ret = curCSS( elem, "margin-right", "marginRight" );
+ } else {
+ ret = elem.style.marginRight;
+ }
+ });
+ return ret;
+ }
+ };
+ }
+});
+
+if ( document.defaultView && document.defaultView.getComputedStyle ) {
+ getComputedStyle = function( elem, name ) {
+ var ret, defaultView, computedStyle;
+
+ name = name.replace( rupper, "-$1" ).toLowerCase();
+
+ if ( !(defaultView = elem.ownerDocument.defaultView) ) {
+ return undefined;
+ }
+
+ if ( (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+ ret = computedStyle.getPropertyValue( name );
+ if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
+ ret = jQuery.style( elem, name );
+ }
+ }
+
+ return ret;
+ };
+}
+
+if ( document.documentElement.currentStyle ) {
+ currentStyle = function( elem, name ) {
+ var left, rsLeft, uncomputed,
+ ret = elem.currentStyle && elem.currentStyle[ name ],
+ style = elem.style;
+
+ // Avoid setting ret to empty string here
+ // so we don't default to auto
+ if ( ret === null && style && (uncomputed = style[ name ]) ) {
+ ret = uncomputed;
+ }
+
+ // From the awesome hack by Dean Edwards
+ // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+ // If we're not dealing with a regular pixel number
+ // but a number that has a weird ending, we need to convert it to pixels
+ if ( !rnumpx.test( ret ) && rnum.test( ret ) ) {
+
+ // Remember the original values
+ left = style.left;
+ rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+
+ // Put in the new values to get a computed value out
+ if ( rsLeft ) {
+ elem.runtimeStyle.left = elem.currentStyle.left;
+ }
+ style.left = name === "fontSize" ? "1em" : ( ret || 0 );
+ ret = style.pixelLeft + "px";
+
+ // Revert the changed values
+ style.left = left;
+ if ( rsLeft ) {
+ elem.runtimeStyle.left = rsLeft;
+ }
+ }
+
+ return ret === "" ? "auto" : ret;
+ };
+}
+
+curCSS = getComputedStyle || currentStyle;
+
+function getWH( elem, name, extra ) {
+
+ // Start with offset property
+ var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+ which = name === "width" ? cssWidth : cssHeight;
+
+ if ( val > 0 ) {
+ if ( extra !== "border" ) {
+ jQuery.each( which, function() {
+ if ( !extra ) {
+ val -= parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+ }
+ if ( extra === "margin" ) {
+ val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+ } else {
+ val -= parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+ }
+ });
+ }
+
+ return val + "px";
+ }
+
+ // Fall back to computed then uncomputed css if necessary
+ val = curCSS( elem, name, name );
+ if ( val < 0 || val == null ) {
+ val = elem.style[ name ] || 0;
+ }
+ // Normalize "", auto, and prepare for extra
+ val = parseFloat( val ) || 0;
+
+ // Add padding, border, margin
+ if ( extra ) {
+ jQuery.each( which, function() {
+ val += parseFloat( jQuery.css( elem, "padding" + this ) ) || 0;
+ if ( extra !== "padding" ) {
+ val += parseFloat( jQuery.css( elem, "border" + this + "Width" ) ) || 0;
+ }
+ if ( extra === "margin" ) {
+ val += parseFloat( jQuery.css( elem, extra + this ) ) || 0;
+ }
+ });
+ }
+
+ return val + "px";
+}
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.hidden = function( elem ) {
+ var width = elem.offsetWidth,
+ height = elem.offsetHeight;
+
+ return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+ };
+
+ jQuery.expr.filters.visible = function( elem ) {
+ return !jQuery.expr.filters.hidden( elem );
+ };
+}
+
+
+
+
+var r20 = /%20/g,
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rhash = /#.*$/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+ rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+ rquery = /\?/,
+ rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+ rselectTextarea = /^(?:select|textarea)/i,
+ rspacesAjax = /\s+/,
+ rts = /([?&])_=[^&]*/,
+ rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+
+ // Keep a copy of the old load method
+ _load = jQuery.fn.load,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Document location
+ ajaxLocation,
+
+ // Document location segments
+ ajaxLocParts,
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = ["*/"] + ["*"];
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+ ajaxLocation = location.href;
+} catch( e ) {
+ // Use the href attribute of an A element
+ // since IE will modify it given document.location
+ ajaxLocation = document.createElement( "a" );
+ ajaxLocation.href = "";
+ ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function( dataTypeExpression, func ) {
+
+ if ( typeof dataTypeExpression !== "string" ) {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ if ( jQuery.isFunction( func ) ) {
+ var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
+ i = 0,
+ length = dataTypes.length,
+ dataType,
+ list,
+ placeBefore;
+
+ // For each dataType in the dataTypeExpression
+ for ( ; i < length; i++ ) {
+ dataType = dataTypes[ i ];
+ // We control if we're asked to add before
+ // any existing element
+ placeBefore = /^\+/.test( dataType );
+ if ( placeBefore ) {
+ dataType = dataType.substr( 1 ) || "*";
+ }
+ list = structure[ dataType ] = structure[ dataType ] || [];
+ // then we add to the structure accordingly
+ list[ placeBefore ? "unshift" : "push" ]( func );
+ }
+ }
+ };
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+ dataType /* internal */, inspected /* internal */ ) {
+
+ dataType = dataType || options.dataTypes[ 0 ];
+ inspected = inspected || {};
+
+ inspected[ dataType ] = true;
+
+ var list = structure[ dataType ],
+ i = 0,
+ length = list ? list.length : 0,
+ executeOnly = ( structure === prefilters ),
+ selection;
+
+ for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+ selection = list[ i ]( options, originalOptions, jqXHR );
+ // If we got redirected to another dataType
+ // we try there if executing only and not done already
+ if ( typeof selection === "string" ) {
+ if ( !executeOnly || inspected[ selection ] ) {
+ selection = undefined;
+ } else {
+ options.dataTypes.unshift( selection );
+ selection = inspectPrefiltersOrTransports(
+ structure, options, originalOptions, jqXHR, selection, inspected );
+ }
+ }
+ }
+ // If we're only executing or nothing was selected
+ // we try the catchall dataType if not done already
+ if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+ selection = inspectPrefiltersOrTransports(
+ structure, options, originalOptions, jqXHR, "*", inspected );
+ }
+ // unnecessary when only executing (prefilters)
+ // but it'll be ignored by the caller in that case
+ return selection;
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+ for ( key in src ) {
+ if ( src[ key ] !== undefined ) {
+ ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+ }
+ }
+ if ( deep ) {
+ jQuery.extend( true, target, deep );
+ }
+}
+
+jQuery.fn.extend({
+ load: function( url, params, callback ) {
+ if ( typeof url !== "string" && _load ) {
+ return _load.apply( this, arguments );
+
+ // Don't do a request if no elements are being requested
+ } else if ( !this.length ) {
+ return this;
+ }
+
+ var off = url.indexOf( " " );
+ if ( off >= 0 ) {
+ var selector = url.slice( off, url.length );
+ url = url.slice( 0, off );
+ }
+
+ // Default to a GET request
+ var type = "GET";
+
+ // If the second parameter was provided
+ if ( params ) {
+ // If it's a function
+ if ( jQuery.isFunction( params ) ) {
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if ( typeof params === "object" ) {
+ params = jQuery.param( params, jQuery.ajaxSettings.traditional );
+ type = "POST";
+ }
+ }
+
+ var self = this;
+
+ // Request the remote document
+ jQuery.ajax({
+ url: url,
+ type: type,
+ dataType: "html",
+ data: params,
+ // Complete callback (responseText is used internally)
+ complete: function( jqXHR, status, responseText ) {
+ // Store the response as specified by the jqXHR object
+ responseText = jqXHR.responseText;
+ // If successful, inject the HTML into all the matched elements
+ if ( jqXHR.isResolved() ) {
+ // #4825: Get the actual response in case
+ // a dataFilter is present in ajaxSettings
+ jqXHR.done(function( r ) {
+ responseText = r;
+ });
+ // See if a selector was specified
+ self.html( selector ?
+ // Create a dummy div to hold the results
+ jQuery("<div>")
+ // inject the contents of the document in, removing the scripts
+ // to avoid any 'Permission Denied' errors in IE
+ .append(responseText.replace(rscript, ""))
+
+ // Locate the specified elements
+ .find(selector) :
+
+ // If not, just inject the full result
+ responseText );
+ }
+
+ if ( callback ) {
+ self.each( callback, [ responseText, status, jqXHR ] );
+ }
+ }
+ });
+
+ return this;
+ },
+
+ serialize: function() {
+ return jQuery.param( this.serializeArray() );
+ },
+
+ serializeArray: function() {
+ return this.map(function(){
+ return this.elements ? jQuery.makeArray( this.elements ) : this;
+ })
+ .filter(function(){
+ return this.name && !this.disabled &&
+ ( this.checked || rselectTextarea.test( this.nodeName ) ||
+ rinput.test( this.type ) );
+ })
+ .map(function( i, elem ){
+ var val = jQuery( this ).val();
+
+ return val == null ?
+ null :
+ jQuery.isArray( val ) ?
+ jQuery.map( val, function( val, i ){
+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }) :
+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+ }).get();
+ }
+});
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+ jQuery.fn[ o ] = function( f ){
+ return this.bind( o, f );
+ };
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+ jQuery[ method ] = function( url, data, callback, type ) {
+ // shift arguments if data argument was omitted
+ if ( jQuery.isFunction( data ) ) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ return jQuery.ajax({
+ type: method,
+ url: url,
+ data: data,
+ success: callback,
+ dataType: type
+ });
+ };
+});
+
+jQuery.extend({
+
+ getScript: function( url, callback ) {
+ return jQuery.get( url, undefined, callback, "script" );
+ },
+
+ getJSON: function( url, data, callback ) {
+ return jQuery.get( url, data, callback, "json" );
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function( target, settings ) {
+ if ( settings ) {
+ // Building a settings object
+ ajaxExtend( target, jQuery.ajaxSettings );
+ } else {
+ // Extending ajaxSettings
+ settings = target;
+ target = jQuery.ajaxSettings;
+ }
+ ajaxExtend( target, settings );
+ return target;
+ },
+
+ ajaxSettings: {
+ url: ajaxLocation,
+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+ global: true,
+ type: "GET",
+ contentType: "application/x-www-form-urlencoded",
+ processData: true,
+ async: true,
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ xml: "application/xml, text/xml",
+ html: "text/html",
+ text: "text/plain",
+ json: "application/json, text/javascript",
+ "*": allTypes
+ },
+
+ contents: {
+ xml: /xml/,
+ html: /html/,
+ json: /json/
+ },
+
+ responseFields: {
+ xml: "responseXML",
+ text: "responseText"
+ },
+
+ // List of data converters
+ // 1) key format is "source_type destination_type" (a single space in-between)
+ // 2) the catchall symbol "*" can be used for source_type
+ converters: {
+
+ // Convert anything to text
+ "* text": window.String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": jQuery.parseJSON,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ context: true,
+ url: true
+ }
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+ ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+ // Main method
+ ajax: function( url, options ) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if ( typeof url === "object" ) {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var // Create the final options object
+ s = jQuery.ajaxSetup( {}, options ),
+ // Callbacks context
+ callbackContext = s.context || s,
+ // Context for global events
+ // It's the callbackContext if one was provided in the options
+ // and if it's a DOM node or a jQuery collection
+ globalEventContext = callbackContext !== s &&
+ ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+ jQuery( callbackContext ) : jQuery.event,
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks( "once memory" ),
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+ // ifModified key
+ ifModifiedKey,
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+ // transport
+ transport,
+ // timeout handle
+ timeoutTimer,
+ // Cross-domain detection vars
+ parts,
+ // The jqXHR state
+ state = 0,
+ // To know if global events are to be dispatched
+ fireGlobals,
+ // Loop variable
+ i,
+ // Fake xhr
+ jqXHR = {
+
+ readyState: 0,
+
+ // Caches the header
+ setRequestHeader: function( name, value ) {
+ if ( !state ) {
+ var lname = name.toLowerCase();
+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+ requestHeaders[ name ] = value;
+ }
+ return this;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function() {
+ return state === 2 ? responseHeadersString : null;
+ },
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function( key ) {
+ var match;
+ if ( state === 2 ) {
+ if ( !responseHeaders ) {
+ responseHeaders = {};
+ while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+ }
+ }
+ match = responseHeaders[ key.toLowerCase() ];
+ }
+ return match === undefined ? null : match;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function( type ) {
+ if ( !state ) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function( statusText ) {
+ statusText = statusText || "abort";
+ if ( transport ) {
+ transport.abort( statusText );
+ }
+ done( 0, statusText );
+ return this;
+ }
+ };
+
+ // Callback for when everything is done
+ // It is defined here because jslint complains if it is declared
+ // at the end of the function (which would be more logical and readable)
+ function done( status, nativeStatusText, responses, headers ) {
+
+ // Called once
+ if ( state === 2 ) {
+ return;
+ }
+
+ // State is "done" now
+ state = 2;
+
+ // Clear timeout if it exists
+ if ( timeoutTimer ) {
+ clearTimeout( timeoutTimer );
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ var isSuccess,
+ success,
+ error,
+ statusText = nativeStatusText,
+ response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
+ lastModified,
+ etag;
+
+ // If successful, handle type chaining
+ if ( status >= 200 && status < 300 || status === 304 ) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+
+ if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
+ jQuery.lastModified[ ifModifiedKey ] = lastModified;
+ }
+ if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
+ jQuery.etag[ ifModifiedKey ] = etag;
+ }
+ }
+
+ // If not modified
+ if ( status === 304 ) {
+
+ statusText = "notmodified";
+ isSuccess = true;
+
+ // If we have data
+ } else {
+
+ try {
+ success = ajaxConvert( s, response );
+ statusText = "success";
+ isSuccess = true;
+ } catch(e) {
+ // We have a parsererror
+ statusText = "parsererror";
+ error = e;
+ }
+ }
+ } else {
+ // We extract error from statusText
+ // then normalize statusText and status for non-aborts
+ error = statusText;
+ if ( !statusText || status ) {
+ statusText = "error";
+ if ( status < 0 ) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = "" + ( nativeStatusText || statusText );
+
+ // Success/Error
+ if ( isSuccess ) {
+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+ } else {
+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode( statusCode );
+ statusCode = undefined;
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+ [ jqXHR, s, isSuccess ? success : error ] );
+ }
+
+ // Complete
+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+ // Handle the global AJAX counter
+ if ( !( --jQuery.active ) ) {
+ jQuery.event.trigger( "ajaxStop" );
+ }
+ }
+ }
+
+ // Attach deferreds
+ deferred.promise( jqXHR );
+ jqXHR.success = jqXHR.done;
+ jqXHR.error = jqXHR.fail;
+ jqXHR.complete = completeDeferred.add;
+
+ // Status-dependent callbacks
+ jqXHR.statusCode = function( map ) {
+ if ( map ) {
+ var tmp;
+ if ( state < 2 ) {
+ for ( tmp in map ) {
+ statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
+ }
+ } else {
+ tmp = map[ jqXHR.status ];
+ jqXHR.then( tmp, tmp );
+ }
+ }
+ return this;
+ };
+
+ // Remove hash character (#7531: and string promotion)
+ // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+ // We also use the url parameter if available
+ s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+ // Extract dataTypes list
+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
+
+ // Determine if a cross-domain request is in order
+ if ( s.crossDomain == null ) {
+ parts = rurl.exec( s.url.toLowerCase() );
+ s.crossDomain = !!( parts &&
+ ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+ );
+ }
+
+ // Convert data if not already a string
+ if ( s.data && s.processData && typeof s.data !== "string" ) {
+ s.data = jQuery.param( s.data, s.traditional );
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+ // If request was aborted inside a prefiler, stop there
+ if ( state === 2 ) {
+ return false;
+ }
+
+ // We can fire global events as of now if asked to
+ fireGlobals = s.global;
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test( s.type );
+
+ // Watch for a new set of requests
+ if ( fireGlobals && jQuery.active++ === 0 ) {
+ jQuery.event.trigger( "ajaxStart" );
+ }
+
+ // More options handling for requests with no content
+ if ( !s.hasContent ) {
+
+ // If data is available, append data to url
+ if ( s.data ) {
+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Get ifModifiedKey before adding the anti-cache parameter
+ ifModifiedKey = s.url;
+
+ // Add anti-cache in url if needed
+ if ( s.cache === false ) {
+
+ var ts = jQuery.now(),
+ // try replacing _= if it is there
+ ret = s.url.replace( rts, "$1_=" + ts );
+
+ // if nothing was replaced, add timestamp to the end
+ s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+ jqXHR.setRequestHeader( "Content-Type", s.contentType );
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if ( s.ifModified ) {
+ ifModifiedKey = ifModifiedKey || s.url;
+ if ( jQuery.lastModified[ ifModifiedKey ] ) {
+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+ }
+ if ( jQuery.etag[ ifModifiedKey ] ) {
+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+ }
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+ s.accepts[ "*" ]
+ );
+
+ // Check for headers option
+ for ( i in s.headers ) {
+ jqXHR.setRequestHeader( i, s.headers[ i ] );
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+ // Abort if not done already
+ jqXHR.abort();
+ return false;
+
+ }
+
+ // Install callbacks on deferreds
+ for ( i in { success: 1, error: 1, complete: 1 } ) {
+ jqXHR[ i ]( s[ i ] );
+ }
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+ // If no transport, we auto-abort
+ if ( !transport ) {
+ done( -1, "No Transport" );
+ } else {
+ jqXHR.readyState = 1;
+ // Send global event
+ if ( fireGlobals ) {
+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+ }
+ // Timeout
+ if ( s.async && s.timeout > 0 ) {
+ timeoutTimer = setTimeout( function(){
+ jqXHR.abort( "timeout" );
+ }, s.timeout );
+ }
+
+ try {
+ state = 1;
+ transport.send( requestHeaders, done );
+ } catch (e) {
+ // Propagate exception as error if not done
+ if ( state < 2 ) {
+ done( -1, e );
+ // Simply rethrow otherwise
+ } else {
+ jQuery.error( e );
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ // Serialize an array of form elements or a set of
+ // key/values into a query string
+ param: function( a, traditional ) {
+ var s = [],
+ add = function( key, value ) {
+ // If value is a function, invoke it and return its value
+ value = jQuery.isFunction( value ) ? value() : value;
+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+ };
+
+ // Set traditional to true for jQuery <= 1.3.2 behavior.
+ if ( traditional === undefined ) {
+ traditional = jQuery.ajaxSettings.traditional;
+ }
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+ // Serialize the form elements
+ jQuery.each( a, function() {
+ add( this.name, this.value );
+ });
+
+ } else {
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for ( var prefix in a ) {
+ buildParams( prefix, a[ prefix ], traditional, add );
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join( "&" ).replace( r20, "+" );
+ }
+});
+
+function buildParams( prefix, obj, traditional, add ) {
+ if ( jQuery.isArray( obj ) ) {
+ // Serialize array item.
+ jQuery.each( obj, function( i, v ) {
+ if ( traditional || rbracket.test( prefix ) ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+
+ } else {
+ // If array item is non-scalar (array or object), encode its
+ // numeric index to resolve deserialization ambiguity issues.
+ // Note that rack (as of 1.0.0) can't currently deserialize
+ // nested arrays properly, and attempting to do so may cause
+ // a server error. Possible fixes are to modify rack's
+ // deserialization algorithm or to provide an option or flag
+ // to force array serialization to be shallow.
+ buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v, traditional, add );
+ }
+ });
+
+ } else if ( !traditional && obj != null && typeof obj === "object" ) {
+ // Serialize object item.
+ for ( var name in obj ) {
+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+ }
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+}
+
+// This is still on the jQuery object... for now
+// Want to move this to jQuery.ajax some day
+jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {}
+
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+
+ var contents = s.contents,
+ dataTypes = s.dataTypes,
+ responseFields = s.responseFields,
+ ct,
+ type,
+ finalDataType,
+ firstDataType;
+
+ // Fill responseXXX fields
+ for ( type in responseFields ) {
+ if ( type in responses ) {
+ jqXHR[ responseFields[type] ] = responses[ type ];
+ }
+ }
+
+ // Remove auto dataType and get content-type in the process
+ while( dataTypes[ 0 ] === "*" ) {
+ dataTypes.shift();
+ if ( ct === undefined ) {
+ ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if ( ct ) {
+ for ( type in contents ) {
+ if ( contents[ type ] && contents[ type ].test( ct ) ) {
+ dataTypes.unshift( type );
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if ( dataTypes[ 0 ] in responses ) {
+ finalDataType = dataTypes[ 0 ];
+ } else {
+ // Try convertible dataTypes
+ for ( type in responses ) {
+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+ finalDataType = type;
+ break;
+ }
+ if ( !firstDataType ) {
+ firstDataType = type;
+ }
+ }
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if ( finalDataType ) {
+ if ( finalDataType !== dataTypes[ 0 ] ) {
+ dataTypes.unshift( finalDataType );
+ }
+ return responses[ finalDataType ];
+ }
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+ // Apply the dataFilter if provided
+ if ( s.dataFilter ) {
+ response = s.dataFilter( response, s.dataType );
+ }
+
+ var dataTypes = s.dataTypes,
+ converters = {},
+ i,
+ key,
+ length = dataTypes.length,
+ tmp,
+ // Current and previous dataTypes
+ current = dataTypes[ 0 ],
+ prev,
+ // Conversion expression
+ conversion,
+ // Conversion function
+ conv,
+ // Conversion functions (transitive conversion)
+ conv1,
+ conv2;
+
+ // For each dataType in the chain
+ for ( i = 1; i < length; i++ ) {
+
+ // Create converters map
+ // with lowercased keys
+ if ( i === 1 ) {
+ for ( key in s.converters ) {
+ if ( typeof key === "string" ) {
+ converters[ key.toLowerCase() ] = s.converters[ key ];
+ }
+ }
+ }
+
+ // Get the dataTypes
+ prev = current;
+ current = dataTypes[ i ];
+
+ // If current is auto dataType, update it to prev
+ if ( current === "*" ) {
+ current = prev;
+ // If no auto and dataTypes are actually different
+ } else if ( prev !== "*" && prev !== current ) {
+
+ // Get the converter
+ conversion = prev + " " + current;
+ conv = converters[ conversion ] || converters[ "* " + current ];
+
+ // If there is no direct converter, search transitively
+ if ( !conv ) {
+ conv2 = undefined;
+ for ( conv1 in converters ) {
+ tmp = conv1.split( " " );
+ if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
+ conv2 = converters[ tmp[1] + " " + current ];
+ if ( conv2 ) {
+ conv1 = converters[ conv1 ];
+ if ( conv1 === true ) {
+ conv = conv2;
+ } else if ( conv2 === true ) {
+ conv = conv1;
+ }
+ break;
+ }
+ }
+ }
+ }
+ // If we found no converter, dispatch an error
+ if ( !( conv || conv2 ) ) {
+ jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
+ }
+ // If found converter is not an equivalence
+ if ( conv !== true ) {
+ // Convert with 1 or 2 converters accordingly
+ response = conv ? conv( response ) : conv2( conv1(response) );
+ }
+ }
+ }
+ return response;
+}
+
+
+
+
+var jsc = jQuery.now(),
+ jsre = /(\=)\?(&|$)|\?\?/i;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function() {
+ return jQuery.expando + "_" + ( jsc++ );
+ }
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+ var inspectData = s.contentType === "application/x-www-form-urlencoded" &&
+ ( typeof s.data === "string" );
+
+ if ( s.dataTypes[ 0 ] === "jsonp" ||
+ s.jsonp !== false && ( jsre.test( s.url ) ||
+ inspectData && jsre.test( s.data ) ) ) {
+
+ var responseContainer,
+ jsonpCallback = s.jsonpCallback =
+ jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
+ previous = window[ jsonpCallback ],
+ url = s.url,
+ data = s.data,
+ replace = "$1" + jsonpCallback + "$2";
+
+ if ( s.jsonp !== false ) {
+ url = url.replace( jsre, replace );
+ if ( s.url === url ) {
+ if ( inspectData ) {
+ data = data.replace( jsre, replace );
+ }
+ if ( s.data === data ) {
+ // Add callback manually
+ url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
+ }
+ }
+ }
+
+ s.url = url;
+ s.data = data;
+
+ // Install callback
+ window[ jsonpCallback ] = function( response ) {
+ responseContainer = [ response ];
+ };
+
+ // Clean-up function
+ jqXHR.always(function() {
+ // Set callback back to previous value
+ window[ jsonpCallback ] = previous;
+ // Call if it was a function and we have a response
+ if ( responseContainer && jQuery.isFunction( previous ) ) {
+ window[ jsonpCallback ]( responseContainer[ 0 ] );
+ }
+ });
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function() {
+ if ( !responseContainer ) {
+ jQuery.error( jsonpCallback + " was not called" );
+ }
+ return responseContainer[ 0 ];
+ };
+
+ // force json dataType
+ s.dataTypes[ 0 ] = "json";
+
+ // Delegate to script
+ return "script";
+ }
+});
+
+
+
+
+// Install script dataType
+jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /javascript|ecmascript/
+ },
+ converters: {
+ "text script": function( text ) {
+ jQuery.globalEval( text );
+ return text;
+ }
+ }
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+ if ( s.cache === undefined ) {
+ s.cache = false;
+ }
+ if ( s.crossDomain ) {
+ s.type = "GET";
+ s.global = false;
+ }
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+ // This transport only deals with cross domain requests
+ if ( s.crossDomain ) {
+
+ var script,
+ head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+
+ return {
+
+ send: function( _, callback ) {
+
+ script = document.createElement( "script" );
+
+ script.async = "async";
+
+ if ( s.scriptCharset ) {
+ script.charset = s.scriptCharset;
+ }
+
+ script.src = s.url;
+
+ // Attach handlers for all browsers
+ script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+ if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+ // Handle memory leak in IE
+ script.onload = script.onreadystatechange = null;
+
+ // Remove the script
+ if ( head && script.parentNode ) {
+ head.removeChild( script );
+ }
+
+ // Dereference the script
+ script = undefined;
+
+ // Callback if not abort
+ if ( !isAbort ) {
+ callback( 200, "success" );
+ }
+ }
+ };
+ // Use insertBefore instead of appendChild to circumvent an IE6 bug.
+ // This arises when a base node is used (#2709 and #4378).
+ head.insertBefore( script, head.firstChild );
+ },
+
+ abort: function() {
+ if ( script ) {
+ script.onload( 0, 1 );
+ }
+ }
+ };
+ }
+});
+
+
+
+
+var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+ xhrOnUnloadAbort = window.ActiveXObject ? function() {
+ // Abort all pending requests
+ for ( var key in xhrCallbacks ) {
+ xhrCallbacks[ key ]( 0, 1 );
+ }
+ } : false,
+ xhrId = 0,
+ xhrCallbacks;
+
+// Functions to create xhrs
+function createStandardXHR() {
+ try {
+ return new window.XMLHttpRequest();
+ } catch( e ) {}
+}
+
+function createActiveXHR() {
+ try {
+ return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+ } catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+ /* Microsoft failed to properly
+ * implement the XMLHttpRequest in IE7 (can't request local files),
+ * so we use the ActiveXObject when it is available
+ * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+ * we need a fallback.
+ */
+ function() {
+ return !this.isLocal && createStandardXHR() || createActiveXHR();
+ } :
+ // For all other browsers, use the standard XMLHttpRequest object
+ createStandardXHR;
+
+// Determine support properties
+(function( xhr ) {
+ jQuery.extend( jQuery.support, {
+ ajax: !!xhr,
+ cors: !!xhr && ( "withCredentials" in xhr )
+ });
+})( jQuery.ajaxSettings.xhr() );
+
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
+
+ jQuery.ajaxTransport(function( s ) {
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if ( !s.crossDomain || jQuery.support.cors ) {
+
+ var callback;
+
+ return {
+ send: function( headers, complete ) {
+
+ // Get a new xhr
+ var xhr = s.xhr(),
+ handle,
+ i;
+
+ // Open the socket
+ // Passing null username, generates a login popup on Opera (#2865)
+ if ( s.username ) {
+ xhr.open( s.type, s.url, s.async, s.username, s.password );
+ } else {
+ xhr.open( s.type, s.url, s.async );
+ }
+
+ // Apply custom fields if provided
+ if ( s.xhrFields ) {
+ for ( i in s.xhrFields ) {
+ xhr[ i ] = s.xhrFields[ i ];
+ }
+ }
+
+ // Override mime type if needed
+ if ( s.mimeType && xhr.overrideMimeType ) {
+ xhr.overrideMimeType( s.mimeType );
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+ headers[ "X-Requested-With" ] = "XMLHttpRequest";
+ }
+
+ // Need an extra try/catch for cross domain requests in Firefox 3
+ try {
+ for ( i in headers ) {
+ xhr.setRequestHeader( i, headers[ i ] );
+ }
+ } catch( _ ) {}
+
+ // Do send the request
+ // This may raise an exception which is actually
+ // handled in jQuery.ajax (so no try/catch here)
+ xhr.send( ( s.hasContent && s.data ) || null );
+
+ // Listener
+ callback = function( _, isAbort ) {
+
+ var status,
+ statusText,
+ responseHeaders,
+ responses,
+ xml;
+
+ // Firefox throws exceptions when accessing properties
+ // of an xhr when a network error occured
+ // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+ try {
+
+ // Was never called and is aborted or complete
+ if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+ // Only called once
+ callback = undefined;
+
+ // Do not keep as active anymore
+ if ( handle ) {
+ xhr.onreadystatechange = jQuery.noop;
+ if ( xhrOnUnloadAbort ) {
+ delete xhrCallbacks[ handle ];
+ }
+ }
+
+ // If it's an abort
+ if ( isAbort ) {
+ // Abort it manually if needed
+ if ( xhr.readyState !== 4 ) {
+ xhr.abort();
+ }
+ } else {
+ status = xhr.status;
+ responseHeaders = xhr.getAllResponseHeaders();
+ responses = {};
+ xml = xhr.responseXML;
+
+ // Construct response list
+ if ( xml && xml.documentElement /* #4958 */ ) {
+ responses.xml = xml;
+ }
+ responses.text = xhr.responseText;
+
+ // Firefox throws an exception when accessing
+ // statusText for faulty cross-domain requests
+ try {
+ statusText = xhr.statusText;
+ } catch( e ) {
+ // We normalize with Webkit giving an empty statusText
+ statusText = "";
+ }
+
+ // Filter status for non standard behaviors
+
+ // If the request is local and we have data: assume a success
+ // (success with no data won't get notified, that's the best we
+ // can do given current implementations)
+ if ( !status && s.isLocal && !s.crossDomain ) {
+ status = responses.text ? 200 : 404;
+ // IE - #1450: sometimes returns 1223 when it should be 204
+ } else if ( status === 1223 ) {
+ status = 204;
+ }
+ }
+ }
+ } catch( firefoxAccessException ) {
+ if ( !isAbort ) {
+ complete( -1, firefoxAccessException );
+ }
+ }
+
+ // Call complete if needed
+ if ( responses ) {
+ complete( status, statusText, responses, responseHeaders );
+ }
+ };
+
+ // if we're in sync mode or it's in cache
+ // and has been retrieved directly (IE6 & IE7)
+ // we need to manually fire the callback
+ if ( !s.async || xhr.readyState === 4 ) {
+ callback();
+ } else {
+ handle = ++xhrId;
+ if ( xhrOnUnloadAbort ) {
+ // Create the active xhrs callbacks list if needed
+ // and attach the unload handler
+ if ( !xhrCallbacks ) {
+ xhrCallbacks = {};
+ jQuery( window ).unload( xhrOnUnloadAbort );
+ }
+ // Add to list of active xhrs callbacks
+ xhrCallbacks[ handle ] = callback;
+ }
+ xhr.onreadystatechange = callback;
+ }
+ },
+
+ abort: function() {
+ if ( callback ) {
+ callback(0,1);
+ }
+ }
+ };
+ }
+ });
+}
+
+
+
+
+var elemdisplay = {},
+ iframe, iframeDoc,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
+ timerId,
+ fxAttrs = [
+ // height animations
+ [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
+ // width animations
+ [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
+ // opacity animations
+ [ "opacity" ]
+ ],
+ fxNow;
+
+jQuery.fn.extend({
+ show: function( speed, easing, callback ) {
+ var elem, display;
+
+ if ( speed || speed === 0 ) {
+ return this.animate( genFx("show", 3), speed, easing, callback );
+
+ } else {
+ for ( var i = 0, j = this.length; i < j; i++ ) {
+ elem = this[ i ];
+
+ if ( elem.style ) {
+ display = elem.style.display;
+
+ // Reset the inline display of this element to learn if it is
+ // being hidden by cascaded rules or not
+ if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
+ display = elem.style.display = "";
+ }
+
+ // Set elements which have been overridden with display: none
+ // in a stylesheet to whatever the default browser style is
+ // for such an element
+ if ( display === "" && jQuery.css(elem, "display") === "none" ) {
+ jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
+ }
+ }
+ }
+
+ // Set the display of most of the elements in a second loop
+ // to avoid the constant reflow
+ for ( i = 0; i < j; i++ ) {
+ elem = this[ i ];
+
+ if ( elem.style ) {
+ display = elem.style.display;
+
+ if ( display === "" || display === "none" ) {
+ elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
+ }
+ }
+ }
+
+ return this;
+ }
+ },
+
+ hide: function( speed, easing, callback ) {
+ if ( speed || speed === 0 ) {
+ return this.animate( genFx("hide", 3), speed, easing, callback);
+
+ } else {
+ var elem, display,
+ i = 0,
+ j = this.length;
+
+ for ( ; i < j; i++ ) {
+ elem = this[i];
+ if ( elem.style ) {
+ display = jQuery.css( elem, "display" );
+
+ if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
+ jQuery._data( elem, "olddisplay", display );
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop
+ // to avoid the constant reflow
+ for ( i = 0; i < j; i++ ) {
+ if ( this[i].style ) {
+ this[i].style.display = "none";
+ }
+ }
+
+ return this;
+ }
+ },
+
+ // Save the old toggle function
+ _toggle: jQuery.fn.toggle,
+
+ toggle: function( fn, fn2, callback ) {
+ var bool = typeof fn === "boolean";
+
+ if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
+ this._toggle.apply( this, arguments );
+
+ } else if ( fn == null || bool ) {
+ this.each(function() {
+ var state = bool ? fn : jQuery(this).is(":hidden");
+ jQuery(this)[ state ? "show" : "hide" ]();
+ });
+
+ } else {
+ this.animate(genFx("toggle", 3), fn, fn2, callback);
+ }
+
+ return this;
+ },
+
+ fadeTo: function( speed, to, easing, callback ) {
+ return this.filter(":hidden").css("opacity", 0).show().end()
+ .animate({opacity: to}, speed, easing, callback);
+ },
+
+ animate: function( prop, speed, easing, callback ) {
+ var optall = jQuery.speed( speed, easing, callback );
+
+ if ( jQuery.isEmptyObject( prop ) ) {
+ return this.each( optall.complete, [ false ] );
+ }
+
+ // Do not change referenced properties as per-property easing will be lost
+ prop = jQuery.extend( {}, prop );
+
+ function doAnimation() {
+ // XXX 'this' does not always have a nodeName when running the
+ // test suite
+
+ if ( optall.queue === false ) {
+ jQuery._mark( this );
+ }
+
+ var opt = jQuery.extend( {}, optall ),
+ isElement = this.nodeType === 1,
+ hidden = isElement && jQuery(this).is(":hidden"),
+ name, val, p, e,
+ parts, start, end, unit,
+ method;
+
+ // will store per property easing and be used to determine when an animation is complete
+ opt.animatedProperties = {};
+
+ for ( p in prop ) {
+
+ // property name normalization
+ name = jQuery.camelCase( p );
+ if ( p !== name ) {
+ prop[ name ] = prop[ p ];
+ delete prop[ p ];
+ }
+
+ val = prop[ name ];
+
+ // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
+ if ( jQuery.isArray( val ) ) {
+ opt.animatedProperties[ name ] = val[ 1 ];
+ val = prop[ name ] = val[ 0 ];
+ } else {
+ opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
+ }
+
+ if ( val === "hide" && hidden || val === "show" && !hidden ) {
+ return opt.complete.call( this );
+ }
+
+ if ( isElement && ( name === "height" || name === "width" ) ) {
+ // Make sure that nothing sneaks out
+ // Record all 3 overflow attributes because IE does not
+ // change the overflow attribute when overflowX and
+ // overflowY are set to the same value
+ opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+
+ // Set display property to inline-block for height/width
+ // animations on inline elements that are having width/height animated
+ if ( jQuery.css( this, "display" ) === "inline" &&
+ jQuery.css( this, "float" ) === "none" ) {
+
+ // inline-level elements accept inline-block;
+ // block-level elements need to be inline with layout
+ if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
+ this.style.display = "inline-block";
+
+ } else {
+ this.style.zoom = 1;
+ }
+ }
+ }
+ }
+
+ if ( opt.overflow != null ) {
+ this.style.overflow = "hidden";
+ }
+
+ for ( p in prop ) {
+ e = new jQuery.fx( this, opt, p );
+ val = prop[ p ];
+
+ if ( rfxtypes.test( val ) ) {
+
+ // Tracks whether to show or hide based on private
+ // data attached to the element
+ method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
+ if ( method ) {
+ jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
+ e[ method ]();
+ } else {
+ e[ val ]();
+ }
+
+ } else {
+ parts = rfxnum.exec( val );
+ start = e.cur();
+
+ if ( parts ) {
+ end = parseFloat( parts[2] );
+ unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
+
+ // We need to compute starting value
+ if ( unit !== "px" ) {
+ jQuery.style( this, p, (end || 1) + unit);
+ start = ( (end || 1) / e.cur() ) * start;
+ jQuery.style( this, p, start + unit);
+ }
+
+ // If a +=/-= token was provided, we're doing a relative animation
+ if ( parts[1] ) {
+ end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
+ }
+
+ e.custom( start, end, unit );
+
+ } else {
+ e.custom( start, val, "" );
+ }
+ }
+ }
+
+ // For JS strict compliance
+ return true;
+ }
+
+ return optall.queue === false ?
+ this.each( doAnimation ) :
+ this.queue( optall.queue, doAnimation );
+ },
+
+ stop: function( type, clearQueue, gotoEnd ) {
+ if ( typeof type !== "string" ) {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if ( clearQueue && type !== false ) {
+ this.queue( type || "fx", [] );
+ }
+
+ return this.each(function() {
+ var i,
+ hadTimers = false,
+ timers = jQuery.timers,
+ data = jQuery._data( this );
+
+ // clear marker counters if we know they won't be
+ if ( !gotoEnd ) {
+ jQuery._unmark( true, this );
+ }
+
+ function stopQueue( elem, data, i ) {
+ var hooks = data[ i ];
+ jQuery.removeData( elem, i, true );
+ hooks.stop( gotoEnd );
+ }
+
+ if ( type == null ) {
+ for ( i in data ) {
+ if ( data[ i ].stop && i.indexOf(".run") === i.length - 4 ) {
+ stopQueue( this, data, i );
+ }
+ }
+ } else if ( data[ i = type + ".run" ] && data[ i ].stop ){
+ stopQueue( this, data, i );
+ }
+
+ for ( i = timers.length; i--; ) {
+ if ( timers[ i ].elem === this && (type == null || timers[ i ].queue === type) ) {
+ if ( gotoEnd ) {
+
+ // force the next step to be the last
+ timers[ i ]( true );
+ } else {
+ timers[ i ].saveState();
+ }
+ hadTimers = true;
+ timers.splice( i, 1 );
+ }
+ }
+
+ // start the next in the queue if the last step wasn't forced
+ // timers currently will call their complete callbacks, which will dequeue
+ // but only if they were gotoEnd
+ if ( !( gotoEnd && hadTimers ) ) {
+ jQuery.dequeue( this, type );
+ }
+ });
+ }
+
+});
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+ setTimeout( clearFxNow, 0 );
+ return ( fxNow = jQuery.now() );
+}
+
+function clearFxNow() {
+ fxNow = undefined;
+}
+
+// Generate parameters to create a standard animation
+function genFx( type, num ) {
+ var obj = {};
+
+ jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
+ obj[ this ] = type;
+ });
+
+ return obj;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+ slideDown: genFx( "show", 1 ),
+ slideUp: genFx( "hide", 1 ),
+ slideToggle: genFx( "toggle", 1 ),
+ fadeIn: { opacity: "show" },
+ fadeOut: { opacity: "hide" },
+ fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+ jQuery.fn[ name ] = function( speed, easing, callback ) {
+ return this.animate( props, speed, easing, callback );
+ };
+});
+
+jQuery.extend({
+ speed: function( speed, easing, fn ) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+ complete: fn || !fn && easing ||
+ jQuery.isFunction( speed ) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+ };
+
+ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+ // normalize opt.queue - true/undefined/null -> "fx"
+ if ( opt.queue == null || opt.queue === true ) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function( noUnmark ) {
+ if ( jQuery.isFunction( opt.old ) ) {
+ opt.old.call( this );
+ }
+
+ if ( opt.queue ) {
+ jQuery.dequeue( this, opt.queue );
+ } else if ( noUnmark !== false ) {
+ jQuery._unmark( this );
+ }
+ };
+
+ return opt;
+ },
+
+ easing: {
+ linear: function( p, n, firstNum, diff ) {
+ return firstNum + diff * p;
+ },
+ swing: function( p, n, firstNum, diff ) {
+ return ( ( -Math.cos( p*Math.PI ) / 2 ) + 0.5 ) * diff + firstNum;
+ }
+ },
+
+ timers: [],
+
+ fx: function( elem, options, prop ) {
+ this.options = options;
+ this.elem = elem;
+ this.prop = prop;
+
+ options.orig = options.orig || {};
+ }
+
+});
+
+jQuery.fx.prototype = {
+ // Simple function for setting a style value
+ update: function() {
+ if ( this.options.step ) {
+ this.options.step.call( this.elem, this.now, this );
+ }
+
+ ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
+ },
+
+ // Get the current size
+ cur: function() {
+ if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
+ return this.elem[ this.prop ];
+ }
+
+ var parsed,
+ r = jQuery.css( this.elem, this.prop );
+ // Empty strings, null, undefined and "auto" are converted to 0,
+ // complex values such as "rotate(1rad)" are returned as is,
+ // simple values such as "10px" are parsed to Float.
+ return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
+ },
+
+ // Start an animation from one number to another
+ custom: function( from, to, unit ) {
+ var self = this,
+ fx = jQuery.fx;
+
+ this.startTime = fxNow || createFxNow();
+ this.end = to;
+ this.now = this.start = from;
+ this.pos = this.state = 0;
+ this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
+
+ function t( gotoEnd ) {
+ return self.step( gotoEnd );
+ }
+
+ t.queue = this.options.queue;
+ t.elem = this.elem;
+ t.saveState = function() {
+ if ( self.options.hide && jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
+ jQuery._data( self.elem, "fxshow" + self.prop, self.start );
+ }
+ };
+
+ if ( t() && jQuery.timers.push(t) && !timerId ) {
+ timerId = setInterval( fx.tick, fx.interval );
+ }
+ },
+
+ // Simple 'show' function
+ show: function() {
+ var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
+ this.options.show = true;
+
+ // Begin the animation
+ // Make sure that we start at a small width/height to avoid any flash of content
+ if ( dataShow !== undefined ) {
+ // This show is picking up where a previous hide or show left off
+ this.custom( this.cur(), dataShow );
+ } else {
+ this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
+ }
+
+ // Start by showing the element
+ jQuery( this.elem ).show();
+ },
+
+ // Simple 'hide' function
+ hide: function() {
+ // Remember where we started, so that we can go back to it later
+ this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
+ this.options.hide = true;
+
+ // Begin the animation
+ this.custom( this.cur(), 0 );
+ },
+
+ // Each step of an animation
+ step: function( gotoEnd ) {
+ var p, n, complete,
+ t = fxNow || createFxNow(),
+ done = true,
+ elem = this.elem,
+ options = this.options;
+
+ if ( gotoEnd || t >= options.duration + this.startTime ) {
+ this.now = this.end;
+ this.pos = this.state = 1;
+ this.update();
+
+ options.animatedProperties[ this.prop ] = true;
+
+ for ( p in options.animatedProperties ) {
+ if ( options.animatedProperties[ p ] !== true ) {
+ done = false;
+ }
+ }
+
+ if ( done ) {
+ // Reset the overflow
+ if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+
+ jQuery.each( [ "", "X", "Y" ], function( index, value ) {
+ elem.style[ "overflow" + value ] = options.overflow[ index ];
+ });
+ }
+
+ // Hide the element if the "hide" operation was done
+ if ( options.hide ) {
+ jQuery( elem ).hide();
+ }
+
+ // Reset the properties, if the item has been hidden or shown
+ if ( options.hide || options.show ) {
+ for ( p in options.animatedProperties ) {
+ jQuery.style( elem, p, options.orig[ p ] );
+ jQuery.removeData( elem, "fxshow" + p, true );
+ // Toggle data is no longer needed
+ jQuery.removeData( elem, "toggle" + p, true );
+ }
+ }
+
+ // Execute the complete function
+ // in the event that the complete function throws an exception
+ // we must ensure it won't be called twice. #5684
+
+ complete = options.complete;
+ if ( complete ) {
+
+ options.complete = false;
+ complete.call( elem );
+ }
+ }
+
+ return false;
+
+ } else {
+ // classical easing cannot be used with an Infinity duration
+ if ( options.duration == Infinity ) {
+ this.now = t;
+ } else {
+ n = t - this.startTime;
+ this.state = n / options.duration;
+
+ // Perform the easing function, defaults to swing
+ this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
+ this.now = this.start + ( (this.end - this.start) * this.pos );
+ }
+ // Perform the next step of the animation
+ this.update();
+ }
+
+ return true;
+ }
+};
+
+jQuery.extend( jQuery.fx, {
+ tick: function() {
+ var timer,
+ timers = jQuery.timers,
+ i = 0;
+
+ for ( ; i < timers.length; i++ ) {
+ timer = timers[ i ];
+ // Checks the timer has not already been removed
+ if ( !timer() && timers[ i ] === timer ) {
+ timers.splice( i--, 1 );
+ }
+ }
+
+ if ( !timers.length ) {
+ jQuery.fx.stop();
+ }
+ },
+
+ interval: 13,
+
+ stop: function() {
+ clearInterval( timerId );
+ timerId = null;
+ },
+
+ speeds: {
+ slow: 600,
+ fast: 200,
+ // Default speed
+ _default: 400
+ },
+
+ step: {
+ opacity: function( fx ) {
+ jQuery.style( fx.elem, "opacity", fx.now );
+ },
+
+ _default: function( fx ) {
+ if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
+ fx.elem.style[ fx.prop ] = fx.now + fx.unit;
+ } else {
+ fx.elem[ fx.prop ] = fx.now;
+ }
+ }
+ }
+});
+
+// Adds width/height step functions
+// Do not set anything below 0
+jQuery.each([ "width", "height" ], function( i, prop ) {
+ jQuery.fx.step[ prop ] = function( fx ) {
+ jQuery.style( fx.elem, prop, Math.max(0, fx.now) );
+ };
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+ jQuery.expr.filters.animated = function( elem ) {
+ return jQuery.grep(jQuery.timers, function( fn ) {
+ return elem === fn.elem;
+ }).length;
+ };
+}
+
+// Try to restore the default display value of an element
+function defaultDisplay( nodeName ) {
+
+ if ( !elemdisplay[ nodeName ] ) {
+
+ var body = document.body,
+ elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
+ display = elem.css( "display" );
+ elem.remove();
+
+ // If the simple way fails,
+ // get element's real default display by attaching it to a temp iframe
+ if ( display === "none" || display === "" ) {
+ // No iframe to use yet, so create it
+ if ( !iframe ) {
+ iframe = document.createElement( "iframe" );
+ iframe.frameBorder = iframe.width = iframe.height = 0;
+ }
+
+ body.appendChild( iframe );
+
+ // Create a cacheable copy of the iframe document on first call.
+ // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+ // document to it; WebKit & Firefox won't allow reusing the iframe document.
+ if ( !iframeDoc || !iframe.createElement ) {
+ iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+ iframeDoc.write( ( document.compatMode === "CSS1Compat" ? "<!doctype html>" : "" ) + "<html><body>" );
+ iframeDoc.close();
+ }
+
+ elem = iframeDoc.createElement( nodeName );
+
+ iframeDoc.body.appendChild( elem );
+
+ display = jQuery.css( elem, "display" );
+ body.removeChild( iframe );
+ }
+
+ // Store the correct default display
+ elemdisplay[ nodeName ] = display;
+ }
+
+ return elemdisplay[ nodeName ];
+}
+
+
+
+
+var rtable = /^t(?:able|d|h)$/i,
+ rroot = /^(?:body|html)$/i;
+
+if ( "getBoundingClientRect" in document.documentElement ) {
+ jQuery.fn.offset = function( options ) {
+ var elem = this[0], box;
+
+ if ( options ) {
+ return this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ if ( !elem || !elem.ownerDocument ) {
+ return null;
+ }
+
+ if ( elem === elem.ownerDocument.body ) {
+ return jQuery.offset.bodyOffset( elem );
+ }
+
+ try {
+ box = elem.getBoundingClientRect();
+ } catch(e) {}
+
+ var doc = elem.ownerDocument,
+ docElem = doc.documentElement;
+
+ // Make sure we're not dealing with a disconnected DOM node
+ if ( !box || !jQuery.contains( docElem, elem ) ) {
+ return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
+ }
+
+ var body = doc.body,
+ win = getWindow(doc),
+ clientTop = docElem.clientTop || body.clientTop || 0,
+ clientLeft = docElem.clientLeft || body.clientLeft || 0,
+ scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,
+ scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
+ top = box.top + scrollTop - clientTop,
+ left = box.left + scrollLeft - clientLeft;
+
+ return { top: top, left: left };
+ };
+
+} else {
+ jQuery.fn.offset = function( options ) {
+ var elem = this[0];
+
+ if ( options ) {
+ return this.each(function( i ) {
+ jQuery.offset.setOffset( this, options, i );
+ });
+ }
+
+ if ( !elem || !elem.ownerDocument ) {
+ return null;
+ }
+
+ if ( elem === elem.ownerDocument.body ) {
+ return jQuery.offset.bodyOffset( elem );
+ }
+
+ var computedStyle,
+ offsetParent = elem.offsetParent,
+ prevOffsetParent = elem,
+ doc = elem.ownerDocument,
+ docElem = doc.documentElement,
+ body = doc.body,
+ defaultView = doc.defaultView,
+ prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
+ top = elem.offsetTop,
+ left = elem.offsetLeft;
+
+ while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
+ if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+ break;
+ }
+
+ computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
+ top -= elem.scrollTop;
+ left -= elem.scrollLeft;
+
+ if ( elem === offsetParent ) {
+ top += elem.offsetTop;
+ left += elem.offsetLeft;
+
+ if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
+ top += parseFloat( computedStyle.borderTopWidth ) || 0;
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+ }
+
+ prevOffsetParent = offsetParent;
+ offsetParent = elem.offsetParent;
+ }
+
+ if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
+ top += parseFloat( computedStyle.borderTopWidth ) || 0;
+ left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+ }
+
+ prevComputedStyle = computedStyle;
+ }
+
+ if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
+ top += body.offsetTop;
+ left += body.offsetLeft;
+ }
+
+ if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
+ top += Math.max( docElem.scrollTop, body.scrollTop );
+ left += Math.max( docElem.scrollLeft, body.scrollLeft );
+ }
+
+ return { top: top, left: left };
+ };
+}
+
+jQuery.offset = {
+
+ bodyOffset: function( body ) {
+ var top = body.offsetTop,
+ left = body.offsetLeft;
+
+ if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+ top += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+ left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
+ }
+
+ return { top: top, left: left };
+ },
+
+ setOffset: function( elem, options, i ) {
+ var position = jQuery.css( elem, "position" );
+
+ // set position first, in-case top/left are set even on static elem
+ if ( position === "static" ) {
+ elem.style.position = "relative";
+ }
+
+ var curElem = jQuery( elem ),
+ curOffset = curElem.offset(),
+ curCSSTop = jQuery.css( elem, "top" ),
+ curCSSLeft = jQuery.css( elem, "left" ),
+ calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+ props = {}, curPosition = {}, curTop, curLeft;
+
+ // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+ if ( calculatePosition ) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+ } else {
+ curTop = parseFloat( curCSSTop ) || 0;
+ curLeft = parseFloat( curCSSLeft ) || 0;
+ }
+
+ if ( jQuery.isFunction( options ) ) {
+ options = options.call( elem, i, curOffset );
+ }
+
+ if ( options.top != null ) {
+ props.top = ( options.top - curOffset.top ) + curTop;
+ }
+ if ( options.left != null ) {
+ props.left = ( options.left - curOffset.left ) + curLeft;
+ }
+
+ if ( "using" in options ) {
+ options.using.call( elem, props );
+ } else {
+ curElem.css( props );
+ }
+ }
+};
+
+
+jQuery.fn.extend({
+
+ position: function() {
+ if ( !this[0] ) {
+ return null;
+ }
+
+ var elem = this[0],
+
+ // Get *real* offsetParent
+ offsetParent = this.offsetParent(),
+
+ // Get correct offsets
+ offset = this.offset(),
+ parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+
+ // Subtract element margins
+ // note: when an element has margin: auto the offsetLeft and marginLeft
+ // are the same in Safari causing offset.left to incorrectly be 0
+ offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+ offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+ // Add offsetParent borders
+ parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+ parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+ // Subtract the two offsets
+ return {
+ top: offset.top - parentOffset.top,
+ left: offset.left - parentOffset.left
+ };
+ },
+
+ offsetParent: function() {
+ return this.map(function() {
+ var offsetParent = this.offsetParent || document.body;
+ while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+ offsetParent = offsetParent.offsetParent;
+ }
+ return offsetParent;
+ });
+ }
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( ["Left", "Top"], function( i, name ) {
+ var method = "scroll" + name;
+
+ jQuery.fn[ method ] = function( val ) {
+ var elem, win;
+
+ if ( val === undefined ) {
+ elem = this[ 0 ];
+
+ if ( !elem ) {
+ return null;
+ }
+
+ win = getWindow( elem );
+
+ // Return the scroll offset
+ return win ? ("pageXOffset" in win) ? win[ i ? "pageYOffset" : "pageXOffset" ] :
+ jQuery.support.boxModel && win.document.documentElement[ method ] ||
+ win.document.body[ method ] :
+ elem[ method ];
+ }
+
+ // Set the scroll offset
+ return this.each(function() {
+ win = getWindow( this );
+
+ if ( win ) {
+ win.scrollTo(
+ !i ? val : jQuery( win ).scrollLeft(),
+ i ? val : jQuery( win ).scrollTop()
+ );
+
+ } else {
+ this[ method ] = val;
+ }
+ });
+ };
+});
+
+function getWindow( elem ) {
+ return jQuery.isWindow( elem ) ?
+ elem :
+ elem.nodeType === 9 ?
+ elem.defaultView || elem.parentWindow :
+ false;
+}
+
+
+
+
+// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
+jQuery.each([ "Height", "Width" ], function( i, name ) {
+
+ var type = name.toLowerCase();
+
+ // innerHeight and innerWidth
+ jQuery.fn[ "inner" + name ] = function() {
+ var elem = this[0];
+ return elem ?
+ elem.style ?
+ parseFloat( jQuery.css( elem, type, "padding" ) ) :
+ this[ type ]() :
+ null;
+ };
+
+ // outerHeight and outerWidth
+ jQuery.fn[ "outer" + name ] = function( margin ) {
+ var elem = this[0];
+ return elem ?
+ elem.style ?
+ parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
+ this[ type ]() :
+ null;
+ };
+
+ jQuery.fn[ type ] = function( size ) {
+ // Get window width or height
+ var elem = this[0];
+ if ( !elem ) {
+ return size == null ? null : this;
+ }
+
+ if ( jQuery.isFunction( size ) ) {
+ return this.each(function( i ) {
+ var self = jQuery( this );
+ self[ type ]( size.call( this, i, self[ type ]() ) );
+ });
+ }
+
+ if ( jQuery.isWindow( elem ) ) {
+ // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode
+ // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
+ var docElemProp = elem.document.documentElement[ "client" + name ],
+ body = elem.document.body;
+ return elem.document.compatMode === "CSS1Compat" && docElemProp ||
+ body && body[ "client" + name ] || docElemProp;
+
+ // Get document width or height
+ } else if ( elem.nodeType === 9 ) {
+ // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
+ return Math.max(
+ elem.documentElement["client" + name],
+ elem.body["scroll" + name], elem.documentElement["scroll" + name],
+ elem.body["offset" + name], elem.documentElement["offset" + name]
+ );
+
+ // Get or set width or height on the element
+ } else if ( size === undefined ) {
+ var orig = jQuery.css( elem, type ),
+ ret = parseFloat( orig );
+
+ return jQuery.isNumeric( ret ) ? ret : orig;
+
+ // Set the width or height on the element (default to pixels if value is unitless)
+ } else {
+ return this.css( type, typeof size === "string" ? size : size + "px" );
+ }
+ };
+
+});
+
+
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+})( window );
--- /dev/null
+<!--
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@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: 25px;
+}
+</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: {"case_id": window.parent.manualcaseslist[iTestsManual].casesid,"purpose": window.parent.manualcaseslist[iTestsManual].purpose, "result": iResult},
+ dataType: "json",
+ beforeSend: function(x) {
+ if (x && x.overrideMimeType) {
+ x.overrideMimeType("application/json;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:12%" id="runbutton" value="Run" onclick="runTest()"/>
+</div>
+<div width=100%>
+<textarea id="casesinfo" rows=8 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:25px" onclick="passLabel()">Pass</label>
+
+<input type="radio" id="failradio" value="Fail" onclick="failRadio()"/><label style="font-size:25px" onclick="failLabel()">Fail</label>
+
+<input type="radio" id="blockradio" value="Block" onclick="blockRadio()"/><label style="font-size:25px" 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>
--- /dev/null
+<!--
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@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: 25px;
+}
+
+</style>
+<script src="jquery.js"></script>
+<script>
+var iTestsManual = 0;
+
+function fillCasesInfo(){
+ window.parent.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.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('test_script_entry').get(0);
+ if(scriptPathText){
+ if($(scriptPathText).text().trim() == "")
+ document.getElementById("runbutton").disabled = true;
+ else
+ document.getElementById("runbutton").disabled = false;
+ }else {
+ document.getElementById("runbutton").disabled = true;
+ }
+
+ document.getElementById("casesinfo").value="";
+ document.getElementById("casesinfo").value+="Descriptions: "+$(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).attr('purpose')+"\n";
+ var preC = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('pre_condition');
+ if (preC && preC.length > 0){
+ var preCText = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('pre_condition').get(0);
+ document.getElementById("casesinfo").value+= "PreCondition: "+$(preCText).text().trim()+"\n";
+ }
+
+ var posC = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('post_condition');
+ if (posC && posC.length > 0){
+ var posCText = $(posC).get(0);
+ document.getElementById("casesinfo").value+= "PostCondition: "+$(posCText).text().trim()+"\n";
+ }
+ var stepInfo = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('step_desc');
+ var stepExp = $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('expected');
+ for(var j=0;j<stepInfo.length;j++){
+ var stepsnum = j + 1;
+ if(stepInfo){
+ var stepInfoText = $(stepInfo[j]).get(0);
+ document.getElementById("casesinfo").value+= "Step-"+stepsnum+": "+$(stepInfoText).text().trim()+"\n";
+ }
+ if(stepExp){
+ var stepExpText = $(stepExp[j]).get(0);
+ document.getElementById("casesinfo").value+= "Expected"+": "+$(stepExpText).text().trim()+"\n";
+ }
+ }
+}
+
+function initManual(){
+ for(var i = 0; i < window.parent.manualcaseslist.length; i++){
+ var id_temp = window.parent.manualcaseslist[i].casesid;
+ if(window.parent.manualcaseslist[i].casesid.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.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('test_script_entry').get(0);
+ if(scriptPathText){
+ window.parent.oTestFrame.src = $(scriptPathText).text().trim();
+ }
+}
+
+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(){
+ if (window.parent.manualcaseslist[iTestsManual].index >= window.parent.Tests.length)
+ return;
+ 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;
+
+ $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).attr('result', iResult);
+ if($(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('result_info').length > 0)
+ $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).find('result_info').remove();
+
+ var doc=$.parseXML("<result_info>" + "<actual_result>" + iResult +"</actual_result>" + "<start>" + "</start>" + "<end>" + "</end>" + "<stdout>" + "</stdout>" + "</result_info>");
+ $(window.parent.Tests[window.parent.manualcaseslist[iTestsManual].index]).append(doc.documentElement);
+
+// window.parent.statusNode.innerHTML = "Test #" + (window.parent.manualcaseslist[iTestsManual].index+1) + "/" + window.parent.Tests.length + "(" + iResult + ") " + window.parent.oTestFrame.src;
+}
+
+function completeTest(){
+ window.parent.PublishResult();
+}
+
+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:12%" id="runbutton" value="Run" onclick="runTest()"/>
+</div>
+<div width=100%>
+<textarea id="casesinfo" rows=8 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:25px" onclick="passLabel()">Pass</label>
+
+<input type="radio" id="failradio" value="Fail" onclick="failRadio()"/><label style="font-size:25px" onclick="failLabel()">Fail</label>
+
+<input type="radio" id="blockradio" value="Block" onclick="blockRadio()"/><label style="font-size:25px" 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>
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitxsddir = /opt/testkit/lite2.4/xsd
+dist_testkitxsd_DATA = *.js *.xsl *.css *.png *.txt *.xml *.xsd release-notes
--- /dev/null
+function getScrollTop(){
+ return f_scrollTop();
+}
+
+function f_scrollTop() {
+ return f_filterResults (
+ $(window) ? $(window).scrollTop() : 0,
+ document.documentElement ? document.documentElement.scrollTop : 0,
+ document.body ? document.body.scrollTop : 0
+ );
+}
+function f_filterResults(n_win, n_docel, n_body) {
+ var n_result = n_win ? n_win : 0;
+ if (n_docel && (!n_result || (n_result > n_docel)))
+ n_result = n_docel;
+ return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
+}
+
+function setScrollTop(){
+ $(window) ? $(window).scrollTop(0): 0;
+ document.documentElement ? document.documentElement.scrollTop = 0 :0;
+ document.body ? document.body.scrollTop = 0 : 0;
+}
+
+function goTopEx(){
+ $node = $('#goTopBtn');
+ if(getScrollTop() > 0){
+ $node.show();
+ }else{
+ $node.hide();
+ }
+
+ $(window).scroll(function(){
+ if(getScrollTop() > 0){
+ $node.show();
+ }else{
+ $node.hide();
+ }
+ });
+
+ $node.click(function(){
+ setScrollTop();
+ });
+}
\ No newline at end of file
--- /dev/null
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
--- /dev/null
+= XSLT style for Test Case and Test Result =\r
+\r
+== Files structure ==\r
+\r
+ readme.txt\r
+ test_definition.xsd //The schema of test definition\r
+ tests.css // CSS style for showing test cases and results\r
+ testresult.xsl\r
+ testcase.xsl\r
+ tests.xml //example of test cases\r
+ result.xml //example of test result\r
+ \r
+ \r
+ == Applying the style ==\r
+ \r
+ === Update in definition and result XML ===\r
+ \r
+ For applying this style for the definition XML of test cases, please add below statement before the root element of XML (the tag "test_definition").\r
+ \r
+ <?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>\r
+ \r
+ as below: \r
+ \r
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>\r
+<test_definition>\r
+\r
+For applying this style for the test-result XML, please add below statement before the root element of XML (the tag "test_definition").\r
+<?xml-stylesheet type="text/xsl" href="./testresult.xsl"?>\r
+\r
+as below:\r
+\r
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?xml-stylesheet type="text/xsl" href="./testresult.xsl"?>\r
+<test_definition>\r
+\r
+=== Deploy XSLT and CSS style ===\r
+\r
+For our test package, below 3 files should be added in each test package. \r
+\r
+ tests.css \r
+ testresult.xsl\r
+ testcase.xsl\r
+ \r
+For instance, add them under the test package "webapi-tizen-alarm-tests".\r
+ ©¸©¤webapi-tizen-alarm-tests\r
+ ©¸©¤...\r
+ ©¸©¤...\r
+ ©¸tests.css \r
+ ©¸testresult.xsl\r
+ ©¸testcase.xsl\r
+ ©¸tests.xml\r
+ ©¸...\r
--- /dev/null
+-- version 1.0.1-2 --
+
+ adding 2 new case types "compliance" and "user_experience"
+
+-- version 1.0.1-3 --
+
+ Add a new sub-element "spec" (type: string) under the "testcase" element.
+
+-- version 1.0.1-4 --
+
+ Add 2 new priority "P3" and "P4"
+
+-- version 1.0.1-5 --
+ Add a new root "test_definition", and the element "suite" has been move into it as children elements.
+
+-- version 1.0.1-6 --
+ A new optional attribute "launcher" is added in the element "testdefinition" for supporting identifying which kind of test suites the XML is designed for
+
+-- version 1.0.1-7 --
+The Xslt related files are merged into this repo.
+including
+
+ tests.css // CSS style for showing test cases and results
+ testresult.xsl
+ testcase.xsl
+ tests.xml //example of test cases
+ result.xml //example of test result
+ application.js //Javascript for "back to top"
+ jquery.min.js //JQuery
+ back_top.png //image for "back to top"
+
+Modification in Schema:
+
+1\ the optional attribute "launcher" is moved into suite, not in "testdefinition" element any longer.
+
+2\ "spec" element is removed. and a new "specs" structure is added as below
+
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications"
+ section="Widget" specification="Widget Packaging and XML Configuration"
+ interface="Widget" usage="true" />
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+All spec-related infomation are re-organized as XML element and attributes.
+
+In Xslt,
+
+1\ a float image "Back to top" is available on right-bottom for scrolling to top.
+
+2\ html anchor is adder for scrolling back to suite summary table, and case detail tables.
+
+-- version 1.0.1-8 --
+1\ For more flexible, rename the attribute "method_or_attribute" to "element_name".
+2\ Add a new attribute "element_type" to describe the type of the corresponding specification item
+
+related example and Xlst is also updated for above.
+
+-- version 1.0.1-9 --
+1\ add an attribute "cts_version" in the element "environment/BuildInfoType" for saving the version of CTS tool
+2\ add an attribute "file" in "measurement/simpleMeasurementType"
+3\ update the result XSLt for showing cts_version
+4\ update the result XSLt for showing ¡°Test Blocked¡± instead of "Test N/A"
+5\ add a summary table for showing all FAIL cases.
+
+
+-- version 1.0.2-1 --
+1\ add a new int optional attribute "onload_delay" with default "3"
+
+-- version 1.0.2-2 --
+1\ Add a new sub element "capabilities" under the element "testcase"
+2\ Add a new boolean attribute "check_unsupport_error" in the element "testcase"
+
+-- version 1.0.2-3 --
+1\ Move the sub element "capabilities" from the element "testcase" to the element "set"
+
+
+-- version 1.0.2-4 --
+1\ Add a unique limitation for suite name
+2\ Add a new optional attribute "launcher" in set
+
+
+-- version 1.0.2-5 --
+1\ Add a attribute "set_debug_msg" in set for recording the name of log file.
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?xml-stylesheet type="text/xsl" href="testresult.xsl"?>\r
+<test_definition name="http://tempuri.org" type=""\r
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+ xsi:noNamespaceSchemaLocation="test_definition.xsd">\r
+ <environment device_id="generic/sdk/generic:4.0.4/MR1/302030:eng/test-keys"\r
+ device_model="unknown" device_name="MR8" firmware_version="4.0.4"\r
+ host="zhongqing-dev.sh.intel.com (Linux - 2.6.38.6-26.rc1.fc15.i686)"\r
+ os_version="4.0.4" resolution="1280*800" screen_size="250*150" cts_version="2.3.0-3">\r
+ <other> Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~\r
+ Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~\r
+ Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~\r
+ </other>\r
+ </environment>\r
+ <summary test_plan_name="tmp_test_1">\r
+ <start_at>Fri Jul 13 04:04:59 CST 2012</start_at>\r
+ <end_at>Fri Jul 13 05:01:53 CST 2012</end_at>\r
+ </summary>\r
+ <suite name="webapi-tizen-alarm-tests" type="">\r
+ <set name="Alarm1">\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_constructor_delay" priority="P1"\r
+ purpose="check AlarmRelative attribute when create with delay"\r
+ status="approved" type="compliance" result="PASS">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative create constructor with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative create succeed with constructor with\r
+ delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>PASS</actual_result>\r
+ <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_get" priority="P1"\r
+ purpose="check AlarmManager method removeAll: without input attribute"\r
+ status="approved" type="compliance" result="BLOCK">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method get: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method get: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>BLOCK</actual_result>\r
+ <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with date"\r
+ status="approved" type="compliance">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute attribute when create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute attribute return correct value when\r
+ create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>N/R</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_add_rel" priority="P1"\r
+ purpose="check AlarmManager method add: add relative alarm" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method add: add relative alarm\r
+ </step_desc>\r
+ <expected>AlarmManager method add: add relative alarm succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_attri_delay_02" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with period"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative attribute when create with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative attribute return correct value when\r
+ create succeed with with delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_getAll" priority="P1"\r
+ purpose="check AlarmManager method getAll: default check" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method getAll: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method getAll: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_attri_date_03" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with date"\r
+ status="approved" type="compliance" result="Blocked">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute attribute when create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute attribute return correct value when\r
+ create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=3\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1"\r
+ purpose="check AlarmAbsolute method getNextScheduledDate when create with date"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute method getNextScheduledDate when\r
+ create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute method getNextScheduledDate return\r
+ correct value when create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_constructor_date" priority="P1"\r
+ purpose="check AlarmAbsolute create constructor with date" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute create constructor with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute create succeed with constructor with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1"\r
+ purpose="check AlarmRelative method getNextScheduleddelay when create with delay"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative method getNextScheduleddelay when\r
+ create with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative method getNextScheduleddelay return\r
+ correct value when create succeed with with delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_attri_delay_01" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with period"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative attribute when create with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative attribute return correct value when\r
+ create succeed with with delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=1\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_add_abs" priority="P1"\r
+ purpose="check AlarmManager method add: add absolute alarm" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method add: add absolute alarm\r
+ </step_desc>\r
+ <expected>AlarmManager method add: add absolute alarm succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_attri_date_02" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with date"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute attribute when create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute attribute return correct value when\r
+ create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=2\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_removeAll" priority="P1"\r
+ purpose="check AlarmManager method removeAll: default check" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method removeAll: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method removeAll: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_remove" priority="P1"\r
+ purpose="check AlarmManager method remove: default check" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method remove: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method remove: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManagerObject_exist" priority="P1"\r
+ purpose="check AlarmManagerObject existance" status="approved" type="compliance"\r
+ result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManagerObject exist</step_desc>\r
+ <expected>AlarmManagerObject exist</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_const_check_01" priority="P1"\r
+ purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Check AlarmManager constants:</step_desc>\r
+ <expected>AlarmManager constants value is correct:</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=1\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>\r
+ <stdout>Can't find variable: tizen</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_const_check_02" priority="P1"\r
+ purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Check AlarmManager constants:</step_desc>\r
+ <expected>AlarmManager constants value is correct:</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=2\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>\r
+ <stdout>Can't find variable: tizen</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_const_check_03" priority="P1"\r
+ purpose="Check AlarmManager constants:PERIOD_DAY" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Check AlarmManager constants:</step_desc>\r
+ <expected>AlarmManager constants value is correct:</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=3\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>\r
+ <stdout>Can't find variable: tizen</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_const_check_04" priority="P1"\r
+ purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Check AlarmManager constants:</step_desc>\r
+ <expected>AlarmManager constants value is correct:</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=4\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>\r
+ <stdout>Can't find variable: tizen</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ </set>\r
+ <set name="Alarm">\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_constructor_delay" priority="P1"\r
+ purpose="check AlarmRelative attribute when create with delay"\r
+ status="approved" type="compliance" result="PASS">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative create constructor with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative create succeed with constructor with\r
+ delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>PASS</actual_result>\r
+ <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_get" priority="P1"\r
+ purpose="check AlarmManager method removeAll: without input attribute"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method get: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method get: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with date"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute attribute when create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute attribute return correct value when\r
+ create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_add_rel" priority="P1"\r
+ purpose="check AlarmManager method add: add relative alarm" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method add: add relative alarm\r
+ </step_desc>\r
+ <expected>AlarmManager method add: add relative alarm succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_attri_delay_02" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with period"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative attribute when create with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative attribute return correct value when\r
+ create succeed with with delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ </set>\r
+ </suite>\r
+ <suite name="webapi-tizen-alarm-tests1" type="">\r
+ <set name="Alarm4">\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_constructor_delay" priority="P1"\r
+ purpose="check AlarmRelative attribute when create with delay"\r
+ status="approved" type="compliance" result="PASS">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative create constructor with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative create succeed with constructor with\r
+ delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>PASS</actual_result>\r
+ <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_get" priority="P1"\r
+ purpose="check AlarmManager method removeAll: without input attribute"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method get: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method get: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with date"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute attribute when create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute attribute return correct value when\r
+ create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_add_rel" priority="P1"\r
+ purpose="check AlarmManager method add: add relative alarm" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method add: add relative alarm\r
+ </step_desc>\r
+ <expected>AlarmManager method add: add relative alarm succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_attri_delay_02" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with period"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative attribute when create with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative attribute return correct value when\r
+ create succeed with with delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_getAll" priority="P1"\r
+ purpose="check AlarmManager method getAll: default check" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method getAll: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method getAll: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_attri_date_03" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with date"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute attribute when create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute attribute return correct value when\r
+ create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=3\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1"\r
+ purpose="check AlarmAbsolute method getNextScheduledDate when create with date"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute method getNextScheduledDate when\r
+ create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute method getNextScheduledDate return\r
+ correct value when create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_constructor_date" priority="P1"\r
+ purpose="check AlarmAbsolute create constructor with date" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute create constructor with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute create succeed with constructor with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1"\r
+ purpose="check AlarmRelative method getNextScheduleddelay when create with delay"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative method getNextScheduleddelay when\r
+ create with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative method getNextScheduleddelay return\r
+ correct value when create succeed with with delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_attri_delay_01" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with period"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative attribute when create with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative attribute return correct value when\r
+ create succeed with with delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=1\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_add_abs" priority="P1"\r
+ purpose="check AlarmManager method add: add absolute alarm" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method add: add absolute alarm\r
+ </step_desc>\r
+ <expected>AlarmManager method add: add absolute alarm succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_attri_date_02" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with date"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute attribute when create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute attribute return correct value when\r
+ create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=2\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_removeAll" priority="P1"\r
+ purpose="check AlarmManager method removeAll: default check" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method removeAll: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method removeAll: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_remove" priority="P1"\r
+ purpose="check AlarmManager method remove: default check" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method remove: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method remove: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManagerObject_exist" priority="P1"\r
+ purpose="check AlarmManagerObject existance" status="approved" type="compliance"\r
+ result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManagerObject exist</step_desc>\r
+ <expected>AlarmManagerObject exist</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_const_check_01" priority="P1"\r
+ purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Check AlarmManager constants:</step_desc>\r
+ <expected>AlarmManager constants value is correct:</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=1\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>\r
+ <stdout>Can't find variable: tizen</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_const_check_02" priority="P1"\r
+ purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Check AlarmManager constants:</step_desc>\r
+ <expected>AlarmManager constants value is correct:</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=2\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>\r
+ <stdout>Can't find variable: tizen</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_const_check_03" priority="P1"\r
+ purpose="Check AlarmManager constants:PERIOD_DAY" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Check AlarmManager constants:</step_desc>\r
+ <expected>AlarmManager constants value is correct:</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=3\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>\r
+ <stdout>Can't find variable: tizen</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_const_check_04" priority="P1"\r
+ purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Check AlarmManager constants:</step_desc>\r
+ <expected>AlarmManager constants value is correct:</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=4\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>\r
+ <stdout>Can't find variable: tizen</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ </set>\r
+ <set name="Alarm3">\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_constructor_delay" priority="P1"\r
+ purpose="check AlarmRelative attribute when create with delay"\r
+ status="approved" type="compliance" result="PASS">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative create constructor with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative create succeed with constructor with\r
+ delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>PASS</actual_result>\r
+ <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_get" priority="P1"\r
+ purpose="check AlarmManager method removeAll: without input attribute"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method get: default check\r
+ </step_desc>\r
+ <expected>AlarmManager method get: default check succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmAbsolute_attri_date_01" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with date"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmAbsolute attribute when create with date\r
+ </step_desc>\r
+ <expected>AlarmAbsolute attribute return correct value when\r
+ create with date\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmManager_add_rel" priority="P1"\r
+ purpose="check AlarmManager method add: add relative alarm" status="approved"\r
+ type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmManager method add: add relative alarm\r
+ </step_desc>\r
+ <expected>AlarmManager method add: add relative alarm succeed\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>\r
+ <stdout>Test time out</stdout>\r
+ </result_info>\r
+ </testcase>\r
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto"\r
+ id="Alarm_AlarmRelative_attri_delay_02" priority="P1"\r
+ purpose="check AlarmAbsolute attribute when create with period"\r
+ status="approved" type="compliance" result="FAIL">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>check AlarmRelative attribute when create with delay\r
+ </step_desc>\r
+ <expected>AlarmRelative attribute return correct value when\r
+ create succeed with with delay\r
+ </expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2\r
+ </test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ <result_info>\r
+ <actual_result>FAIL</actual_result>\r
+ <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>\r
+ <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>\r
+ <stdout />\r
+ </result_info>\r
+ </testcase>\r
+ </set>\r
+ </suite>\r
+</test_definition>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+
+ <xs:element name="suite">
+
+
+ <xs:complexType>
+
+ <xs:sequence minOccurs="1" maxOccurs="unbounded">
+ <xs:element ref="set" minOccurs="0" maxOccurs="unbounded"></xs:element>
+ </xs:sequence>
+
+ <xs:attributeGroup ref="set_attribute_group"></xs:attributeGroup>
+ <xs:attribute name="launcher" type="xs:string"></xs:attribute>
+ </xs:complexType>
+ <xs:unique name="uniqueSetName">
+ <xs:selector xpath=".//set" />
+ <xs:field xpath="@name" />
+ </xs:unique>
+ </xs:element>
+
+ <xs:element name="set">
+
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="capabilities" type="CapabilitiesType"
+ minOccurs="0" maxOccurs="1">
+ </xs:element>
+ <xs:sequence minOccurs="1" maxOccurs="unbounded">
+ <xs:element ref="testcase" minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
+ </xs:sequence>
+ </xs:sequence>
+
+
+
+ <xs:attributeGroup ref="set_attribute_group"></xs:attributeGroup>
+ <xs:attribute name="launcher" type="xs:string"></xs:attribute>
+ <xs:attribute name="set_debug_msg" type="xs:string"></xs:attribute>
+ </xs:complexType>
+ <xs:unique name="uniqueCaseName">
+ <xs:selector xpath=".//testcase" />
+ <xs:field xpath="@id" />
+ </xs:unique>
+ </xs:element>
+
+ <xs:element name="testcase">
+ <xs:complexType>
+ <xs:sequence minOccurs="1">
+ <xs:element ref="description"></xs:element>
+ <xs:element name="categories" type="categories"
+ minOccurs="0" maxOccurs="1">
+ </xs:element>
+ <xs:element name="measurement" type="measurementType"
+ minOccurs="0" maxOccurs="unbounded">
+ </xs:element>
+ <xs:element name="series" type="seriesType" minOccurs="0"
+ maxOccurs="unbounded">
+ </xs:element>
+ <xs:element name="specs" type="specsType" minOccurs="0"
+ maxOccurs="1">
+ </xs:element>
+ <xs:element name="result_info" type="result_info_type"
+ minOccurs="0">
+ </xs:element>
+ </xs:sequence>
+
+ <xs:attributeGroup ref="case_attribute_group"></xs:attributeGroup>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="steps">
+ <xs:complexType>
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="step"></xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:unique name="uniqueStepName">
+ <xs:selector xpath=".//step" />
+ <xs:field xpath="@order" />
+ </xs:unique>
+ </xs:element>
+
+ <xs:attributeGroup name="set_attribute_group">
+
+ <xs:attribute name="name" type="xs:anyURI" use="required"></xs:attribute>
+ <xs:attribute name="type" type="xs:string"></xs:attribute>
+ </xs:attributeGroup>
+
+ <xs:attributeGroup name="case_attribute_group">
+
+ <xs:attribute name="id" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"></xs:minLength>
+ <xs:whiteSpace value="collapse"></xs:whiteSpace>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="priority" type="priority_simple_type"
+ use="required">
+ </xs:attribute>
+
+ <xs:attribute name="execution_type" type="execution_type_simple_type"
+ use="required">
+ </xs:attribute>
+
+ <xs:attribute name="component" type="xs:string"></xs:attribute>
+
+ <xs:attribute name="requirement_ref" type="xs:anyURI"
+ use="optional">
+ </xs:attribute>
+
+ <xs:attribute name="status" type="status_type" use="required"></xs:attribute>
+
+ <xs:attribute name="type" type="case_type_type" use="required">
+ </xs:attribute>
+ <xs:attribute name="purpose" type="xs:string"></xs:attribute>
+ <xs:attribute name="result" type="xs:string"></xs:attribute>
+ <xs:attribute name="onload_delay" type="xs:int" use="optional"
+ default="3">
+ </xs:attribute>
+ </xs:attributeGroup>
+
+ <xs:simpleType name="priority_simple_type">
+ <xs:restriction base="xs:string">
+
+ <xs:enumeration value="P0"></xs:enumeration>
+
+ <xs:enumeration value="P1"></xs:enumeration>
+
+ <xs:enumeration value="P2"></xs:enumeration>
+
+ <xs:enumeration value="P3"></xs:enumeration>
+
+ <xs:enumeration value="P4"></xs:enumeration>
+
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="execution_type_simple_type">
+ <xs:restriction base="xs:string">
+
+ <xs:enumeration value="auto"></xs:enumeration>
+
+ <xs:enumeration value="manual"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="status_type">
+ <xs:restriction base="xs:string">
+
+ <xs:enumeration value="designed"></xs:enumeration>
+
+ <xs:enumeration value="ready"></xs:enumeration>
+
+ <xs:enumeration value="approved"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="case_type_type">
+ <xs:restriction base="xs:string">
+
+ <xs:enumeration value="functional_positive"></xs:enumeration>
+
+ <xs:enumeration value="functional_negative"></xs:enumeration>
+
+ <xs:enumeration value="security"></xs:enumeration>
+
+ <xs:enumeration value="performance"></xs:enumeration>
+
+ <xs:enumeration value="reliability"></xs:enumeration>
+
+ <xs:enumeration value="portability"></xs:enumeration>
+
+ <xs:enumeration value="maintainability"></xs:enumeration>
+
+ <xs:enumeration value="compliance"></xs:enumeration>
+
+ <xs:enumeration value="user_experience"></xs:enumeration>
+
+ <xs:enumeration value="undefined"></xs:enumeration>
+ </xs:restriction>
+ </xs:simpleType>
+
+
+ <xs:element name="purpose" type="xs:anySimpleType"></xs:element>
+
+ <xs:element name="notes" type="xs:string"></xs:element>
+
+ <xs:element name="pre_condition" type="xs:string"></xs:element>
+
+ <xs:element name="post_condition" type="xs:string"></xs:element>
+
+ <xs:element name="description">
+
+ <xs:complexType>
+
+ <xs:sequence minOccurs="1" maxOccurs="unbounded">
+
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element ref="notes"></xs:element>
+ </xs:choice>
+
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element ref="pre_condition"></xs:element>
+ </xs:choice>
+
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element ref="post_condition"></xs:element>
+ </xs:choice>
+
+ <xs:element ref="steps" minOccurs="1" maxOccurs="1"></xs:element>
+
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element ref="test_script_entry"></xs:element>
+ </xs:choice>
+
+
+ </xs:sequence>
+
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="step">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="step_desc" type="xs:string"></xs:element>
+ <xs:element name="expected" type="xs:string"></xs:element>
+ </xs:sequence>
+ <xs:attribute name="order" type="xs:int"></xs:attribute>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="test_script_entry">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="test_script_expected_result" type="xs:string"
+ default="0">
+ </xs:attribute>
+ <xs:attribute name="timeout" type="xs:int" default="90">
+ </xs:attribute>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:complexType name="result_info_type">
+ <xs:sequence minOccurs="0">
+ <xs:element name="actual_result" type="xs:string"></xs:element>
+ <xs:element name="start" type="xs:string"></xs:element>
+ <xs:element name="end" type="xs:string"></xs:element>
+ <xs:element name="stdout" type="xs:string" minOccurs="0"></xs:element>
+ <xs:element name="stderr" type="xs:string" minOccurs="0"></xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="measurementType">
+ <xs:attribute name="name" type="xs:string"></xs:attribute>
+ <xs:attribute name="value" type="xs:string"></xs:attribute>
+ <xs:attribute name="unit" type="xs:string"></xs:attribute>
+ <xs:attribute name="target" type="xs:string"></xs:attribute>
+ <xs:attribute name="failure" type="xs:string"></xs:attribute>
+ <xs:attribute name="power" type="xs:string"></xs:attribute>
+ </xs:complexType>
+
+ <xs:complexType name="seriesType">
+ <xs:sequence>
+ <xs:element name="measurement" type="simpleMeasurementType"
+ minOccurs="1" maxOccurs="unbounded"></xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string"></xs:attribute>
+ <xs:attribute name="group" type="xs:string"></xs:attribute>
+ <xs:attribute name="unit" type="xs:string"></xs:attribute>
+ <xs:attribute name="interval" type="xs:string"></xs:attribute>
+ <xs:attribute name="interval_unit" type="xs:string"></xs:attribute>
+ <xs:attribute name="power" type="xs:string"></xs:attribute>
+ </xs:complexType>
+
+ <xs:complexType name="simpleMeasurementType">
+ <xs:attribute name="value" type="xs:string"></xs:attribute>
+ <xs:attribute name="file" type="xs:string"></xs:attribute>
+ </xs:complexType>
+
+
+ <xs:complexType name="categories">
+ <xs:sequence>
+ <xs:element name="category" type="xs:string" maxOccurs="unbounded"
+ minOccurs="0"></xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:element name="test_definition">
+ <xs:complexType>
+ <xs:sequence minOccurs="1" maxOccurs="unbounded">
+ <xs:element name="environment" type="BuildInfoType"
+ minOccurs="0">
+ </xs:element>
+ <xs:element name="summary" type="summaryType" minOccurs="0">
+ </xs:element>
+ <xs:element ref="suite" minOccurs="1" maxOccurs="unbounded">
+ </xs:element>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:unique name="uniqueSuiteName">
+ <xs:selector xpath=".//suite" />
+ <xs:field xpath="@name" />
+ </xs:unique>
+ </xs:element>
+
+
+
+ <xs:complexType name="BuildInfoType">
+ <xs:sequence>
+ <xs:element name="other" type="xs:string"></xs:element>
+ </xs:sequence>
+ <xs:attribute name="device_name" type="xs:string"></xs:attribute>
+ <xs:attribute name="device_model" type="xs:string"></xs:attribute>
+ <xs:attribute name="os_version" type="xs:string"></xs:attribute>
+ <xs:attribute name="device_id" type="xs:string"></xs:attribute>
+ <xs:attribute name="firmware_version" type="xs:string"></xs:attribute>
+ <xs:attribute name="screen_size" type="xs:string"></xs:attribute>
+ <xs:attribute name="resolution" type="xs:string"></xs:attribute>
+ <xs:attribute name="host" type="xs:string"></xs:attribute>
+ <xs:attribute name="cts_version" type="xs:string"></xs:attribute>
+ <xs:attribute name="build_id" type="xs:string"></xs:attribute>
+ </xs:complexType>
+
+
+ <xs:complexType name="summaryType">
+ <xs:sequence>
+ <xs:element name="start_at" type="xs:string"></xs:element>
+ <xs:element name="end_at" type="xs:string"></xs:element>
+ </xs:sequence>
+ <xs:attribute name="test_plan_name" type="xs:string"></xs:attribute>
+ </xs:complexType>
+
+
+ <xs:complexType name="specsType">
+ <xs:sequence>
+ <xs:element name="spec" type="specType" maxOccurs="unbounded"></xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="specType">
+ <xs:sequence>
+ <xs:element name="spec_assertion" type="spec_assertionType"></xs:element>
+ <xs:element name="spec_url" type="xs:string"></xs:element>
+ <xs:element name="spec_statement" type="xs:string"></xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="spec_assertionType">
+ <xs:attribute name="category" type="xs:string" use="required"></xs:attribute>
+ <xs:attribute name="section" type="xs:string" use="required"></xs:attribute>
+ <xs:attribute name="specification" type="xs:string" use="required">
+ </xs:attribute>
+ <xs:attribute name="interface" type="xs:string" use="required">
+ </xs:attribute>
+ <xs:attribute name="element_name" type="xs:string" use="optional">
+ </xs:attribute>
+ <xs:attribute name="usage" type="xs:boolean" default="false"></xs:attribute>
+ <xs:attribute name="element_type" type="xs:string"></xs:attribute>
+ </xs:complexType>
+
+ <xs:complexType name="CapabilitiesType">
+ <xs:sequence>
+ <xs:element name="capability" type="CapabilityType"
+ minOccurs="1" maxOccurs="unbounded"></xs:element>
+ </xs:sequence>
+ </xs:complexType>
+
+ <xs:complexType name="CapabilityType">
+ <xs:sequence minOccurs="0">
+ <xs:element name="value" type="xs:string"></xs:element>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required"></xs:attribute>
+ </xs:complexType>
+</xs:schema>
+
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="jquery.min.js" />
+ </head>
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>Test Cases</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="suites">
+ <a name="contents"></a>
+ <table>
+ <tr>
+ <th>Test Suite</th>
+ <th>Total</th>
+ <th>Auto</th>
+ <th>Manual</th>
+ </tr>
+ <tr>
+ <td>
+ Total
+ </td>
+ <td>
+ <xsl:value-of select="count(test_definition/suite/set//testcase)" />
+ </td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])" />
+ </td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])" />
+ </td>
+ </tr>
+ <xsl:for-each select="test_definition/suite">
+ <tr>
+ <td>
+ <a>
+ <xsl:attribute name="href">
+ #<xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase)" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])" />
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Detailed Test Cases</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="cases">
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <div id="btc">
+ <a href="#contents">Back to Contents</a>
+ </div>
+ <div id="suite_title">
+ Test Suite:
+ <xsl:value-of select="@name" />
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Type</th>
+ <th>Component</th>
+ <th>Execution Type</th>
+ <th>Description</th>
+ <th>Specification</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name" />
+ <tr>
+ <td colspan="7">
+ Test Set:
+ <xsl:value-of select="@name" />
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <!-- xsl:sort select="@id" /> -->
+ <tr>
+ <td>
+ <xsl:value-of select="@id" />
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+ <td>
+ <xsl:value-of select="@type" />
+ </td>
+ <td>
+ <xsl:value-of select="@component" />
+ </td>
+ <td>
+ <xsl:value-of select="@execution_type" />
+ </td>
+ <td>
+ <p>
+ Pre_condition:
+ <xsl:value-of select=".//description/pre_condition" />
+ </p>
+ <p>
+ Post_condition:
+ <xsl:value-of select=".//description/post_condition" />
+ </p>
+ <p>
+ Test Script Entry:
+ <xsl:value-of select=".//description/test_script_entry" />
+ </p>
+ <p>
+ Steps:
+ <p />
+ <xsl:for-each select=".//description/steps/step">
+ <xsl:sort select="@order" />
+ Step
+ <xsl:value-of select="@order" />
+ :
+ <xsl:value-of select="./step_desc" />
+ ;
+ <p />
+ Expected Result:
+ <xsl:value-of select="./expected" />
+ <p />
+ </xsl:for-each>
+ </p>
+ </td>
+ <td>
+ <xsl:for-each select=".//specs/spec">
+ <b>[Spec_Assertion]:</b>
+ <br />
+ [Category]:
+ <xsl:value-of select="./spec_assertion/@category" />
+ <br />
+ [Section]:
+ <xsl:value-of select="./spec_assertion/@section" />
+ <br />
+ [Specification]:
+ <xsl:value-of select="./spec_assertion/@specification" />
+ <br />
+ [Interface]:
+ <xsl:value-of select="./spec_assertion/@interface" />
+ <br />
+ <xsl:choose>
+ <xsl:when test="./spec_assertion/@element_name">
+ [<xsl:value-of select="./spec_assertion/@element_type" />]:
+ <xsl:value-of select="./spec_assertion/@element_name" />
+ <br />
+ </xsl:when>
+ </xsl:choose>
+
+ [URL]:
+ <xsl:value-of select="./spec_url" />
+ <br />
+ [Statement]:
+ <xsl:value-of select="./spec_statement" />
+ <br />
+ </xsl:for-each>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./back_top.png" />
+ </div>
+ <script type="text/javascript" src="application.js" />
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet version="1.0"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+ <xsl:output method="html" version="1.0" encoding="UTF-8"
+ indent="yes" />
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="jquery.min.js" />
+ </head>
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>Test Report</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="device">
+ <table>
+ <tr>
+ <th colspan="2">Device Information</th>
+ </tr>
+ <tr>
+ <td>Device Name</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@device_name">
+ <xsl:if test="test_definition/environment/@device_name = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@device_name" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device Model</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@device_model">
+ <xsl:if test="test_definition/environment/@device_model = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@device_model" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>OS Version</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@os_version">
+ <xsl:if test="test_definition/environment/@os_version = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@os_version" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@device_id">
+ <xsl:if test="test_definition/environment/@device_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@device_id" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Firmware Version</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@firmware_version">
+ <xsl:if test="test_definition/environment/@firmware_version = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@firmware_version" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Build ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@build_id">
+ <xsl:if test="test_definition/environment/@build_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@build_id" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Screen Size</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@screen_size">
+ <xsl:if test="test_definition/environment/@screen_size = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@screen_size" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Resolution</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@resolution">
+ <xsl:if test="test_definition/environment/@resolution = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@resolution" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Host Info</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@host">
+ <xsl:if test="test_definition/environment/@host = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@host" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>CTS Version</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@cts_version">
+ <xsl:if test="test_definition/environment/@cts_version = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@cts_version" />
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Others</td>
+ <td>
+ <xsl:if test="test_definition/environment/other = ''">
+ N/A
+ </xsl:if>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word"
+ select="test_definition/environment/other" />
+ </xsl:call-template>
+ </td>
+ </tr>
+ </table>
+ </div>
+
+ <div id="summary">
+ <table>
+ <tr>
+ <th colspan="2">Test Summary</th>
+ </tr>
+ <tr>
+ <td>Test Plan Name</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/@test_plan_name" />
+ </td>
+ </tr>
+ <tr>
+ <td>Tests Total</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase)" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Passed</td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition//suite/set/testcase[@result = 'PASS'])" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Failed</td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition//suite/set/testcase[@result = 'FAIL'])" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Block</td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
+ </td>
+ </tr>
+ <tr>
+ <td>Test Not Run</td>
+ <td>
+ <xsl:value-of
+ select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])" />
+ </td>
+ </tr>
+ <tr>
+ <td>Start time</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/start_at" />
+ </td>
+ </tr>
+ <tr>
+ <td>End time</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/end_at" />
+ </td>
+ </tr>
+ </table>
+ </div>
+
+
+ <div id="suite_summary">
+ <div id="title">
+ <a name="contents"></a>
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Test Summary by Suite</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Run</th>
+ <th>Total</th>
+ </tr>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <tr>
+ <td>
+ <a>
+ <xsl:attribute name="href">
+ #<xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ <xsl:value-of select="@name" />
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'PASS'])" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'FAIL'])" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])" />
+ </td>
+ <td>
+ <xsl:value-of
+ select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])" />
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase)" />
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+
+ <div id="fail_cases">
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">
+ Test Failures (
+ <xsl:value-of
+ select="count(test_definition/suite/set//testcase[@result = 'FAIL'])" />
+ )
+ </h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <div id="btc">
+ <a href="#contents">Back to Contents</a>
+ </div>
+ <div id="suite_title">
+ Test Suite:
+ <xsl:value-of select="@name" />
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name" />
+ <tr>
+ <td colspan="4">
+ Test Set:
+ <xsl:value-of select="@name" />
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <xsl:sort select="@id" />
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+
+ <tr>
+ <td>
+ <xsl:value-of select="@id" />
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+
+ <td class="red_rate">
+ <xsl:value-of select="@result" />
+ </td>
+
+ <td>
+ <xsl:value-of select=".//result_info/stdout" />
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+
+ <div id="cases">
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">Detailed Test Results</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name" />
+ <div id="btc">
+ <a href="#contents">Back to Contents</a>
+ </div>
+ <div id="suite_title">
+ Test Suite:
+ <xsl:value-of select="@name" />
+ <a>
+ <xsl:attribute name="name">
+ <xsl:value-of
+ select="@name" />
+ </xsl:attribute>
+ </a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name" />
+ <tr>
+ <td colspan="4">
+ Test Set:
+ <xsl:value-of select="@name" />
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <xsl:sort select="@id" />
+ <tr>
+ <td>
+ <xsl:value-of select="@id" />
+ </td>
+ <td>
+ <xsl:value-of select="@purpose" />
+ </td>
+
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+ <td class="red_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'PASS'">
+ <td class="green_rate">
+ <xsl:value-of select="@result" />
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'BLOCK' ">
+ <td>
+ BLOCK
+ </td>
+ </xsl:if>
+ <xsl:if test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
+ <td>
+ Not Run
+ </td>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>
+
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:value-of select=".//result_info/stdout" />
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./back_top.png" />
+ </div>
+ <script type="text/javascript" src="application.js" />
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word" />
+ <xsl:variable name="cr">
+ <xsl:text>
+</xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)" />
+ <br />
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)" />
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word" />
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+@charset "UTF-8";\r
+/* CSS Document */\r
+#testcasepage div,#testcasepage h1,#testcasepage p,#testcasepage table,#testcasepage tr,#testcasepage th,#testcasepage td\r
+ {\r
+ margin: 0;\r
+ padding: 0;\r
+ border: 0;\r
+ font-weight: inherit;\r
+ font-style: inherit;\r
+ font-size: 0.96em;\r
+ font-family: arial;\r
+ vertical-align: baseline;\r
+}\r
+\r
+#testcasepage p {\r
+ text-align: left;\r
+}\r
+\r
+#suite_title {\r
+ text-align: left;\r
+}\r
+\r
+#btc {\r
+ text-align: right;\r
+}\r
+\r
+#testcasepage table {\r
+ border-collapse: separate;\r
+ border-spacing: 0;\r
+ margin-bottom: 1.4em;\r
+ vertical-align: middle;\r
+}\r
+\r
+#testcasepage th,#testcasepage td {\r
+ text-align: left;\r
+ font-weight: normal;\r
+ padding: 4px 10px 4px 5px;\r
+ vertical-align: middle;\r
+}\r
+\r
+#cases table {\r
+ width: 101%;\r
+}\r
+\r
+#fail_cases table {\r
+ width: 101%;\r
+}\r
+\r
+#title table {\r
+ width: 101%;\r
+}\r
+\r
+#device table {\r
+ width: 50%;\r
+}\r
+\r
+#summary table {\r
+ width: 50%;\r
+}\r
+\r
+#testcasepage th {\r
+ border-bottom: 1px solid #000;\r
+ background-color: #AAAAAA;\r
+ border-left: 1px solid #000;\r
+ border-top: 1px solid #000;\r
+ color: #000;\r
+ font-weight: bold;\r
+ vertical-align: bottom;\r
+}\r
+\r
+#testcasepage th:last-child,#testcasepage td:last-child {\r
+ border-right: 1px solid #000;\r
+}\r
+\r
+#testcasepage td {\r
+ border-left: 1px solid;\r
+ font-weight: normal;\r
+ border-bottom: 1px solid;\r
+}\r
+\r
+#testcasepage td.yellow_rate {\r
+ background-color: #ffcc00;\r
+}\r
+\r
+#testcasepage td.green_rate {\r
+ background-color: #33cc33;\r
+}\r
+\r
+#testcasepage td.dgreen_rate {\r
+ background-color: #339933;\r
+}\r
+\r
+#testcasepage td.red_rate {\r
+ background-color: #FF3333;\r
+}\r
+\r
+#title table,#title tr,#title td {\r
+ border-left: none;\r
+ border-bottom: none;\r
+ text-align: center;\r
+}\r
+\r
+#title td:last-child {\r
+ border-right: none;\r
+}\r
+\r
+#testcasepage h1 {\r
+ font-size: 2em;\r
+ font-family: Arial, sans-serif;\r
+ font-weight: bold;\r
+ line-height: 1;\r
+ color: #000;\r
+ margin-bottom: 0.75em;\r
+ padding-top: 0.25em;\r
+ font-weight: bold;\r
+}\r
+\r
+#goTopBtn {\r
+ right: 0px;\r
+ bottom: 0px;\r
+ position: fixed; +position: absolute;\r
+ top: expression(parseInt(document.body.scrollTop)+document.body.clientHeight-40);\r
+}
\ No newline at end of file
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?xml-stylesheet type="text/xsl" href="testcase.xsl"?>\r
+<test_definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+ xsi:noNamespaceSchemaLocation="test_definition.xsd">\r
+ <suite name="webapi-w3c-widget-tests">\r
+ <set name="WidgetPackaging">\r
+ <testcase\r
+ purpose="Tests the user agent's ability to process files with no file extension. "\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="auto" priority="P3" id="dm">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</step_desc>\r
+ <expected> \r
+ To pass, the user agent start file of the widget must be index.htm</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Tizen" specification="Tizen Packaging and XML Configuration"\r
+ interface="Tizen" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests the user agent's ability to process files with a file extension other than .wgt."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="dn">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</step_desc>\r
+ <expected> \r
+ To pass, the user agent start file of the widget must be index.htm</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" usage="true" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase purpose="Test the ability of the UA to verify a zip archive."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="do">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</step_desc>\r
+ <expected> \r
+ To pass, the user agent must treat this as an invalid widget (archive is spanned).</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test the user agent's ability to get a widget over HTTP and respect the application/widget mimetype. The server from which this test is served from has been set up to label the 'test' resource as an 'application/widget'."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="z3">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</step_desc>\r
+ <expected> \r
+ To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only because of sniffing).</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test the user agent's ability to get a widget over HTTP and respect the 'application/widget' mimetype. The server from which this test is served from has been set up to label the 'test.html' resource as an 'application/widget'."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="z4">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</step_desc>\r
+ <expected> \r
+ To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only via sniffing).</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that an empty defaultlocale attribute is ignored (and does not cause the widget to be treated as invalid)."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="dlocignore00">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</step_desc>\r
+ <expected> \r
+ To pass, the widget must simply run..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that the user agent applies rule for getting a single attribute value to the defaultlocale attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="dlocignore01">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</step_desc>\r
+ <expected> To pass, the name of the widget must be the value PASS..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that the user agent matches obscure, yet valid, language tags."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="dlocignore02">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</step_desc>\r
+ <expected> To pass, the widgets description must be the value PASS..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that a language tag already part of the UA's locales list is ignored when it is repeated for defaultlocale attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="dlocignore03">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</step_desc>\r
+ <expected> \r
+ To pass, the specified value should not be added twice to the locales list of the UA..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that the default locale is added to the end of the user agent's locale list \r
+ (and does not override the default language, which is assumed to be 'en')."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="dlocignore04">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</step_desc>\r
+ <expected> \r
+ To pass, the name of the widget must be PASS..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that the value of defaultlocale is also used to in folder-based localization."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="dlocuse00">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</step_desc>\r
+ <expected>\r
+ To pass, the index.html of the folder 'locales/esx-al/' should be loaded and say PASS..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that the value of defaultlocale works in conjunction to xml:lang on the widget element."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="dlocuse01">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</step_desc>\r
+ <expected>\r
+ To pass, the name of the widget must be PASS..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that the UA rejects configuration documents that don't have\r
+ correct widget element at the root."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="aa">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</step_desc>\r
+ <expected> To pass, the UA must treat this as an\r
+ invalid widget (the root element is not widget)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that the UA rejects configuration documents that don't have correct\r
+ widget element at the root."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ab">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</step_desc>\r
+ <expected> To pass, the UA must treat this as an invalid widget (the namespace is wrong)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that the UA rejects configuration documents that don't have correct widget\r
+ element at the root."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ac">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</step_desc>\r
+ <expected>To pass, the UA must treat this as an invalid widget (the namespace is missing)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly processes a author element."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="af">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</step_desc>\r
+ <expected>\r
+ To pass, the author name must be the string "PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ag">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget author must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ah">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</step_desc>\r
+ <expected>\r
+ To pass, the author name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at start/end trimmed)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the rule for getting a single attribute value."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ai">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</step_desc>\r
+ <expected>\r
+ To pass, the author email must be the string "PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="aj">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</step_desc>\r
+ <expected>\r
+ To pass, the author name must be the string "PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ak">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</step_desc>\r
+ <expected>\r
+ To pass, the author name must be the string "PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test the ability of the user agent to handle an empty author element."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="al">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</step_desc>\r
+ <expected>\r
+ To pass, the author name must be an empty string..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test the ability of the user agent to correctly process the author href attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="am">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</step_desc>\r
+ <expected>\r
+ To pass, the value of author href must be "PASS:PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test the ability of the user agent to correctly process the author href attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="an">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</step_desc>\r
+ <expected>\r
+ To pass, the value of author href must be ignored..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly processes a name element."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ao">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget name must be the string "PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ap">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget name must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="aq">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at front/back trimmed)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the rule for getting a single attribute value."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ar">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget short name must be the string "PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the rule for getting a single attribute value and\r
+ the Rule for Getting Text Content with Normalized White Space."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="as">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly applies the rule for getting a single attribute value and\r
+ the Rule for Getting Text Content with Normalized White Space."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="at">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly processes the short attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="au">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget short name must be an empty string..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test the ability of the user agent to handle an empty name element."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="av">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget name must be an empty string..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that a user agent correctly processes a name element with xml:lang attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="oa">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget name must be the string "PASS"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that the user agent does not attempt to load a default start file when a custom start file has been declared."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="aw">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget start file must point to "pass.html" and the icons list must contain a pointer to "icon.png" at the root of the widget..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase purpose="Test the UA's ability process the height attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ax">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget height must be either the numeric value 123 or a value greater than 0..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase purpose="Test the UA's ability process the height attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ay">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</step_desc>\r
+ <expected>\r
+ To pass, the user agent must ignore the value of the height attribute (the value is composed of characters)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase purpose="Test the UA's ability process the height attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="az">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget height must be the numeric value 100 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase purpose="Test the UA's ability process the height attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="a1">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget height must be the numeric value 123 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase purpose="Test the UA's ability process the height attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="a2">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget height must be ignored (the value is an empty string, hence it would be ignored)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase purpose="Test the UA's ability process the height attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="a3">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget height must be ignored (the value is a sequence of space characters, hence it would be ignored)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase purpose="Test the UA's ability process the height attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="a4">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</step_desc>\r
+ <expected>\r
+ To pass, the widget height must be ignored (the value is an empty string)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that the UA skips preference elements without a name attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="a5">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</step_desc>\r
+ <expected>\r
+ To pass, widget preferences must remain an empty list (i.e., the preference is skipped)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that the UA skips preference element already defined."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="a6">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</step_desc>\r
+ <expected>\r
+ To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="a7">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</step_desc>\r
+ <expected>\r
+ To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="a8">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</step_desc>\r
+ <expected>\r
+ To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "true"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that the UA sets the readonly attribute to false by default."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="a9">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</step_desc>\r
+ <expected>\r
+ To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test that the UA skips multiple preference element already defined."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="ba">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</step_desc>\r
+ <expected>\r
+ To pass, widget preference must contain one preference whose name is "a" and whose value is "a" and whose readonly attr value must be "false"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test the UA's ability store preferences whose name vary only in case."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="bb">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</step_desc>\r
+ <expected>\r
+ To pass, widget preference must contain two preferences: 1 must have a name "a" and whose value is "a" and whose readonly attr value must be "false". 2 must have a name "A" and whose value is "b" and whose readonly attribute value must be "false"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Tests that the UA applies the rule for getting a single attribute value to name, value, and readonly attributes."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="bc">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</step_desc>\r
+ <expected>\r
+ To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in an arbitrary folder."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="bg">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</step_desc>\r
+ <expected>\r
+ To pass, the user agent must treat this widget as an invalid widget (config file is not at the root)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ <testcase\r
+ purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in a locale folder."\r
+ type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging"\r
+ execution_type="manual" priority="P3" id="bh">\r
+ <description>\r
+ <pre_condition />\r
+ <post_condition />\r
+ <steps>\r
+ <step order="1">\r
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</step_desc>\r
+ <expected>\r
+ To pass, the user agent must treat this widget as an invalid widget (config file is not at the root, but in locale folder)..</expected>\r
+ </step>\r
+ </steps>\r
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</test_script_entry>\r
+ </description>\r
+ <specs>\r
+ <spec>\r
+ <spec_assertion category="Tizen Device API Specifications"\r
+ section="Widget" specification="Widget Packaging and XML Configuration"\r
+ interface="Widget" element_name="constructor" element_type="method" />\r
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>\r
+ <spec_statement>spec_statement</spec_statement>\r
+ </spec>\r
+ </specs>\r
+ </testcase>\r
+ </set>\r
+ </suite>\r
+</test_definition>\r
--- /dev/null
+[LOGGING]
+log_level=INFO
+
+[EXTENSION]
+crosswalk=--external-extensions-path=/usr/lib/tizen-extensions-crosswalk
+
+[TIZEN]
+tizen_user=app
--- /dev/null
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+ Gnomovision version 69, Copyright (C) year name of author
+ Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+ `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+ <signature of Ty Coon>, 1 April 1989
+ Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
--- /dev/null
+## Dependency:
+
+1. python2.7
+2. python-setuptools python-support python-pip
+ 1. Ubuntu
+ `sudo apt-get install python-setuptools python-support python-pip`
+ 2. Fedora(RHEL)
+ `sudo yum install python-setuptools python-support python-pip`
+ 3. openSUSE(TIZEN)
+ `sudo zypper install python-setuptools python-support python-pip`
+3. python-requests(>=1.1)
+ `sudo pip install requests`
+
+## How to build Debian package:
+
+Host with Ubuntu OS recommended.
+
+Run the command below to build from source code and get Debian package:
+
+`dpkg-buildpackage`
+
+## How to build RPM package:
+
+Host with Fedora OS recommended.
+
+Run the command below to build from source code and get RPM package:
+
+```
+make -C packaging/
+rpmbuild -tb packaging/testkit-lite_<version>.tar.gz --nodeps
+```
+
+Host with Ubuntu OS, we need to add a workaround to support the RPM build:
+
+`rpmbuild --define 'python_sitelib /usr/lib/python2.7/site-packages' -tb packaging/testkit-lite_<version>.tar.gz --nodeps`
+
+## How to install:
+
+Install testkit lite from source code:
+
+`sudo python setup.py install --record /var/log/testkit-lite.files`
+
+Install testkit lite from debian build:
+
+`sudo dpkg -i ../testkit-lite_<version>_all.deb`
+
+## How to uninstall:
+
+Uninstall testkit-lite installed with `setup.py install`:
+
+`cat /var/log/testkit-lite.files | sudo xargs rm -rf`
+
+Uninstall testkit-lite installed with `debian`:
+
+`sudo dpkg -r testkit-lite`
+
+## How to use:
+
+1. You can run case on target:
+ 1. For web test cases:
+
+ `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>'`
+
+ 2. For native test cases:
+
+ `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"`
+
+2. You can run case in single mode :
+ 1. For web test cases:
+
+ `testkit-lite -f "<somewhere>/<package_name>/tests.xml" -e 'WRTLauncher <package_name>' --comm localhost`
+
+ 2. For native test cases:
+
+ `testkit-lite -f "<somewhere>/<package_name>/tests.xml" --comm localhost`
+
+3. You can select on parser engine to simply conduct one or more `tests.xml` on target:
+
+ `testkit-lite -f device:"<somewhere>/<package_name1>/tests.xml ... <somewhere>/<package_namen>/tests.xml" -e 'WRTLauncher <package_name1> ... <package_namen>'`
+
+4. If you want to execute both auto and manual tests:
+
+ `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml"`
+
+5. If you just want to execute manual tests:
+
+ `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -M`
+
+6. If you just want to execute auto tests:
+
+ `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -A`
+
+7. If you want to save test result to another file, by default it'll be under `/opt/testkit/lite/latest`:
+
+ `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" -o <somewhere>/xxx.xml`
+
+8. If you want to choose some filters:
+
+ `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --status level1 --type type1 ...`
+
+9. If you want to run test according capability:
+
+ `testkit-lite -f device:"<somewhere>/<package_name>/tests.xml" --capability capability.xml`
+
+10. At last, you can freely compose the above parameters together:
+
+ `testkit-lite -f <somewhere1>/tests.xml <somewhere2>/tests.xml -A --priority P1 --type type1 ...`
+
+## Get Results:
+
+Test report will be generated as tests.result.xml.The result will be under `/opt/testkit/lite/latest` after execution, you can also check the history results in `/opt/testkit/lite/yyyy-mm-dd-HH:MM:SS.NNNNNN`.
+
+## View Results:
+
+Test report can be viewed in HTML format, so the data in the xml result file looks more human friendly.
+
+Please follow the following steps to view test report:
+
+1. Copy files: `application.js back_top.png jquery.min.js testresult.xsl tests.css` under directory `/opt/testkit/lite/xsd/`
+2. Put the files from step 1) under the same directory as the xml result file
+3. Open xml result file with a web browser(IE, Chrome or Firefox)
+
+## Known Issues:
+
+N/A
--- /dev/null
+[public_version]
+version=TESTKIT2_3.0
+[internal_version]
+version=TESTKIT2_3.0.1-151106
--- /dev/null
+testkit-lite (3.1.12) unstable; urgency=low
+
+ * Public Release.
+
+ -- Shaofeng Tang <shaofeng.tang@intel.com> Fri, 21 Feb 2014 11:13:11 +0800
--- /dev/null
+Source: testkit-lite
+Section: utils
+Priority: standard
+Maintainer: Cathy Shen <cathy.shen@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
+Standards-Version: 3.9.3
+Homepage: https://github.com/testkit/testkit-lite
+#Vcs-Git: git://git.debian.org/collab-maint/testkit-manager.git
+#Vcs-Browser: http://git.debian.org/?p=collab-maint/testkit-manager.git;a=summary
+
+Package: testkit-lite
+Architecture: all
+Depends: ${misc:Depends}, ${python:Depends}, python-dbus, python-gobject, python-gtk2
+XB-Python-Version: ${python:Versions}
+Description: Test runner for test execution.
+
--- /dev/null
+Format: http://dep.debian.net/deps/dep5
+Source: https://github.com/testkit/testkit-lite
+
+Files: *
+Copyright: 2012-2013 Intel Corp.
+License: GPL-2.0
+
+Files: debian/*
+Copyright: 2012-2013 Intel Corp.
+License: GPL-2.0
+
+License: GPL-2.0
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License
+ .
+ This package is distributed in the hope that 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, see <http://www.gnu.org/licenses/>.
+ .
+ On Debian systems, the complete text of the GNU General
+ Public License version 3 can be found in "/usr/share/common-licenses/GPL-3".
+
--- /dev/null
+testkit-lite_3.1.12_all.deb utils standard
--- /dev/null
+#!/bin/sh
+
+# Set permissions
+mkdir -p /opt/testkit/lite3.0/test_packages
+chmod ugo+rwx -R /opt/testkit/lite3.0
+ln -fs /usr/share/pyshared/testkitlite /usr/lib/python2.7/dist-packages/testkitlite
+
--- /dev/null
+#!/usr/bin/make -f
+
+%:
+ dh $@
+
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitdocdir = /opt/testkit/lite3.0/doc
+dist_testkitdoc_DATA = testkit-lite_user_guide_for_tct.pdf
--- /dev/null
+PKG_NAME := testkit-lite
+SPECFILE = $(addsuffix .spec, $(PKG_NAME))
+PKG_VERSION := $(shell grep '^Version: ' $(SPECFILE)|awk '{print $$2}')
+
+TARBALL := $(PKG_NAME)_$(PKG_VERSION).tar.gz
+
+dsc: $(TARBALL)
+ $(eval MD5=$(shell md5sum $(TARBALL) | sed "s/ / $(shell stat -c '%s' $(TARBALL)) /"))
+ @sed -i 's/^Version:.*/Version: $(PKG_VERSION)/' $(PKG_NAME).dsc
+ @sed -i 's/ [a-f0-9]\+ [0-9]\+ $(PKG_NAME).*tar.*/ $(MD5)/' $(PKG_NAME).dsc
+
+$(TARBALL):
+ cd "$$(git rev-parse --show-toplevel)" \
+ && git archive --prefix $(PKG_NAME)-$(PKG_VERSION)/ HEAD \
+ | gzip > "$(CURDIR)/$(TARBALL)"
+
+clean:
+ rm -f $(PKG_NAME)*.tar.gz
+
+all: clean dsc
+
--- /dev/null
+Source: testkit-lite
+Section: utils
+Priority: standard
+Maintainer: Lei Yang <lei.a.yang@intel.com>
+Build-Depends: debhelper (>= 8.0.0), python-setuptools, python-support (>= 0.8.4)
+Standards-Version: 3.9.2
+Homepage: https://github.com/testkit/testkit-manager
+Version: 3.1.12
+Files:
+ e3b0bfd4442c7301aa9982201c6ebd3b 1398131 testkit-lite_3.1.11.tar.gz
+
--- /dev/null
+Summary: TCT-Lite
+Name: testkit-lite
+Version: 3.1.12
+Release: 1
+License: GPLv2
+Group: Applications/System
+Source: %{name}_%{version}.tar.gz
+
+BuildRequires: python-distribute
+
+%{!?python_sitelib: %define python_sitelib %(python -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")}
+
+%description
+testkit-lite is a test runner with command-line interface.It has the following functions
+1. Accepts .xml test case descriptor files as input.
+2. drives automatic test execution.
+3. provide multiple options to meet various test requirements.
+
+%prep
+%setup -q
+
+%build
+
+%install
+python setup.py install --prefix=%{_prefix} --root=%{buildroot}
+# remove tests
+rm -rf %{buildroot}/%{python_sitelib}/tests
+
+%clean
+rm -rf %{buildroot}
+
+%post
+# Set permissions
+chmod ugo+rwx /opt/testkit/lite3.0
+
+%files
+%{python_sitelib}/testkitlite/*
+%{python_sitelib}/testkit_lite-*.egg-info/*
+/etc/dbus-1/system.d/com.intel.testkit.conf
+/opt/testkit/lite3.0/VERSION
+/opt/testkit/lite3.0/commodule/CONFIG
+/opt/testkit/lite3.0/mh.html
+%{_bindir}/testkit-lite
+%{_bindir}/testkit-lite-dbus
+%defattr(-,root,root)
+
+%doc
+/opt/testkit/lite3.0/testkit-lite_user_guide.pdf
+/opt/testkit/lite3.0/testkit-lite_tutorial.pdf
+/opt/testkit/lite3.0/test_definition_schema.pdf
+
+%changelog
--- /dev/null
+<html>
+<head>
+<title>Web Manual Test Harness</title>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<style type="text/css">
+body { font-family:Verdana; font-size:14px; margin:0;}
+#container-div {border: 0;margin:0 auto; width:100%;}
+#sidebar-left {border: 0;float:left; width:6px; height:100%;}
+#sidebar-right {border: 0;float:right; width:6px; height:100%;}
+#content-div {border: 0;margin:0 7px !important; height:100%;}
+.button {display:inline-block;min-width: 30px; max-width: 100px; margin-top: 3px;margin-bottom: 3px;padding: 3px}
+#back-bt, #forward-bt {max-width: 20px;}
+#case-info-area {border 0;text-align:left;}
+#test-entry, #refer-test-entry {font-size: 10px;color: red}
+#test-entry-area, #refer-test-entry-area {font-size: 10px;}
+#run-test-area, #result-area {text-align:right; margin:0 auto;padding:0;}
+iframe {border: 1px solid black;width: 100%; height: 600px;}
+</style>
+<script>
+function run_test(){
+ document.getElementById("test-area").src = document.getElementById("test-entry").textContent;
+};
+
+function run_refer_test(){
+ document.getElementById("test-area").src = document.getElementById("refer-test-entry").textContent;
+};
+
+function result_handler(){
+ try{
+ window.stop();
+ } catch(e) {
+ document.execCommand('Stop');
+ }
+ window.stop();
+ document.getElementById("case-info-area").className = this.name
+};
+
+function init_mh(){
+ document.getElementById("case-info-area").className = "READY";
+ document.getElementById("run-test-bt").addEventListener("click", run_test, false);
+ document.getElementById("run-refer-test-bt").addEventListener("click", run_refer_test, false);
+ document.getElementById("back-bt").addEventListener("click", result_handler, false);
+ document.getElementById("pass-bt").addEventListener("click", result_handler, false);
+ document.getElementById("fail-bt").addEventListener("click", result_handler, false);
+ document.getElementById("block-bt").addEventListener("click", result_handler, false);
+ document.getElementById("forward-bt").addEventListener("click", result_handler, false);
+ document.getElementById("done-bt").addEventListener("click", result_handler, false);
+};
+</script>
+</head>
+<body onload="init_mh()">
+<div id="container-div">
+ <div id="sidebar-left"></div>
+ <div id="sidebar-right"></div>
+ <div id="content-div">
+ <div id="run-test-area">
+ <input type="button" id="back-bt" name="BACK" class="button" value="<"></input>
+ <input type="button" id="run-test-bt" class="button" value="Run Test"></input>
+ <input type="button" id="run-refer-test-bt" class="button" value="Run Refer Test"></input>
+ <input type="button" id="forward-bt" name="FORWARD" class="button" value=">"></input>
+ </div>
+ <div id=result-area>
+ <input type="button" id="pass-bt" name="PASS" class="button" value="PASS"></input>
+ <input type="button" id="fail-bt" name="FAIL" class="button" value="FAIL"></input>
+ <input type="button" id="block-bt" name="BLOCK" class="button" value="BLOCK"></input>
+ <input type="button" id="done-bt" name="DONE" class="button" value="DONE"></input>
+ </div>
+ <div id="case-info-area">
+ <div id="test-entry-area">Test Entry: <span id="test-entry">http://www.baidu.com</span></div>
+ <div id="refer-test-entry-area">Refer Test Entry: <span id="refer-test-entry">http://www.sina.com</span></div>
+ </div>
+ <iframe id="test-area"></iframe>
+ </div>
+</div>
+</body>
+</html>
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Yuanyuan,Zou <yuanyuanx.zou@intel.com>
+
+from setuptools import setup, find_packages
+import os
+from stat import ST_MODE, S_ISDIR
+from distutils.command.install_data import install_data
+
+
+class post_install_cmd(install_data):
+ def run (self):
+ install_data.run(self)
+ if os.name == 'posix':
+ for path in ['/opt/testkit/lite3.0','/opt/testkit/lite3.0/commodule/']:
+ try:
+ mode = os.stat(path)[ST_MODE]
+ mode |= 066
+ os.chmod(path, mode)
+ except OSError as err:
+ pass
+
+
+setup(
+ name = "testkit-lite",
+ description = "Test runner for test execution",
+ url = "https://github.com/testkit/testkit-lite",
+ author = "Shaofeng Tang",
+ author_email = "shaofeng.tang@intel.com",
+ version = "3.1.12",
+ include_package_data = True,
+ data_files = [('/opt/testkit/lite3.0', ['VERSION', 'doc/testkit-lite_user_guide.pdf', 'doc/testkit-lite_tutorial.pdf', 'doc/test_definition_schema.pdf']),
+ ('/opt/testkit/lite3.0/commodule/', ['CONFIG']),
+ ('/opt/testkit/lite3.0', ['resource/mh.html']),
+ ('/etc/dbus-1/system.d/', ['dbus/com.intel.testkit.conf'])],
+ scripts = ('testkit-lite', 'dbus/testkit-lite-dbus'),
+ packages = find_packages(),
+ cmdclass = {'install_data': post_install_cmd},
+)
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Jing,Wang <jing.j.wang@intel.com>
+# Yuanyuan,Zou <yuanyuanx.zou@intel.com>
+""" testkit lite tools"""
+
+import os
+import sys
+import traceback
+import platform
+import signal
+import ConfigParser
+import re
+import xml.etree.ElementTree as etree
+from optparse import OptionParser, make_option
+from datetime import datetime
+import json
+
+from testkitlite.util.errors import TestCaseNotFoundException, TestEngineException
+
+
+os.environ["DBUS_SESSION_BUS_ADDRESS"]='unix:path=/run/dbus/system_bus_socket'
+os.environ["DISPLAY"]=':0.0'
+
+try:
+ # import logger
+ from testkitlite.util.log import LOGGER
+except ImportError, err:
+ print "[ Error: loading logging failed, error: %s ]\n" % err
+ print "try to run command " \
+ "'export PYTHONPATH=/usr/local/lib/python2.7/dist-packages' or " \
+ "'export PYTHONPATH=/usr/local/lib/python2.7/site-packages' to resolve module missed issue"
+ sys.exit(1)
+
+
+# get platform version info
+OS_VER = platform.system()
+JOIN = os.path.join
+EXISTS = os.path.exists
+DIRNAME = os.path.dirname
+BASENAME = os.path.basename
+ABSPATH = os.path.abspath
+SPLIT = os.path.split
+ISLINK = os.path.islink
+
+TESTKIT_DIR = "/opt/testkit/lite3.0"
+if not OS_VER == "Linux" and not OS_VER == "Darwin":
+ TESTKIT_DIR = DIRNAME(ABSPATH(__file__))
+ sys.path += [JOIN(TESTKIT_DIR)]
+ TESTKIT_DIR = JOIN(TESTKIT_DIR, "results")
+
+LOG_DIR = TESTKIT_DIR
+TEST_PACKAGES_DIR = JOIN(TESTKIT_DIR, "test_packages")
+COMMON_FILTERS = {
+ "suite": [],
+ "set": [],
+ "priority": [],
+ "id": [],
+ "type": [],
+ "status": [],
+ "component": [],
+ "set_type": []}
+down_status = False
+remote_test = False
+can_merge_result = False
+device_id = ""
+device_locked = False
+RUNNER = None
+
+# detect version option
+if "--version" in sys.argv:
+ try:
+ CONFIG = ConfigParser.ConfigParser()
+ if platform.system() == "Linux":
+ CONFIG.read('/opt/testkit/lite3.0/VERSION')
+ else:
+ VERSION_FILE = JOIN(sys.path[0], 'VERSION')
+ CONFIG.read(VERSION_FILE)
+ VERSION = CONFIG.get('public_version', 'version')
+ LOGGER.info("V%s" % VERSION)
+ sys.exit()
+ except ConfigParser.Error, err:
+ LOGGER.error(
+ "[ Error: fail to parse version info, error: %s ]\n" % err)
+ sys.exit(1)
+
+# detect internal version option
+if "--internal-version" in sys.argv:
+ try:
+ CONFIG = ConfigParser.ConfigParser()
+ if platform.system() == "Linux":
+ CONFIG.read('/opt/testkit/lite3.0/VERSION')
+ else:
+ VERSION_FILE = JOIN(sys.path[0], 'VERSION')
+ CONFIG.read(VERSION_FILE)
+ VERSION = CONFIG.get('internal_version', 'version')
+ print VERSION
+ sys.exit()
+ except ConfigParser.Error, err:
+ print "[ Error: fail to parse version info, error: %s ]\n" % err
+ sys.exit(1)
+#try:
+# CONFIG = ConfigParser.ConfigParser()
+# CONFIG.read('/opt/testkit/lite3.0/commodule/CONFIG')
+# tizen = CONFIG.get('TIZEN_USER','tizen_user')
+# if tizen:
+# os.environ['TIZEN_USER'] = tizen
+#except:
+# pass
+
+def varnarg(option, opt_str, value, parser):
+ """ parser srg"""
+ value = []
+ import re
+ for arg in parser.rargs:
+ if re.search('^--.+', arg) or \
+ re.search('^-[\D]', arg):
+ break
+ value.append(arg)
+
+ del parser.rargs[:len(value)]
+ setattr(parser.values, option.dest, value)
+
+def unlock_and_exit(exit_code=signal.SIGINT):
+ if device_locked:
+ release_device_lock(device_id)
+ sys.exit(exit_code)
+
+def final_clean_test():
+ try:
+ if RUNNER is not None:
+ if RUNNER.session_id:
+ RUNNER.finalize_test(RUNNER.session_id)
+ if can_merge_result:
+ RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+ if down_status:
+ clean_testxml(OPTIONS.testxml, remote_test)
+ except (KeyboardInterrupt, Exception), err:
+ pass
+
+def sig_exit_handler(*args):
+ final_clean_test()
+ LOGGER.info("\n[ exiting testkit-lite on system signal ]\n")
+ unlock_and_exit()
+
+if platform.system() == "Linux":
+ signal.signal(signal.SIGTSTP, sig_exit_handler)
+signal.signal(signal.SIGTERM, sig_exit_handler)
+try:
+ OPTION_LIST = [
+ make_option("-f", "--testxml", dest="testxml",
+ action="callback", callback=varnarg,
+ help="Specify the path of test definition file (tests.xml)."
+ " If run more one test package,just list the all the path "
+ " of \"tests.xml\" and separate with a whitespace"),
+ make_option("-D", "--dryrun", dest="bdryrun",
+ action="store_true",
+ help="Dry-run the selected test cases"),
+ make_option("-M", "--manual-only", dest="bmanualonly",
+ action="store_true",
+ help="Enable only manual tests"),
+ make_option("-A", "--auto-only", dest="bautoonly",
+ action="store_true",
+ help="Enable only auto tests"),
+ make_option("-o", "--output", dest="resultfile",
+ help="Specify output file for result xml. \
+ If more than one testxml provided, \
+ results will be merged together to this output file"),
+ make_option("-e", dest="exttest", action="store",
+ help="Launch external test with a launcher,\
+ supports browser or other web-runtime"),
+ make_option("-k", "--worker", dest="worker", action="store",
+ help="Specify a test engine for execution, use value 'default' by default"),
+ # make_option("-p", "--target-platform", dest="targetplatform",
+ # action="store",
+ # help="specify special test target platform, e.g. xw_android, chrome_ubuntu"),
+ # make_option("--webdriver-url", dest="wdurl", action="store",
+ # help="specify special web driver listening url"),
+ make_option("--version", dest="version_info", action="store_true",
+ help="Show version information"),
+ make_option("--internal-version", dest="internal_version_info",
+ action="store_true",
+ help="Show internal version information"),
+ make_option("--deviceid", dest="device_serial", action="store",
+ help="set device serial information"),
+ make_option("--testprefix", dest="test_prefix", action="store",
+ help="set prefix for test case entry"),
+ make_option("--testenvs", dest="test_env", action="store",
+ help="set environs for test case execution, use ';' to separator multi option"),
+ make_option("--comm", dest="commodule", action="store",
+ help="set commodule by default,"
+ "set \"localhost\" for local web testing"),
+ make_option("--capability", dest="capability", action="store",
+ help="set platform for sepecfic device capability"),
+ make_option("--debug", dest="debug", action="store_true",
+ help="run in debug mode,more log information print out"),
+ make_option("--rerun", dest="rerun", action="store_true",
+ help="check if rerun test mode"),
+ make_option("--non-active", dest="non_active", action="store_true",
+ help="Disable the ability to set the result of \
+ core manual cases from the console"),
+ # make_option("-d", "--debugip", dest="debugip", action="store",
+ # help="specify tizen xwalk debug ip "),
+ make_option("--init-script", dest="initscript", action="store",
+ help="init script before script"),
+ make_option("--post-script", dest="postscript", action="store",
+ help="post script"),
+ make_option('--disable-dlog', dest="disabledlog", action="store_true",
+ help="disable dlog information"),
+ # make_option('--user', dest="user", action="store",
+ # help="setting test user")
+ make_option("--tizen-version", dest="tizenversion", action="callback", callback=varnarg, help="set tizen version infomation"),
+ make_option("--skip-tc", dest="skip_tc", action="callback", callback=varnarg, help ="Specify the testcase id for exclude from the test"),
+ make_option("--stub-port", dest="stubport", action="callback", callback=varnarg, help = "set testkit-stub port number")
+ ]
+
+ OPTION_LIST.extend([
+ make_option("--%s" % flt,
+ dest="w%s" % flt, action="callback", callback=varnarg,
+ help="Select the specified filter-rules : %s" % flt)
+ for flt in COMMON_FILTERS])
+
+ try:
+ # untrusted behaviour of %%prog
+ USAGE = "%%prog [options] -f [prefix:]\"<somewhere/test.xml>\" \n\
+forms: %%prog -f [prefix:]\"<somewhere>/test.xml\" \n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" -D\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" -A\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" -M\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --set <set_name>\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --type <type_name>\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --status <status_name>\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --priority <priority_value>\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --component <component_name>\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --id <case_id>\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --capability <capability_file> --comm <comm_type>\n\
+ %%prog -f [prefix:]\"<somewhere>/test.xml\" --comm <comm_type>\n\
+ %%prog -f [prefix:]\"<somewhere>/test1.xml <somewhere>/test2.xml <somewhere>/test3.xml\" \n\
+ %%prog -f [prefix:]\"<somewhere>/test1.xml <somewhere>/test2.xml <somewhere>/test3.xml --testenvs 'wd-url=...;wd-debugip=...'\" \n\
+exmaples of \"prefix\" usage: \n\
+ run a web test with a test definition (XML file) from device side: \n\
+ %%prog -f device:\"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -A \n\
+ run a web test with a test definition (XML file) from localhost: \n\
+ %%prog -f \"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -A \n\
+exmaples of \"-e\" usage: \n\
+ run a web test package with TIZEN web-runtime, launcher provided in tests.xml, so \"-e\" is omitted: \n\
+ %%prog -f device:\"/opt/usr/media/tct/opt/tct-websocket-w3c-tests/tests.xml\" -A \n\
+ run a web test package with chrome browser: \n\
+ %%prog -f \"/usr/share/webapi-webkit-tests/tests.xml\" -e \
+'google-chrome --allow-file-access-from-files --disable-web-security --start-maximized --user-data-dir=/home/test/data /home/test/webrunner/index.html' -A --comm localhost \n\
+\n\
+Note: \n\
+ 1) Proxy settings should be disabled when execute webapi packages\n\
+ 2) TestLog is stored to %s/latest\n\
+ 3) %%prog enables both auto and manual tests by default\n\
+ 4) Obviously -A and -M are conflict options\n\
+ 5) -e option does not support -D mode\n\
+ 6) The test cases' order in the result files might be arbitrary,\
+when running same tests.xml with same options. This is caused \
+by python's API 'getiterator' from module 'xml.etree.ElementTree'\n\
+ 7) run command 'testkit-lite', \
+it might not be able to locate module 'testkitlite.engines.\
+default.runner', \
+run command 'export PYTHONPATH=/usr/local/lib/python2.7/dist-packages' or \
+run command 'export PYTHONPATH=/usr/local/lib/python2.7/site-packages' \
+to resolve this issue" % (LOG_DIR)
+ except Exception:
+ USAGE = None
+
+ # detect non-params
+ if len(sys.argv) == 1:
+ sys.argv.append("-h")
+
+ PARSERS = OptionParser(option_list=OPTION_LIST, usage=USAGE)
+ (OPTIONS, ARGS) = PARSERS.parse_args()
+ # init test engine here
+ from testkitlite.util.connector import ConnectorBuilder
+ from testkitlite.util.process import get_device_lock, release_device_lock, clean_testxml
+ from testkitlite.util.session import TestSession
+ from testkitlite.util.errors import TestCaseNotFoundException, TestEngineException
+
+ #execute_type
+ exec_types = ["auto","manual"]
+ if OPTIONS.bautoonly and OPTIONS.bmanualonly:
+ raise ValueError("-A and -M are conflict")
+ elif OPTIONS.bautoonly:
+ exec_types.remove("manual")
+ elif OPTIONS.bmanualonly:
+ exec_types.remove("auto")
+
+ if OPTIONS.worker and OPTIONS.worker != 'webdriver':
+ raise ValueError('-k is just service for webdriver, you can not set it ,using default')
+
+ debugip = None
+ if OPTIONS.test_env:
+ #envs = OPTIONS.test_env.replace(';',' ').split(' ')
+ envs = OPTIONS.test_env.split(';')
+ for env_t in envs:
+ env_t = env_t.strip()
+ if not env_t:
+ continue
+ k, v = env_t.split('=')
+ if 'app_launcher' in v:
+ os.environ[k.strip()] = "app_launcher -s"
+ else:
+ os.environ[k.strip()] = v.strip()
+ if cmp(k.strip(),"wd-debugip") == 0:
+ debugip = v.strip()
+ if not os.environ.has_key('TIZEN_USER'):
+ try:
+ CONFIG = ConfigParser.ConfigParser()
+ CONFIG.read('/opt/testkit/lite3.0/commodule/CONFIG')
+ tizen = CONFIG.get('TIZEN','tizen_user')
+ if tizen:
+ os.environ['TIZEN_USER'] = tizen
+ except:
+ pass
+ # connector options
+ conn_opt = {}
+ #conn_opt['commodule'] = OPTIONS.commodule or "tizenmobile"
+ conn_opt['commodule'] = OPTIONS.commodule or "localhost"
+ conn_opt['deviceid'] = OPTIONS.device_serial
+ CONNECTOR = ConnectorBuilder(conn_opt).get_connector()
+ if CONNECTOR == None:
+ sys.exit(1)
+
+ device_id = CONNECTOR.get_device_info()['device_id']
+ os.environ['DEVICE_ID'] = device_id
+ if not OPTIONS.non_active:
+ device_locked = get_device_lock(device_id)
+ if not device_locked:
+ LOGGER.error("[ Error: Failed to get device for current session... ]\n")
+ sys.exit(1)
+
+ #modify at 2014.09.11
+ targetplatform = None
+ #debugip = None
+ if OPTIONS.exttest and OPTIONS.worker and OPTIONS.worker.upper() == 'WEBDRIVER':
+ if conn_opt['commodule'] == 'localhost':
+ targetplatform = "chrome_ubuntu"
+ os.environ['targetplatform'] = targetplatform
+ elif conn_opt['commodule'] == 'tizenmobile':
+ targetplatform = "xw_tizen"
+ os.environ['targetplatform'] = targetplatform
+ elif conn_opt['commodule'] == 'androidmobile':
+ targetplatform = "xw_android"
+ os.environ['targetplatform'] = targetplatform
+ # process test environ
+ if OPTIONS.test_env:
+ #envs = OPTIONS.test_env.replace(';',' ').split(' ')
+ envs = OPTIONS.test_env.split(';')
+ for env_t in envs:
+ env_t = env_t.strip()
+ if not env_t:
+ continue
+ k, v = env_t.split('=')
+ if 'app_launcher' in v:
+ os.environ[k.strip()] = "app_launcher -s"
+ else:
+ os.environ[k.strip()] = v.strip()
+
+ # load profile for wedrvier
+ if targetplatform:
+ webdriver_vars = {}
+ exec 'from testkitlite.capability.%s import initCapability' % targetplatform
+ if targetplatform.upper().find('TIZEN') >= 0:
+ if not debugip:
+ raise ValueError("For tizen xwalk, option --debugip is needed!")
+ webdriver_vars = initCapability('TEST_APP_ID', debugip)
+ elif targetplatform.upper().find('ANDROID') >= 0:
+ webdriver_vars = initCapability('TEST_PKG_NAME', 'TEST_ACTIVITY_NAME')
+ else:
+ webdriver_vars = initCapability()
+ os.environ['WEBDRIVER_VARS'] = json.dumps(webdriver_vars)
+
+ # process test environ
+ # if OPTIONS.test_env:
+ # envs = OPTIONS.test_env.replace(';',' ').split(' ')
+ # for env_t in envs:
+ # env_t = env_t.strip()
+ # if not env_t:
+ # continue
+ # k, v = env_t.split('=')
+ # os.environ[k.strip()] = v.strip()
+ if OPTIONS.initscript:
+ os.environ['initscript'] = OPTIONS.initscript
+ if OPTIONS.postscript:
+ os.environ['postscript'] = OPTIONS.postscript
+ # load test defintion files
+ if "device:" in OPTIONS.testxml[0]:
+ if not CONNECTOR.is_support_remote():
+ raise ValueError("For '%s' mode, please test file without prefix 'device:' " % conn_opt['commodule'])
+
+ remote_test = True
+ try:
+ if not EXISTS(TEST_PACKAGES_DIR):
+ os.makedirs(TEST_PACKAGES_DIR)
+ except OSError, err:
+ LOGGER.error("[ Error: "
+ "can't create test package directory: %s, error: %s ]\n" %
+ (TEST_PACKAGES_DIR, err))
+ unlock_and_exit()
+ REMOTE_TESTLITS = OPTIONS.testxml[0]
+ REMOTE_TESTLITS = REMOTE_TESTLITS.split(':')[1]
+ TESTLISTARRARY = REMOTE_TESTLITS.split()
+ LOCALARRY = []
+
+ for remote_file in TESTLISTARRARY:
+ tmp_remote_file = SPLIT(remote_file)
+ tmp_remote_folder = BASENAME(tmp_remote_file[0])
+ tmp_remote_test_xml = JOIN(
+ tmp_remote_folder, tmp_remote_file[1])
+ local_test_package = JOIN(
+ TEST_PACKAGES_DIR, tmp_remote_test_xml)
+ down_status = CONNECTOR.download_file(remote_file, local_test_package)
+ if not down_status:
+ LOGGER.error("Failed to get test file '%s' from device"
+ % remote_file)
+ unlock_and_exit()
+ LOCALARRY.append(local_test_package)
+ OPTIONS.testxml = LOCALARRY
+ else:
+ if len(OPTIONS.testxml) == 1:
+ i, start, end = 0, 0, 0
+ LOCAL_TESTLISTS = []
+ temp_xml = OPTIONS.testxml[0]
+ while(i < len(temp_xml)):
+ tmp = temp_xml[i:len(temp_xml)]
+ if ".xml" in tmp:
+ index = tmp.index(".xml") + 4 + i
+ end = index
+ i = index + 1
+ LOCAL_TESTLISTS.append(temp_xml[start:end])
+ start = index + 1
+ else:
+ LOGGER.error("No xml found")
+ break
+ OPTIONS.testxml = LOCAL_TESTLISTS
+
+
+ # load test engine
+ if OPTIONS.worker:
+ os.environ['WORKER'] = OPTIONS.worker
+
+ workername = OPTIONS.worker or 'default'
+ try:
+ exec "from testkitlite.engines.%s import TestWorker" % workername
+ except Exception as error:
+ raise TestEngineException(workername)
+ WORKER = TestWorker(CONNECTOR)
+
+ # create runner
+ RUNNER = TestSession(CONNECTOR, WORKER)
+ # apply all options
+ RUNNER.set_global_parameters(OPTIONS)
+
+ if OPTIONS.tizenversion is None:
+ LOGGER.error("[ Error : input your tizen version ]\n")
+ sys.exit(1)
+ else :
+ tizenver = OPTIONS.tizenversion[0]
+ VER_PATTERN = "^tizen_web_\d.\d|^tizen_native_\d.\d|^tizen_csharp_\d.\d"
+ pa = re.compile(VER_PATTERN, re.I)
+ ma = pa.match(tizenver)
+ if ma is None:
+ LOGGER.error("A required \"/opt/tct/"+tizenver+" could not be found.\n")
+ sys.exit(1)
+
+ RUNNER.set_tizenversion(tizenver)
+
+ if OPTIONS.stubport is not None:
+ port = OPTIONS.stubport[0]
+ RUNNER.set_stubport(port)
+
+ if OPTIONS.skip_tc is not None:
+ RUNNER.set_skip_tc(OPTIONS.skip_tc)
+
+ # set capability
+ if not RUNNER.get_capability(OPTIONS.capability):
+ unlock_and_exit()
+ # apply filter
+ WFILTERS = {}
+ for flt in COMMON_FILTERS:
+ if eval('OPTIONS.w%s' % flt):
+ WFILTERS[flt] = eval('OPTIONS.w%s' % flt)
+ RUNNER.add_filter_rules(**WFILTERS)
+
+ if not OPTIONS.testxml:
+ LOGGER.error("[ Error: not specify a test xml... ]\n")
+ unlock_and_exit()
+ # 1) prepare log dir
+ if OS_VER == "Linux" or OS_VER == "Darwin":
+ SESSION = datetime.today().isoformat('-') + str(os.getpid()) + "_session"
+ else:
+ SESSION = datetime.today().strftime("%Y-%m-%d_%H_%M_%S") + \
+ str(os.getpid()) + "_session"
+ CURRENT_LOG_DIR = JOIN(LOG_DIR, SESSION)
+ LATEST_DIR = JOIN(LOG_DIR, "latest")
+ try:
+ if EXISTS(LATEST_DIR):
+ os.remove(LATEST_DIR)
+ if ISLINK(LATEST_DIR):
+ os.remove(LATEST_DIR)
+ os.makedirs(CURRENT_LOG_DIR)
+ if os.name == "posix":
+ os.symlink(CURRENT_LOG_DIR, LATEST_DIR)
+ except IOError, err:
+ LOGGER.error("[ Error: create session log directory: "
+ "%s failed, error: %s ]\n" % (CURRENT_LOG_DIR, err))
+ except OSError, err:
+ LOGGER.error("error : %s" % err)
+ finally:
+ if not EXISTS(CURRENT_LOG_DIR):
+ os.makedirs(CURRENT_LOG_DIR)
+
+ # 2) prepare run test
+ # run more than one tests.xml
+ # 1. run all auto cases from the xmls
+ # 2. run all manual cases from the xmls
+ TESTXMLS = set(OPTIONS.testxml)
+ for t in TESTXMLS:
+ if EXISTS(t):
+ filename = t
+ filename = os.path.splitext(filename)[0]
+ if OS_VER == "Linux" or OS_VER == "Darwin":
+ if not filename.startswith('/'):
+ LOGGER.error("[ Error:"
+ " xml file %s should start with '/' ]" % filename)
+ unlock_and_exit()
+ file_items = filename.split('/')
+ else:
+ file_items = re.split(r'[/\\]+', filename)
+ if len(file_items) < 2 or file_items[-2] == "" or file_items[-1] == "":
+ LOGGER.error("[ Error:"
+ " unable to find package name from %s ]" % t)
+ unlock_and_exit()
+ filename = file_items[-2] + '_' + file_items[-1]
+ filename = "%s.total" % BASENAME(filename)
+ resultfile = "%s.xml" % filename
+ resultfile = JOIN(CURRENT_LOG_DIR, resultfile)
+ try:
+ ep = etree.parse(t)
+ suiteparent = ep.getroot()
+ except etree.ParseError:
+ LOGGER.error("[ Error: no case found in testxml, "
+ "pls check the test package ]\n")
+ unlock_and_exit()
+ no_test_definition = 1
+ for tf in ep.getiterator('test_definition'):
+ no_test_definition = 0
+ if no_test_definition:
+ suiteparent = etree.Element('test_definition')
+ suiteparent.tail = "\n"
+ for suite in ep.getiterator('suite'):
+ suite.tail = "\n"
+ suiteparent.append(suite)
+ WFILTERS['execution_type'] = exec_types
+ RUNNER.add_filter_rules(**WFILTERS)
+ RUNNER.apply_filter(suiteparent)
+ # merge duplicated test set under suite node
+ tset_list = set()
+ for suite in ep.getiterator('suite'):
+ for tset in suite.getiterator('set'):
+ for testcase in tset.getiterator('testcase'):
+ tset.remove(testcase)
+ if tset.get('name') in tset_list:
+ suite.remove(tset)
+ else:
+ tset_list.add(tset.get('name'))
+ try:
+ with open(resultfile, 'w') as output:
+ tree = etree.ElementTree(element=suiteparent)
+ tree.write(output)
+ except IOError, err:
+ LOGGER.error(
+ "[ Error: create filtered total result file: %s failed, "
+ "error: %s ]\n" % (resultfile, err))
+ else:
+ LOGGER.error("[ test xml file '%s' not found ]" % t)
+ unlock_and_exit()
+
+ for t in TESTXMLS:
+ for e_type in exec_types:
+ try:
+ WFILTERS['execution_type'] = [e_type]
+ RUNNER.add_filter_rules(**WFILTERS)
+ RUNNER.prepare_run(t, resultdir=CURRENT_LOG_DIR)
+ except IOError, err:
+ LOGGER.error("[ Error: prepare_run test xml: "
+ "%s from testkit-lite failed, error: %s ]\n" % (t, err))
+
+ START_TIME = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
+ try:
+ can_merge_result = True
+ RUNNER.run_case(CURRENT_LOG_DIR)
+ except TestCaseNotFoundException, err:
+ LOGGER.info("\n[ Error: exiting testkit-lite on error: %s ]\n" % err)
+ unlock_and_exit()
+ except Exception, err:
+ clean_testxml(TESTXMLS, remote_test)
+ traceback.print_exc()
+ LOGGER.error("[ Error: run test failed, error: %s ]\n" % err)
+
+ try:
+ RUNNER.merge_resultfile(START_TIME, CURRENT_LOG_DIR)
+ clean_testxml(TESTXMLS, remote_test)
+ LOGGER.info("[ all tasks for testkit lite are accomplished, goodbye ]")
+ unlock_and_exit(0)
+ except Exception, err:
+ traceback.print_exc()
+ clean_testxml(TESTXMLS,remote_test)
+ LOGGER.error("[ Error: merge result failed, error: %s ]\n" % err)
+ unlock_and_exit()
+except (TestEngineException, KeyboardInterrupt), err:
+ final_clean_test()
+ LOGGER.info("\n[ exiting testkit-lite on user cancel ]\n")
+ unlock_and_exit()
+except Exception, err:
+ final_clean_test()
+ LOGGER.error("\n[ Error: exiting testkit-lite due to critical error: %s ]\n" % err)
+ traceback.print_exc()
+ unlock_and_exit()
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright (C) 2014 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Nicolas Zingile <n.zingile@gmail.com>
+
+import argparse
+from testkitmerge.merger import *
+
+def main():
+ argparser = argparse.ArgumentParser(description='Tool to merge testkit result xml files')
+ argparser.add_argument('-f', '--files', help='list of testkit xml result files', nargs='+')
+ argparser.add_argument('-o', '--outdir', help='output directory of final result file', required=True)
+ argparser.add_argument('-n', '--name', help ='name of the final result file', default='result.xml')
+ args = argparser.parse_args()
+ print args
+
+ parser = etree.XMLParser(strip_cdata=False)
+ sourcexmltree = None
+ resultxmltree = None
+
+ for resultxml in args.files:
+ if not os.path.isfile(resultxml):
+ print "Error: the file '" + resultxml + "'doesn't exist !"
+ exit(1)
+ if not resultxml.endswith('.xml'):
+ print "Error: '" + resultxml + "' is not an xml file !"
+ exit(1)
+ for index in range(len(args.files)):
+ sourcexmltree = etree.parse(args.files[index], parser)
+ resultxmltree = merge_testkitxml(sourcexmltree, resultxmltree)
+
+ resultxmltree.write(os.path.join(args.outdir, args.name), pretty_print=True, encoding='utf8', method='xml', xml_declaration=True)
+
+if __name__ == "__main__":
+ main()
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+SUBDIRS = common engines
+
+testkitlitedir = /usr/lib/python2.7/dist-packages/testkitlite
+dist_testkitlite_SCRIPTS = __init__.py
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitlitecapdir = /usr/lib/python2.7/dist-packages/testkitlite/capability
+dist_testkitlitecap_SCRIPTS = *.py
--- /dev/null
+def initCapability(test_app=None, test_ext=None):
+ capability = {'chrome.binary': '/usr/bin/chromium-browser'}
+ return {'webdriver_url': 'http://127.0.0.1:9515', 'desired_capabilities': capability, 'test_prefix': 'file:///'}
--- /dev/null
+def initCapability(test_name=None, test_ext=None, webdriver_url='http://127.0.0.1:9515', test_prefix='file:///android_asset/www/'):
+ capability = {'xwalkOptions': {'androidPackage':test_name, 'androidActivity': test_ext}}
+ return {'webdriver_url': webdriver_url, 'desired_capabilities': capability, 'test_prefix': test_prefix }
--- /dev/null
+def initCapability(test_app=None, test_ext=None, webdriver_url='http://127.0.0.1:9515', test_prefix=''):
+ capability = {'xwalkOptions': {
+ 'tizenDebuggerAddress': test_ext,
+ 'tizenAppId': test_app
+ }
+ }
+# print capability
+ return {'webdriver_url':webdriver_url , 'desired_capabilities': capability, 'test_prefix': test_prefix}
--- /dev/null
+[LOGGING]
+log_level=INFO
+
+[EXTENSION]
+crosswalk=--external-extensions-path=/usr/lib/tizen-extensions-crosswalk
+
+[TIZEN]
+tizen_user=app
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Yuanyuan,Zou <yuanyuanx.zou@intel.com>
+
+
+commoduleimpldir = /usr/lib/python2.7/dist-packages/commodule
+dist_commoduleimpl_SCRIPTS = *.py
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+
+""" The implementation of Android communication driver"""
+
+import os
+import time
+import socket
+import threading
+import re
+
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+from testkitlite.util.killall import killall
+from testkitlite.util.errors import InvalidDeviceException
+
+
+os.environ['TEST_PLATFORM'] = 'android'
+os.environ['CONNECT_TYPE'] = 'adb'
+LOCAL_HOST_NS = "127.0.0.1"
+APP_QUERY_STR = "adb -s %s shell ps | grep %s | awk '{print $2}' "
+APK_INSTALL = "adb -s %s shell pm install %s"
+APK_UNINSTALL = "adb -s %s shell pm uninstall %s"
+APK_LIST = "adb -s %s shell pm list packages |grep '%s'|cut -d ':' -f2"
+APP_NONBLOCK_STR = "adb -s %s shell '%s' &"
+APP_START = "adb -s %s shell am start -n %s"
+APP_STOP = "adb -s %s shell am force-stop %s"
+XWALK_APP_STR = "org.xwalk.%s/.%sActivity"
+
+
+LOGCAT_CLEAR = "adb -s %s shell logcat -c"
+LOGCAT_START = "adb -s %s shell logcat -v time"
+DMESG_CLEAR = "adb -s %s shell dmesg -c"
+DMESG_START = "adb -s %s shell cat /proc/kmsg"
+
+
+def debug_trace(cmdline, logfile):
+ global debug_flag, metux
+ wbuffile = file(logfile, "a")
+ import subprocess
+ exit_code = None
+ proc = subprocess.Popen(args=cmdline,
+ shell=True,
+ stdout=wbuffile,
+ stderr=None)
+ while True:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+ time.sleep(0.5)
+ metux.acquire()
+ proc_flag = debug_flag
+ metux.release()
+ if not proc_flag:
+ break
+ wbuffile.close()
+ if exit_code is None:
+ killall(proc.pid)
+
+
+def _get_device_ids():
+ """get android device list of ids"""
+ result = []
+ exit_code, ret = shell_command("adb devices")
+ for line in ret:
+ if str.find(line, "\tdevice") != -1:
+ result.append(line.split("\t")[0])
+ return result
+
+
+class AndroidMobile:
+
+ """ Implementation for transfer data
+ between Host and Android Mobile Device
+ """
+
+ def __init__(self, device_id=None):
+ self.deviceid = device_id
+ self.support_remote = True
+
+ def is_support_remote(self):
+ return self.support_remote
+
+ def shell_cmd(self, cmd="", timeout=15):
+ cmdline = "adb -s %s shell %s" % (self.deviceid, cmd)
+ return shell_command(cmdline, timeout)
+
+ def check_process(self, process_name):
+ exit_code, ret = shell_command(
+ APP_QUERY_STR % (self.deviceid, process_name))
+ return len(ret)
+
+ def kill_stub(self):
+ #add this function to avoid webdriver issue, yangx.zhou@intel.com,2015.01.15
+ wgt_name = "testkit.stub/.TestkitStub"
+ pkg_name = wgt_name.split('/')[0]
+ cmdline = APP_STOP % (self.deviceid, pkg_name)
+ exit_code, ret = shell_command(cmdline)
+
+
+ def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+ # self.kill_stub()
+ wgt_name = "testkit.stub/.TestkitStub"
+ # pkg_name = wgt_name.split('/')[0]
+ # cmdline = APP_STOP % (self.deviceid, pkg_name)
+ # exit_code, ret = shell_command(cmdline)
+ cmdline = APP_START % (self.deviceid, wgt_name)
+ debug_ext = " -e debug on" if debug_opt != "" else " -e debug off"
+ port_ext = " -e port " + stub_port
+ exit_code, ret = shell_command(cmdline + port_ext + debug_ext)
+ time.sleep(2)
+ return True
+
+ def shell_cmd_ext(self,
+ cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None,
+ callbk=None):
+ cmdline = "adb -s %s shell '%s; echo returncode=$?'" % (
+ self.deviceid, cmd)
+ return shell_command_ext(cmdline, timeout, boutput, stdout_file, stderr_file, callbk)
+
+ def get_device_info(self):
+ """get android device inforamtion"""
+ device_info = {}
+ device_info["device_id"] = self.deviceid
+ device_info["resolution"] = "N/A"
+ device_info["screen_size"] = "N/A"
+ device_info["device_model"] = "N/A"
+ device_info["device_name"] = "N/A"
+ device_info["os_version"] = "N/A"
+ device_info["build_id"] = "N/A"
+ return device_info
+
+ def download_file(self, remote_path, local_path):
+ """download file from device"""
+ cmd = "adb -s %s pull %s %s" % (self.deviceid, remote_path, local_path)
+ exit_code, ret = shell_command(cmd)
+ if exit_code != 0:
+ error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+ LOGGER.info("[ Download file \"%s\" failed, error: %s ]"
+ % (remote_path, error))
+ return False
+ else:
+ return True
+
+ def upload_file(self, remote_path, local_path):
+ """upload file to device"""
+ cmd = "adb -s %s push %s %s" % (self.deviceid, local_path, remote_path)
+ exit_code, ret = shell_command(cmd)
+ if exit_code != 0:
+ error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+ LOGGER.info("[ Upload file \"%s\" failed,"
+ " get error: %s ]" % (local_path, error))
+ return False
+ else:
+ return True
+
+ def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+ """get test option dict """
+ test_opt = {}
+ test_opt["suite_name"] = test_suite
+ test_opt["launcher"] = test_launcher
+ if test_launcher.find('xwalk') >= 0:
+ if test_widget is not None and test_widget != "":
+ test_suite = test_widget
+ test_suite = test_suite.replace('-', '_')
+ test_opt["test_app_id"] = XWALK_APP_STR % (test_suite, test_suite)
+ else:
+ test_opt["test_app_id"] = test_launcher
+ return test_opt
+
+ def get_server_url(self, remote_port="8000"):
+ """forward request a host tcp port to targe tcp port"""
+ if remote_port is None:
+ return None
+
+ os.environ['no_proxy'] = LOCAL_HOST_NS
+ host = LOCAL_HOST_NS
+ inner_port = 9000
+ time_out = 2
+ bflag = False
+ while True:
+ sock_inner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock_inner.settimeout(time_out)
+ try:
+ sock_inner.bind((host, inner_port))
+ sock_inner.close()
+ bflag = False
+ except socket.error as error:
+ if error.errno == 98 or error.errno == 13:
+ bflag = True
+ if bflag:
+ inner_port += 1
+ else:
+ break
+ host_port = str(inner_port)
+ cmd = "adb -s %s forward tcp:%s tcp:%s" % \
+ (self.deviceid, host_port, remote_port)
+ exit_code, ret = shell_command(cmd)
+ url_forward = "http://%s:%s" % (host, host_port)
+ return url_forward
+
+ def install_package(self, pkgpath):
+ """install a package on android device:
+ push package and install with shell command
+ """
+ cmd = APK_INSTALL % (self.deviceid, pkgpath)
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def uninstall_package(self, pkgname):
+ """install a package on android device:
+ push package and install with shell command
+ """
+ cmd = APK_UNINSTALL % (self.deviceid, pkgname)
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def get_installed_package(self):
+ """get list of installed package from device"""
+ cmd = APK_LIST % self.deviceid
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def start_debug(self, dlogfile):
+ global debug_flag, metux
+ debug_flag = True
+ metux = threading.Lock()
+ logcat_cmd = LOGCAT_CLEAR % self.deviceid
+ exit_code, ret = shell_command(logcat_cmd)
+ dmesg_cmd = DMESG_CLEAR % self.deviceid
+ exit_code, ret = shell_command(logcat_cmd)
+ logcat_cmd = LOGCAT_START % self.deviceid
+ dmesg_cmd = DMESG_START % self.deviceid
+ threading.Thread(target=debug_trace, args=(logcat_cmd, dlogfile+'.logcat')).start()
+ threading.Thread(target=debug_trace, args=(dmesg_cmd, dlogfile+'.dmesg')).start()
+
+ def stop_debug(self):
+ global debug_flag, metux
+ metux.acquire()
+ debug_flag = False
+ metux.release()
+
+ def launch_app(self, wgt_name):
+ blauched = False
+ if wgt_name.find('xwalk') != -1:
+ timecnt = 0
+ blauched = False
+ pkg_name, actv_name = wgt_name.split('/')
+ actv_name = actv_name.strip('.')
+ cmdline = APP_STOP % (self.deviceid, pkg_name)
+ exit_code, ret = shell_command(cmdline)
+ cmdline = APP_START % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ if len(ret) > 1:
+ # remove Activity to retry
+ actv_name = actv_name.replace('Activity', '')
+ LOGGER.info("[ Retry to launch app: %s ]" % (pkg_name + '/.' + actv_name))
+ cmdline = APP_START % (self.deviceid, pkg_name + '/.' + actv_name)
+ exit_code, ret = shell_command(cmdline)
+ if len(ret) > 1:
+ # use capitalize to retry
+ tmps = actv_name.split('_')
+ actv_name = ''.join([it.capitalize() for it in tmps if it])
+ LOGGER.info("[ Retry to launch app: %s ]" % (pkg_name + '/.' + actv_name + 'Activity'))
+ cmdline = APP_START % (self.deviceid, pkg_name + '/.' + actv_name + 'Activity')
+ exit_code, ret = shell_command(cmdline)
+ if len(ret) > 1:
+ # remove Activity
+ LOGGER.info("[ Retry to launch app: %s ]" % (pkg_name + '/.' + actv_name))
+ cmdline = APP_START % (self.deviceid, pkg_name + '/.' + actv_name)
+ exit_code, ret = shell_command(cmdline)
+
+ blauched = True
+ time.sleep(3)
+ else:
+ cmdline = APP_NONBLOCK_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ time.sleep(3)
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmd)
+ if ret and len(ret):
+ blauched = True
+ return blauched
+
+ def kill_app(self, wgt_name):
+ pkg_name = wgt_name.split('/')[0]
+ cmdline = APP_STOP % (self.deviceid, pkg_name)
+ exit_code, ret = shell_command(cmdline)
+ return True
+
+ install_app = install_package
+ uninstall_app = uninstall_package
+
+ def get_buildinfo(self):
+ """ get builf info"""
+ build_info = {}
+ build_info['buildid'] = ''
+ build_info['manufacturer'] = ''
+ build_info['model'] = ''
+ return build_info
+
+
+def get_target_conn(device_id=None):
+ """ Get connection for Test Target"""
+ if device_id is None:
+ dev_list = _get_device_ids()
+ if len(dev_list):
+ device_id = dev_list[0]
+ else:
+ raise InvalidDeviceException('No android device found!')
+ return AndroidMobile(device_id)
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+
+""" The implementation of local host communication"""
+
+import os
+import time
+import socket
+import re
+from shutil import copyfile
+
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+
+
+HOST_NS = "127.0.0.1"
+os.environ['no_proxy'] = HOST_NS
+os.environ['TEST_PLATFORM'] = 'localhost'
+if not os.environ.has_key('CONNECT_TYPE'):
+ os.environ['CONNECT_TYPE'] = 'local'
+APP_QUERY_STR = "ps aux | grep %s | grep -v grep"
+
+
+class LocalHost:
+
+ """ Implementation for transfer data
+ between Host and Tizen PC
+ """
+
+ def __init__(self):
+ self.deviceid = os.environ.get('TEST_PLATFORM','')
+ #self.deviceid = "localhost"
+ self.support_remote = False
+
+ def is_support_remote(self):
+ return self.support_remote
+
+ def shell_cmd(self, cmd="", timeout=15):
+ return shell_command(cmd, timeout)
+
+ def check_process(self, process_name):
+ exit_code, ret = shell_command(APP_QUERY_STR % process_name)
+ return len(ret)
+
+ def kill_stub(self):
+ #add this fucntion to avoid webdriver issue if it running on device, yangx.zhou@intel.com
+ cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2 }'"
+ exit_code, ret = self.shell_cmd(cmdline)
+ if exit_code == 0 and len(ret) >0:
+ cmdline = "kill -9 %s" %ret[0]
+ exit_code, ret = self.shell_cmd(cmdline)
+
+
+ def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+ cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
+ exit_code, ret = self.shell_cmd(cmdline)
+ time.sleep(2)
+
+ def check_widget_process(self, wgt_name):
+ return True
+
+ def shell_cmd_ext(self,
+ cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None):
+ return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
+
+ def get_device_ids(self):
+ """
+ get device list of ids
+ """
+ return []
+
+ def get_device_info(self):
+ """
+ get tizen device inforamtion
+ """
+ device_info = {}
+ device_info["device_id"] = self.deviceid
+ device_info["resolution"] = "N/A"
+ device_info["screen_size"] = "N/A"
+ device_info["device_model"] = "N/A"
+ device_info["device_name"] = "N/A"
+ device_info["os_version"] = "N/A"
+ device_info["build_id"] = "N/A"
+ return device_info
+
+ def get_server_url(self, remote_port="8000"):
+ """get server url"""
+ url_forward = "http://%s:%s" % (HOST_NS, remote_port)
+ return url_forward
+
+ def install_package(self, pkgpath):
+ """
+ install a package on tizen device
+ """
+ cmd = "rpm -ivh %s" % pkgpath
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def get_installed_package(self):
+ """get list of installed package from device"""
+ cmd = "rpm -qa | grep tct"
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def download_file(self, remote_path, local_path):
+ """download file"""
+ # copyfile(remote_path, local_path)
+ # return True
+ return False
+
+ def upload_file(self, remote_path, local_path):
+ """upload file"""
+ # copyfile(local_path, remote_path)
+ return False
+
+ def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+ """get test option dict """
+ test_opt = {}
+ test_opt["suite_name"] = test_suite
+ test_opt["launcher"] = test_launcher
+ test_opt["test_app_id"] = test_launcher
+ return test_opt
+
+ def launch_app(self, wgt_name):
+ exit_code, ret = shell_command(wgt_name + '&')
+ return True
+
+ def kill_app(self, wgt_name):
+ return True
+
+ def start_debug(self, dlogfile):
+ pass
+
+ def stop_debug(self):
+ pass
+
+ def get_buildinfo(self):
+ """ get builf info"""
+ build_info = {}
+ build_info['buildid'] = ''
+ build_info['manufacturer'] = ''
+ build_info['model'] = ''
+ return build_info
+
+
+def get_target_conn():
+ """ Get connection for Test Target"""
+ return LocalHost()
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+
+""" The implementation of tizen IVI communication"""
+
+import os
+import time
+import socket
+import threading
+import ConfigParser
+import re
+import sys
+from shutil import copyfile
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+from testkitlite.util.killall import killall
+from testkitlite.util.errors import InvalidDeviceException
+
+try:
+ import paramiko
+except ImportError, err:
+ LOGGER.info("Failed to import 'paramiko' module, please check your installation:")
+ LOGGER.info(" You can use 'sudo pip install paramiko' to install the module!")
+ sys.exit(1)
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = ConfigParser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+
+HOST_NS = "127.0.0.1"
+os.environ['no_proxy'] = HOST_NS
+os.environ['TEST_PLATFORM'] = 'tizen'
+os.environ['CONNECT_TYPE'] = 'ssh'
+TIZEN_USER = os.environ.get('TIZEN_USER', 'owner')
+#print 'debug', os.environ.get('TIZEN_USER','')
+
+# common constants
+RPM_INSTALL = "ssh %s rpm -ivh %s"
+RPM_UNINSTALL = "ssh %s rpm -e %s"
+RPM_LIST = "ssh %s rpm -qa | grep tct"
+APP_QUERY_STR = "ssh %s \"ps aux |grep '%s'|grep -v grep\"|awk '{print $2}'"
+APP_KILL_STR = "ssh %s kill -9 %s"
+APP_NONBLOCK_STR = "ssh %s \"%s &\""
+SSH_COMMAND_RTN = "ssh %s \"%s\"; echo returncode=$?"
+#SSH_COMMAND_APP = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket; %s'\";echo returncode=$?"
+SSH_COMMAND_APP = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket; %s'\";echo returncode=$?"
+
+# wrt-launcher constants
+WRT_MAIN = "wrt-launcher"
+WRT_QUERY_STR = "ssh %s \"wrt-launcher -l|grep '%s'|grep -v grep\"|awk '{print $2\":\"$NF}'"
+WRT_START_STR = "ssh %s 'wrt-launcher -s %s; echo returncode=$?'"
+WRT_STOP_STR = "ssh %s wrt-launcher -k %s"
+WRT_INSTALL_STR = "ssh %s wrt-installer -i %s"
+WRT_UNINSTL_STR = "ssh %s wrt-installer -un %s"
+WRT_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
+
+# crosswalk constants
+#XWALK_MAIN = "xwalkctl"
+#XWALK_MAIN = "open_app"
+XWALK_MAIN = os.environ.get("Launcher","app_launcher -s")
+if cmp(XWALK_MAIN,'app_launcher') == 0:
+ XWALK_MAIN = 'app_launcher -s '
+#XWALK_QUERY_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl' \"| grep -w %s | awk '{print $(NF-1)}'"
+XWALK_QUERY_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;app_launcher -l' \"| grep -w %s | awk '{print $2}'"
+#XWALK_START_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;launch_app %s' & \""
+XWALK_START_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s %s' & \""
+#XWALK_INSTALL_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --install %s' \""
+XWALK_INSTALL_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -i -t %s -p %s -q' \""
+#XWALK_UNINSTL_STR = "ssh %s \"su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --uninstall %s' \""
+XWALK_UNINSTL_STR = "ssh %s \"su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -u -t wgt -q -n %s' \""
+XWALK_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
+
+XWALK_QUERY_ID = "ssh %s 'id -u %s'"
+
+class SSH_Handler:
+ """
+ long connection with login
+ """
+
+ def __init__(self, host='127.0.0.1', username='root', password='tizen', port=22):
+ self._ssh = paramiko.SSHClient()
+ self._ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
+ self._ssh.connect(host, port, username, password)
+
+ def ssh_command(self, cmd='whoami'):
+ stdin, stdout, stderr = self._ssh.exec_command(cmd)
+ return stdout.readlines()
+
+ def close(self):
+ if self._ssh is not None:
+ self._ssh.close()
+
+
+class tizenIVI:
+
+ """ Implementation for transfer data
+ between Host and IVI/PC on SSH connection
+ """
+
+ def __init__(self, deviceid="root@127.0.0.1"):
+ self.deviceid = deviceid
+ remotes = deviceid.split('@')
+ self._ssh = SSH_Handler(remotes[1], remotes[0])
+ self._wrt = False
+ self._xwalk = False
+ self.support_remote = True
+ self._get_user_id()
+
+ def _get_user_id(self):
+ if TIZEN_USER.lower() == 'owner':
+ self.port = '5000'
+ else:
+ cmdline = XWALK_QUERY_ID % (self.deviceid, TIZEN_USER)
+ exit_code, ret = shell_command(cmdline)
+ if exit_code == -1:
+ LOGGER.info("[ can not get user id ]")
+ if len(ret) > 0 :
+ self.port = ret[0].strip('\r\n')
+
+
+ def is_support_remote(self):
+ return self.support_remote
+
+ def shell_cmd(self, cmd="", timeout=15):
+ cmd = "ssh %s %s" % (self.deviceid, cmd)
+ return shell_command(cmd, timeout)
+
+ def check_process(self, process_name):
+ exit_code, ret = shell_command(APP_QUERY_STR % (self.deviceid, process_name))
+ return len(ret)
+
+ def kill_stub(self):
+ #add this function to avoid webdriver issue if stub runnning on device, yangx.zhou@intel.com
+ cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2 }'"
+ ret_lines = self._ssh.ssh_command(cmdline)
+ if len(ret_lines) > 0:
+ cmdline = "kill -9 %s" %ret_lines[0]
+ ret_lines = self._ssh.ssh_command(cmdline)
+
+ def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+ #self.kill_stub()
+ cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
+ ret_lines = self._ssh.ssh_command(cmdline)
+ time.sleep(2)
+
+ def shell_cmd_ext(self,
+ cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None):
+ #if cmd.startswith('app_user@'):
+ usr = TIZEN_USER + '_user@'
+ if cmd.startswith(usr):
+ cmdline = SSH_COMMAND_APP % (self.deviceid, TIZEN_USER, self.port, cmd[9:])
+ else:
+ cmdline = SSH_COMMAND_RTN % (self.deviceid, cmd)
+ return shell_command_ext(cmdline, timeout, boutput, stdout_file, stderr_file)
+
+ def shell_cmd_host(self,
+ cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None):
+ cmd = cmd.replace("$deviceid", self.deviceid)
+ return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
+
+ def get_device_ids(self):
+ """
+ get device list of ids
+ """
+ return ['localhost']
+
+ def get_device_info(self):
+ """
+ get tizenivi device inforamtion
+ """
+ device_info = {}
+ resolution_str = ""
+ screen_size_str = ""
+ device_model_str = ""
+ device_name_str = ""
+ build_id_str = ""
+ os_version_str = ""
+
+ # get resolution and screen size
+ exit_code, ret = shell_command("ssh %s xrandr" % self.deviceid)
+ pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
+ for line in ret:
+ match = pattern.search(line)
+ if match:
+ resolution_str = "%s x %s" % (match.group(1), match.group(2))
+ screen_size_str = "%s x %s" % (match.group(3), match.group(4))
+
+ # get architecture
+ exit_code, ret = shell_command("ssh %s uname -m" % self.deviceid)
+ if len(ret) > 0:
+ device_model_str = ret[0]
+
+ # get hostname
+ exit_code, ret = shell_command("ssh %s uname -n" % self.deviceid)
+ if len(ret) > 0:
+ device_name_str = ret[0]
+
+ # get os version
+ exit_code, ret = shell_command("ssh %s cat /etc/issue" % self.deviceid)
+ for line in ret:
+ if len(line) > 1:
+ os_version_str = "%s %s" % (os_version_str, line)
+
+ # get build id
+ exit_code, ret = shell_command("ssh %s cat /etc/os-release" % self.deviceid)
+ for line in ret:
+ if line.find("BUILD_ID=") != -1:
+ build_id_str = line.split('=')[1].strip('\"\r\n')
+
+ os_version_str = os_version_str[0:-1]
+ device_info["device_id"] = self.deviceid
+ device_info["resolution"] = resolution_str
+ device_info["screen_size"] = screen_size_str
+ device_info["device_model"] = device_model_str
+ device_info["device_name"] = device_name_str
+ device_info["os_version"] = os_version_str
+ device_info["build_id"] = build_id_str
+ return device_info
+
+ def get_server_url(self, remote_port="8000"):
+ """get server url"""
+ remote_ip = self.deviceid
+ remote_ip = remote_ip.split('@')[1]
+ os.environ['no_proxy'] = remote_ip
+ url_forward = "http://%s:%s" % (remote_ip, remote_port)
+ return url_forward
+
+ def install_package(self, pkgpath):
+ """
+ install a package on tizenivi device
+ """
+ cmd = RPM_INSTALL % (self.deviceid, pkgpath)
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def install_package(self, pkgname):
+ """
+ install a package on tizenivi device
+ """
+ cmd = RPM_UNINSTALL % (self.deviceid, pkgname)
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def get_installed_package(self):
+ """get list of installed package from device"""
+ cmd = RPM_LIST % (self.deviceid)
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def download_file(self, remote_path, local_path):
+ """download file"""
+ local_path_dir = os.path.dirname(local_path)
+ if not os.path.exists(local_path_dir):
+ os.makedirs(local_path_dir)
+ cmd = "scp %s:%s %s" % (self.deviceid, remote_path, local_path)
+ exit_code, ret = shell_command(cmd)
+ if not os.path.exists(local_path):
+ return False
+ return True
+
+ def upload_file(self, remote_path, local_path):
+ """upload file"""
+ cmd = "scp %s %s:%s" % (local_path, self.deviceid, remote_path)
+ exit_code, ret = shell_command(cmd)
+ return True
+
+ def _get_wrt_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+ test_app_id = None
+ if auto_iu:
+ test_wgt = test_set
+ test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
+ if not self.install_app(test_wgt_path):
+ LOGGER.info("[ failed to install widget \"%s\" in target ]"
+ % test_wgt)
+ return None
+ else:
+ test_wgt = test_suite
+
+ # check if widget installed already
+ cmd = WRT_QUERY_STR % (test_wgt)
+ exit_code, ret = shell_command(cmd)
+ if exit_code == -1:
+ return None
+ for line in ret:
+ items = line.split(':')
+ if len(items) < 1:
+ continue
+ if (fuzzy_match and items[0].find(test_wgt) != -1) or items[0] == test_wgt:
+ test_app_id = items[1].strip('\r\n')
+ break
+
+ if test_app_id is None:
+ LOGGER.info("[ test widget \"%s\" not found in target ]"
+ % test_wgt)
+ return None
+
+ return test_app_id
+
+ def _get_xwalk_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+ test_app_id = None
+ if auto_iu:
+ test_wgt = test_set
+ test_wgt_path = XWALK_LOCATION % (test_suite, test_wgt)
+ if not self.install_app(test_wgt_path):
+ LOGGER.info("[ failed to install widget \"%s\" in target ]"
+ % test_wgt)
+ return None
+ else:
+ test_wgt = test_suite
+
+ # check if widget installed already
+ cmd = XWALK_QUERY_STR % (self.deviceid,TIZEN_USER, self.port, test_wgt)
+ exit_code, ret = shell_command(cmd)
+ if exit_code == -1:
+ return None
+ for line in ret:
+ test_app_id = line.strip('\r\n')
+
+ if test_app_id is None:
+ LOGGER.info("[ test widget \"%s\" not found in target ]"
+ % test_wgt)
+ return None
+
+ return test_app_id
+
+ def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+ """
+ get test option dict
+ """
+ test_opt = {}
+ self._wrt = False
+ self._xwalk = False
+ app_id = None
+ test_opt["suite_name"] = test_suite
+ test_opt["launcher"] = test_launcher
+ if test_widget is not None and test_widget != "":
+ test_suite = test_widget
+ if test_launcher.find('WRTLauncher') >= 0:
+ self._wrt = True
+ test_opt["launcher"] = WRT_MAIN
+ client_cmds = test_launcher.strip().split()
+ wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+ test_opt['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
+ test_opt['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
+ test_opt['self_exec'] = wrt_tag.find('a') != -1
+ test_opt['self_repeat'] = wrt_tag.find('r') != -1
+ app_id = self._get_wrt_app(test_suite, test_set, fuzzy_match, auto_iu)
+ elif test_launcher.find('xwalk') >= 0 and len(test_launcher) <= 16:
+ self._xwalk = True
+ test_opt["launcher"] = XWALK_MAIN
+ client_cmds = test_launcher.strip().split()
+ xpk_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+ test_opt['fuzzy_match'] = fuzzy_match = xpk_tag.find('z') != -1
+ test_opt['auto_iu'] = auto_iu = xpk_tag.find('iu') != -1
+ test_opt['self_exec'] = xpk_tag.find('a') != -1
+ test_opt['self_repeat'] = xpk_tag.find('r') != -1
+ app_id = self._get_xwalk_app(test_suite, test_set, fuzzy_match, auto_iu)
+ else:
+ app_id = test_launcher
+
+ if app_id is None:
+ return None
+ test_opt["test_app_id"] = app_id
+ return test_opt
+
+ def start_debug(self, dlogfile):
+ global debug_flag, metux
+ debug_flag = True
+
+ def stop_debug(self):
+ global debug_flag
+ debug_flag = False
+
+ def launch_app(self, wgt_name):
+ blauched = False
+ if self._wrt:
+ timecnt = 0
+ cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ cmdline = WRT_START_STR % (self.deviceid, wgt_name)
+ while timecnt < 3:
+ exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
+ if exit_code == "0":
+ blauched = True
+ break
+ timecnt += 1
+ time.sleep(3)
+ elif self._xwalk:
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ cmdline = XWALK_START_STR % (self.deviceid,TIZEN_USER, self.port, XWALK_MAIN, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ time.sleep(3)
+ blauched = True
+ else:
+ cmdline = APP_NONBLOCK_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ time.sleep(3)
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmd)
+ if ret and len(ret):
+ blauched = True
+
+ return blauched
+
+ def kill_app(self, wgt_name):
+ if self._wrt:
+ cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ elif self._xwalk:
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ return True
+
+ def install_app(self, wgt_path="", timeout=90):
+ if self._wrt:
+ cmd = WRT_INSTALL_STR % (self.deviceid, wgt_path)
+ elif self._xwalk:
+ if len(wgt_path)>0:
+ ext = wgt_path.split('.')[1]
+ cmd = XWALK_INSTALL_STR % (self.deviceid,TIZEN_USER, self.port,ext, wgt_path)
+ else:
+ return True
+ exit_code, ret = shell_command(cmd, timeout)
+ if exit_code == -1:
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_path)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ return False
+ else:
+ return True
+
+ def uninstall_app(self, wgt_name):
+ if self._wrt:
+ cmd = WRT_UNINSTL_STR % (self.deviceid, wgt_name)
+ elif self._xwalk:
+ cmd = XWALK_UNINSTL_STR % (self.deviceid, TIZEN_USER, self.port, wgt_name)
+ else:
+ return True
+ exit_code, ret = shell_command(cmd)
+ return True
+
+ def get_buildinfo(self):
+ """ get builf info"""
+ build_info = {}
+ build_info['buildid'] = ''
+ build_info['manufacturer'] = ''
+ build_info['model'] = ''
+ return build_info
+
+
+def get_target_conn(deviceid=None):
+ """ Get connection for Test Target"""
+ if deviceid is None or '@' not in deviceid:
+ raise InvalidDeviceException('deviceid("username@ip") required by SSH connection!')
+ return tizenIVI(deviceid)
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+
+""" The implementation of tizen localhost communication"""
+
+import os
+import time
+import socket
+import threading
+import re
+from shutil import copyfile
+
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+from testkitlite.util.killall import killall
+
+HOST_NS = "127.0.0.1"
+os.environ['no_proxy'] = HOST_NS
+os.environ['TEST_PLATFORM'] = 'tizen'
+os.environ['CONNECT_TYPE'] = 'local'
+RPM_INSTALL = "rpm -ivh %s"
+RPM_UNINSTALL = "rpm -e %s"
+RPM_LIST = "rpm -qa | grep tct | grep -v grep"
+APP_QUERY_STR = "ps aux |grep '%s'|grep -v grep|awk '{print $2}'"
+APP_KILL_STR = "kill -9 %s"
+APP_NONBLOCK_STR = "%s &"
+
+# wrt-launcher constants
+WRT_MAIN = "wrt-launcher"
+WRT_QUERY_STR = "wrt-launcher -l | grep '%s'|awk '{print $2\":\"$NF}'"
+WRT_START_STR = "wrt-launcher -s %s"
+WRT_STOP_STR = "wrt-launcher -k %s"
+WRT_INSTALL_STR = "wrt-installer -i %s"
+WRT_UNINSTL_STR = "wrt-installer -un %s"
+WRT_LOCATION = "/opt/usr/media/tct/opt/%s/%s.wgt"
+
+# crosswalk constants
+#XWALK_MAIN = "xwalkctl"
+XWALK_MAIN = os.environ.get("Launcher","app_launcher -s")
+if cmp(XWALK_MAIN, 'app_launcher') == 0:
+ XWALK_MAIN = "app_launcher -s "
+#XWALK_MAIN = "open_app"
+#XWALK_QUERY_STR = "ail_list | grep -w %s | awk '{print $(NF-1)}'"
+XWALK_QUERY_STR = "app_launcher -l | grep -w %s | awk '{print $2}'"
+#XWALK_START_STR = "xwalk-launcher %s &"
+XWALK_START_STR = "%s %s &"
+#XWALK_INSTALL_STR = "xwalkctl --install %s"
+XWALK_INSTALL_STR = "pkgcmd --install -t %s -p %s -q"
+XWALK_UNINSTL_STR = "pkgcmd -u -t wgt -q -n %s"
+#XWALK_UNINSTL_STR = "xwalkctl --uninstall %s"
+XWALK_LOCATION = "/opt/usr/media/tct/opt/%s/%s.wgt"
+DLOG_CLEAR = "dlogutil -c"
+DLOG_WRT = "dlogutil WRT:D -v threadtime"
+TIZEN_USER = os.environ.get('TIZEN_USER','app')
+
+def debug_trace(cmdline, logfile):
+ global debug_flag, metux
+ wbuffile = file(logfile, "w")
+ import subprocess
+ exit_code = None
+ proc = subprocess.Popen(args=cmdline,
+ shell=True,
+ stdout=wbuffile,
+ stderr=None)
+ while True:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+ time.sleep(0.5)
+ metux.acquire()
+ proc_flag = debug_flag
+ metux.release()
+ if not proc_flag:
+ break
+ wbuffile.close()
+ if exit_code is None:
+ killall(proc.pid)
+
+
+class tizenHost:
+
+ """ Implementation for transfer data on TIZEN localhost
+ """
+
+ def __init__(self):
+ self.deviceid = "localhost"
+ self._wrt = False
+ self._xwalk = False
+ self.support_remote = False
+
+ def is_support_remote(self):
+ return self.support_remote
+
+ def shell_cmd(self, cmd="", timeout=15):
+ return shell_command(cmd, timeout)
+
+ def check_process(self, process_name):
+ exit_code, ret = shell_command(APP_QUERY_STR % process_name)
+ return len(ret)
+
+ def kill_stub(self):
+ #add this function to avoid webdriver issue if stub exists, yangx.zhou@intel.com
+ cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2}'"
+ exit_code, ret = self.shell_cmd(cmdline)
+ if exit_code == 0 and len(ret) > 0:
+ cmdline = "kill -9 %s" %ret[0]
+ exit_code, ret = self.shell_cmd(cmdline)
+ time.sleep(1)
+
+ def launch_stub(self, stub_app, stub_port="8000", debug_opt=""):
+ self.kill_stub()
+ cmdline = "%s --port:%s %s" % (stub_app, stub_port, debug_opt)
+ exit_code, ret = self.shell_cmd(cmdline)
+ time.sleep(2)
+
+ def shell_cmd_ext(self,
+ cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None):
+ usr = TIZEN_USER + '_user@'
+ if cmd.startswith(usr):
+ cmd = cmd[9:]
+ return shell_command_ext(cmd, timeout, boutput, stdout_file, stderr_file)
+
+ def get_device_ids(self):
+ """
+ get device list of ids
+ """
+ return ['localhost']
+
+ def get_device_info(self):
+ """
+ get tizenpc device inforamtion
+ """
+ device_info = {}
+ resolution_str = ""
+ screen_size_str = ""
+ device_model_str = ""
+ device_name_str = ""
+ build_id_str = ""
+ os_version_str = ""
+
+ # get resolution and screen size
+ exit_code, ret = shell_command("xrandr")
+ pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
+ for line in ret:
+ match = pattern.search(line)
+ if match:
+ resolution_str = "%s x %s" % (match.group(1), match.group(2))
+ screen_size_str = "%s x %s" % (match.group(3), match.group(4))
+
+ # get architecture
+ exit_code, ret = shell_command("uname -m")
+ if len(ret) > 0:
+ device_model_str = ret[0]
+
+ # get hostname
+ exit_code, ret = shell_command("uname -n")
+ if len(ret) > 0:
+ device_name_str = ret[0]
+
+ # get os version
+ exit_code, ret = shell_command("cat /etc/issue")
+ for line in ret:
+ if len(line) > 1:
+ os_version_str = "%s %s" % (os_version_str, line)
+
+ # get build id
+ exit_code, ret = shell_command("cat /etc/os-release")
+ for line in ret:
+ if line.find("BUILD_ID=") != -1:
+ build_id_str = line.split('=')[1].strip('\"\r\n')
+
+ os_version_str = os_version_str[0:-1]
+ device_info["device_id"] = self.deviceid
+ device_info["resolution"] = resolution_str
+ device_info["screen_size"] = screen_size_str
+ device_info["device_model"] = device_model_str
+ device_info["device_name"] = device_name_str
+ device_info["os_version"] = os_version_str
+ device_info["build_id"] = build_id_str
+ return device_info
+
+ def get_server_url(self, remote_port="8000"):
+ """get server url"""
+ url_forward = "http://%s:%s" % (HOST_NS, remote_port)
+ return url_forward
+
+ def install_package(self, pkgpath):
+ """
+ install a package on tizenpc device
+ """
+ cmd = RPM_INSTALL % pkgpath
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def install_package(self, pkgname):
+ """
+ install a package on tizenpc device
+ """
+ cmd = RPM_UNINSTALL % pkgname
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def get_installed_package(self):
+ """get list of installed package from device"""
+ cmd = RPM_LIST
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def download_file(self, remote_path, local_path):
+ """download file"""
+ copyfile(remote_path, local_path)
+ return True
+
+ def upload_file(self, remote_path, local_path):
+ """upload file"""
+ copyfile(local_path, remote_path)
+ return True
+
+ def _get_wrt_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+ test_app_id = None
+ if auto_iu:
+ test_wgt = test_set
+ test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
+ if not self.install_app(test_wgt_path):
+ LOGGER.info("[ failed to install widget \"%s\" in target ]"
+ % test_wgt)
+ return None
+ else:
+ test_wgt = test_suite
+
+ # check if widget installed already
+ cmd = WRT_QUERY_STR % (test_wgt)
+ exit_code, ret = shell_command(cmd)
+ if exit_code == -1:
+ return None
+ for line in ret:
+ items = line.split(':')
+ if len(items) < 1:
+ continue
+ if (fuzzy_match and items[0].find(test_wgt) != -1) or items[0] == test_wgt:
+ test_app_id = items[1].strip('\r\n')
+ break
+
+ if test_app_id is None:
+ LOGGER.info("[ test widget \"%s\" not found in target ]"
+ % test_wgt)
+ return None
+
+ return test_app_id
+
+ def _get_xwalk_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+ test_app_id = None
+ if auto_iu:
+ test_wgt = test_set
+ test_wgt_path = XWALK_LOCATION % (test_suite, test_wgt)
+ if not self.install_app(test_wgt_path):
+ LOGGER.info("[ failed to install widget \"%s\" in target ]"
+ % test_wgt)
+ return None
+ else:
+ test_wgt = test_suite
+
+ # check if widget installed already
+ cmd = XWALK_QUERY_STR % (test_wgt)
+ exit_code, ret = shell_command(cmd)
+ if exit_code == -1:
+ return None
+ for line in ret:
+ test_app_id = line.strip('\r\n')
+
+ if test_app_id is None:
+ LOGGER.info("[ test widget \"%s\" not found in target ]"
+ % test_wgt)
+ return None
+
+ return test_app_id
+
+ def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+ """
+ get test option dict
+ """
+ test_opt = {}
+ self._wrt = False
+ self._xwalk = False
+ app_id = None
+ test_opt["suite_name"] = test_suite
+ test_opt["launcher"] = test_launcher
+ if test_widget is not None and test_widget != "":
+ test_suite = test_widget
+ if test_launcher.find('WRTLauncher') >= 0:
+ self._wrt = True
+ test_opt["launcher"] = WRT_MAIN
+ client_cmds = test_launcher.strip().split()
+ wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+ test_opt['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
+ test_opt['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
+ test_opt['self_exec'] = wrt_tag.find('a') != -1
+ test_opt['self_repeat'] = wrt_tag.find('r') != -1
+ app_id = self._get_wrt_app(test_suite, test_set, fuzzy_match, auto_iu)
+ elif test_launcher.find('xwalk') >= 0 and len(test_launcher) <= 16:
+ self._xwalk = True
+ test_opt["launcher"] = XWALK_MAIN
+ client_cmds = test_launcher.strip().split()
+ xpk_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+ test_opt['fuzzy_match'] = fuzzy_match = xpk_tag.find('z') != -1
+ test_opt['auto_iu'] = auto_iu = xpk_tag.find('iu') != -1
+ test_opt['self_exec'] = xpk_tag.find('a') != -1
+ test_opt['self_repeat'] = xpk_tag.find('r') != -1
+ app_id = self._get_xwalk_app(test_suite, test_set, fuzzy_match, auto_iu)
+ else:
+ app_id = test_launcher
+
+ if app_id is None:
+ return None
+ test_opt["test_app_id"] = app_id
+ return test_opt
+
+ def start_debug(self, dlogfile):
+ global debug_flag, metux
+ debug_flag = True
+ metux = threading.Lock()
+
+ def stop_debug(self):
+ global debug_flag, metux
+ metux.acquire()
+ debug_flag = False
+ metux.release()
+
+ def launch_app(self, wgt_name):
+ blauched = False
+ if self._wrt:
+ timecnt = 0
+ cmdline = WRT_STOP_STR % (wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ cmdline = WRT_START_STR % (wgt_name)
+ while timecnt < 3:
+ exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
+ if exit_code == "0":
+ blauched = True
+ break
+ timecnt += 1
+ time.sleep(3)
+ elif self._xwalk:
+ cmd = APP_QUERY_STR % (wgt_name)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ cmdline = XWALK_START_STR % (XWALK_MAIN, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ time.sleep(3)
+ blauched = True
+ else:
+ cmdline = APP_NONBLOCK_STR % (wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ time.sleep(3)
+ cmd = APP_QUERY_STR % (wgt_name)
+ exit_code, ret = shell_command(cmd)
+ if ret and len(ret):
+ blauched = True
+
+ return blauched
+
+ def kill_app(self, wgt_name):
+ if self._wrt:
+ cmdline = WRT_STOP_STR % (wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ elif self._xwalk:
+ cmd = APP_QUERY_STR % (wgt_name)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ return True
+
+ def install_app(self, wgt_path="", timeout=90):
+ if self._wrt:
+ cmd = WRT_INSTALL_STR % (wgt_path)
+ elif self._xwalk:
+ ext = wgt_path.split(".")[1]
+ cmd = XWALK_INSTALL_STR % (ext, wgt_path)
+ else:
+ return True
+ exit_code, ret = shell_command(cmd, timeout)
+ if exit_code == -1:
+ cmd = APP_QUERY_STR % (wgt_path)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ return False
+ else:
+ return True
+
+ def uninstall_app(self, wgt_name):
+ if self._wrt:
+ cmd = WRT_UNINSTL_STR % (wgt_name)
+ elif self._xwalk:
+ cmd = XWALK_UNINSTL_STR % (wgt_name)
+ else:
+ return True
+ exit_code, ret = shell_command(cmd)
+ return True
+
+ def get_buildinfo(self):
+ """ get builf info"""
+ build_info = {}
+ build_info['buildid'] = ''
+ build_info['manufacturer'] = ''
+ build_info['model'] = ''
+ return build_info
+
+
+def get_target_conn():
+ """ Get connection for Test Target"""
+ return tizenHost()
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+
+""" The implementation of TIZEN mobile communication"""
+
+import os
+import time
+import socket
+import threading
+import re
+import shutil
+import ConfigParser
+import xml.etree.ElementTree as etree
+import platform
+
+from testkitlite.util.log import LOGGER
+from testkitlite.util.autoexec import shell_command, shell_command_ext
+from testkitlite.util.killall import killall
+from testkitlite.util.errors import InvalidDeviceException
+
+EXISTS = os.path.exists
+
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = ConfigParser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+DEVICE_USER_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
+
+os.environ['TEST_PLATFORM'] = 'tizen'
+os.environ['CONNECT_TYPE'] = 'sdb'
+LOCAL_HOST_NS = "127.0.0.1"
+BUILD_INFO_FILE = os.path.join(DEVICE_SUITE_TARGET_30,'Documents/tct/buildinfo.xml')
+RPM_INSTALL = "sdb -s %s shell rpm -ivh %s"
+RPM_UNINSTALL = "sdb -s %s shell rpm -e %s"
+RPM_LIST = "sdb -s %s shell \"rpm -qa|grep tct\""
+
+APP_QUERY_STR = "sdb -s %s shell \"ps aux|grep '%s'|grep -v grep\"|awk '{print $2}'"
+STUB_KILL_STR = "sdb -s %s shell \"ps aux|grep '%s'|grep -v grep\"|awk '{print $2}'|xargs kill -9"
+APP_KILL_STR = "sdb -s %s shell kill -9 %s"
+APP_NONBLOCK_STR = "sdb -s %s shell '%s' &"
+SDB_COMMAND = "sdb -s %s shell '%s'"
+SDB_COMMAND_RTN = "sdb -s %s shell '%s; echo returncode=$?'"
+#SDB_COMMAND_APP = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;%s;echo returncode=$?'"
+#SDB_COMMAND_APP = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s;echo returncode=$?'"
+SDB_COMMAND_APP = """sdb -s %s shell 'su - %s -c "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s";echo returncode=$?'"""
+
+# wrt-launcher constants
+
+WRT_MAIN = "wrt-launcher"
+WRT_QUERY_STR = "sdb -s %s shell wrt-launcher -l | grep '%s'|awk '{print $2\":\"$NF}'"
+WRT_START_STR = "sdb -s %s shell 'wrt-launcher -s %s; echo returncode=$?'"
+WRT_STOP_STR = "sdb -s %s shell wrt-launcher -k %s"
+WRT_INSTALL_STR = "sdb -s %s shell wrt-installer -i %s"
+WRT_UNINSTL_STR = "sdb -s %s shell wrt-installer -un %s"
+WRT_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
+WRT_SMACK_STR = "sdb -s %s shell 'echo \"User::Shell User::Pkg::%s rwx\" | smackload'"
+WRT_SMACK_REV_STR = "sdb -s %s shell 'echo \"User::Pkg::%s User::Shell rwx\" | smackload'"
+#default user is changed "app" to "owner"
+#jh0219.han@samsung.com
+
+# crosswalk constants
+#XWALK_MAIN = "xwalkctl"
+#XWALK_MAIN = "open_app"
+XWALK_MAIN = os.environ.get("Launcher","app_launcher -s")
+if cmp(XWALK_MAIN,'app_launcher') == 0:
+ XWALK_MAIN = 'app_launcher -s '
+#XWALK_QUERY_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;ail_list' | grep -w %s | awk '{print $(NF-1)}'"
+XWALK_QUERY_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;app_launcher -l' | grep -w %s | awk '{print $2}'"
+#XWALK_QUERY_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl' | grep -w %s | awk '{print $(NF-1)}'"
+#XWALK_START_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;launch_app %s' &"
+XWALK_START_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s %s' &"
+#XWALK_START_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;xwalk-launcher %s' &"
+XWALK_INSTALL_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -i -t %s -p %s -q'"
+#XWALK_INSTALL_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --install %s'"
+XWALK_UNINSTL_STR = "sdb -s %s shell su - %s -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;pkgcmd -u -t wgt -q -n %s'"
+#XWALK_UNINSTL_STR = "sdb -s %s shell su - app -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/5000/dbus/user_bus_socket;xwalkctl --uninstall %s'"
+XWALK_LOCATION = os.path.join(DEVICE_SUITE_TARGET_30, "tct/opt/%s/%s.wgt")
+#default user is changed "app" to "owner"
+#jh0219.han@samsung.com
+
+# redefine constants for windows
+if platform.system() == "Windows":
+ APP_QUERY_STR = 'sdb -s %s shell "ps aux|grep %s|grep -v grep |awk \'{print $2}\'"'
+ SDB_COMMAND = 'sdb -s %s shell "%s"'
+ SDB_COMMAND_RTN = 'sdb -s %s shell "%s; echo returncode=$?"'
+ SDB_COMMAND_APP = 'sdb -s %s shell \"su - %s -c \"export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;%s\";echo returncode=$?\"'
+ WRT_START_STR = 'sdb -s %s shell "wrt-launcher -s %s; echo returncode=$?"'
+ XWALK_QUERY_STR = 'sdb -s %s shell su - %s -c "export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%s/dbus/user_bus_socket;app_launcher -l | grep -w %s | awk \'{print \$2}\'"'
+
+XWALK_QUERY_ID = "sdb -s %s shell 'id -u %s'"
+
+temp_tuser = DEVICE_USER_30.split('/')
+
+if not temp_tuser:
+ TIZEN_USER = 'owner'
+else:
+ TIZEN_USER = temp_tuser[0]
+
+LOGGER.debug('testkit-lite current user : %s' % str(TIZEN_USER))
+
+#TIZEN_USER = os.environ.get('TIZEN_USER','owner').strip()
+#default user is changed "app" to "owner"
+#jh0219.han@samsung.com
+
+#print os.environ['tizen_user']
+# dlog constants
+DLOG_CLEAR = "sdb -s %s shell dlogutil -c"
+DLOG_WRT = "sdb -s %s shell dlogutil -v threadtime"
+
+def debug_trace(cmdline, logfile):
+ global debug_flag, metux
+ wbuffile = file(logfile, "a")
+ import subprocess
+ exit_code = None
+ proc = subprocess.Popen(args=cmdline,
+ shell=True,
+ stdout=wbuffile,
+ stderr=None)
+ while True:
+ exit_code = proc.poll()
+ if exit_code is not None:
+ break
+ time.sleep(0.5)
+ metux.acquire()
+ proc_flag = debug_flag
+ metux.release()
+ if not proc_flag:
+ break
+ wbuffile.close()
+ if exit_code is None:
+ killall(proc.pid)
+
+
+def _get_device_ids():
+ """get tizen device list of ids"""
+ result = []
+ exit_code, ret = shell_command("sdb start-server")
+ exit_code, ret = shell_command("sdb devices")
+ for line in ret:
+ if str.find(line, "\tdevice") != -1:
+ result.append(line.split("\t")[0])
+ return result
+
+class TizenMobile:
+
+ """
+ Implementation for transfer data
+ between Host and Tizen Mobile Device
+ """
+
+ def __init__(self, device_id=None):
+ self.deviceid = device_id
+ self.is_NE = 0
+ if self.deviceid and str(self.deviceid).find('NE') > -1:
+ self.is_NE = int(self.deviceid.split(':')[1].split('_')[0])
+ self.deviceid = self.deviceid.split('_')[1]
+ self._wrt = False
+ self._xwalk = False
+ self.support_remote = True
+ self.get_user_id()
+
+#default user is changed "app" to "owner"
+#jh0219.han@samsung.com
+
+ def is_NE_mode(self):
+ return self.is_NE
+
+ def get_devid(self):
+ return self.deviceid
+
+ def get_user_id(self):
+ if TIZEN_USER == 'owner':
+ self.port = '5000'
+ else:
+ cmdline = XWALK_QUERY_ID % (self.deviceid, TIZEN_USER)
+ exit_code, ret = shell_command(cmdline)
+ if exit_code == -1:
+ LOGGER.info("[ can not get user id ]")
+ if len(ret) >0 :
+ self.port = ret[0]
+
+ def is_support_remote(self):
+ return self.support_remote
+
+ def shell_cmd(self, cmd="", timeout=15):
+ cmdline = SDB_COMMAND % (self.deviceid, cmd)
+ return shell_command(cmdline, timeout)
+
+ def check_process(self, process_name):
+ exit_code, ret = shell_command(
+ APP_QUERY_STR % (self.deviceid, process_name))
+ return len(ret)
+
+ def kill_stub(self):
+ #add this function to avoid webdriver issue if stub exists running on device,yangx.zhou@intel.com
+ cmdline = "ps -aux | grep testkit-stub | grep -v grep | awk '{ print $2 }'"
+ exit_code, ret = self.shell_cmd(cmdline)
+ if exit_code == 0 and len(ret) >0:
+ cmdline = "kill -9 %s" %ret[0]
+ exit_code, ret = self.shell_cmd(cmdline)
+
+ def launch_stub(self, stub_app, stub_port, debug_opt=""):
+ #block OTCIS-3781
+ #self.kill_stub()
+ cmdline = "/opt/home/developer/%s --port:%s %s; sleep 2s" % \
+ (stub_app, stub_port, debug_opt)
+
+ exit_code, ret = self.shell_cmd(cmdline)
+ time.sleep(2)
+
+ def shell_cmd_ext(self,
+ cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None):
+ #if cmd.startswith('app_user@'):
+ #jh0219.han@samsung.com
+ #modified considering multi_user
+ usr = TIZEN_USER + '_user@'
+ usr_len = len(usr)
+ if cmd.startswith(usr):
+ cmdline = SDB_COMMAND_APP % (self.deviceid,TIZEN_USER, self.port, cmd[usr_len:])
+ else:
+ cmdline = SDB_COMMAND_RTN % (self.deviceid, cmd)
+ return shell_command_ext(cmdline, timeout, boutput, stdout_file, stderr_file)
+
+ def get_device_info(self):
+ """get tizen device inforamtion"""
+ device_info = {}
+ resolution_str = ""
+ screen_size_str = ""
+ device_model_str = ""
+ device_name_str = ""
+ build_id_str = ""
+ os_version_str = ""
+
+ # get resolution and screen size
+ exit_code, ret = shell_command(
+ "sdb -s %s shell xrandr" % self.deviceid)
+ pattern = re.compile("connected (\d+)x(\d+).* (\d+mm) x (\d+mm)")
+ for line in ret:
+ match = pattern.search(line)
+ if match:
+ resolution_str = "%s x %s" % (match.group(1), match.group(2))
+ screen_size_str = "%s x %s" % (match.group(3), match.group(4))
+
+ # get architecture
+ exit_code, ret = shell_command(
+ "sdb -s %s shell cat /etc/info.ini" % self.deviceid)
+ for line in ret:
+ if line.find("Model=") != -1:
+ device_model_str = str(line.split('=')[1]).replace(";","")
+ break
+
+ # get hostname
+ exit_code, ret = shell_command(
+ "sdb -s %s shell uname -n" % self.deviceid)
+ if len(ret) > 0:
+ device_name_str = ret[0]
+
+ # get os version
+ exit_code, ret = shell_command(
+ "sdb -s %s shell cat /etc/issue" % self.deviceid)
+ for line in ret:
+ if len(line) > 1:
+ os_version_str = "%s %s" % (os_version_str, line)
+
+ # get build id
+ exit_code, ret = shell_command(
+ "sdb -s %s shell cat /etc/os-release" % self.deviceid)
+ for line in ret:
+ if line.find("BUILD_ID=") != -1:
+ build_id_str = line.split('=')[1].strip('\"\r\n')
+
+ os_version_str = os_version_str[0:-1]
+ device_info["device_id"] = self.deviceid
+ device_info["resolution"] = resolution_str
+ device_info["screen_size"] = screen_size_str
+ device_info["device_model"] = device_model_str
+ device_info["device_name"] = device_name_str
+ device_info["os_version"] = os_version_str
+ device_info["build_id"] = build_id_str
+ return device_info
+
+ def get_server_url(self, remote_port="8000"):
+ """forward request a host tcp port to targe tcp port"""
+ if remote_port is None:
+ return None
+
+ os.environ['no_proxy'] = LOCAL_HOST_NS
+ host = LOCAL_HOST_NS
+ inner_port = 9000
+ time_out = 2
+ bflag = False
+ while True:
+ sock_inner = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+ sock_inner.settimeout(time_out)
+ try:
+ sock_inner.bind((host, inner_port))
+ sock_inner.close()
+ bflag = False
+ except socket.error as error:
+ if error.errno == 98 or error.errno == 13:
+ bflag = True
+ if bflag:
+ inner_port += 1
+ else:
+ break
+ host_port = str(inner_port)
+ cmd = "sdb -s %s forward tcp:%s tcp:%s" % \
+ (self.deviceid, host_port, remote_port)
+ exit_code, ret = shell_command(cmd)
+ url_forward = "http://%s:%s" % (host, host_port)
+ return url_forward
+
+ def download_file(self, remote_path, local_path):
+ """download file from device"""
+ local_path_dir = os.path.dirname(local_path)
+ if not os.path.exists(local_path_dir):
+ os.makedirs(local_path_dir)
+ filename = os.path.basename(remote_path)
+ cmd = "sdb -s %s pull %s %s" % (
+ self.deviceid, remote_path, local_path_dir)
+ exit_code, ret = shell_command(cmd)
+ if exit_code != 0:
+ error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+ LOGGER.info("[ Download file \"%s\" failed, error: %s ]"
+ % (remote_path, error))
+ return False
+ else:
+ src_path = os.path.join(local_path_dir, filename)
+ if src_path != local_path:
+ shutil.move(src_path, local_path)
+ return True
+
+ def upload_file(self, remote_path, local_path):
+ """upload file to device"""
+ cmd = "sdb -s %s push %s %s" % (self.deviceid, local_path, remote_path)
+ exit_code, ret = shell_command(cmd)
+ if exit_code != 0:
+ error = ret[0].strip('\r\n') if len(ret) else "sdb shell timeout"
+ LOGGER.info("[ Upload file \"%s\" failed,"
+ " get error: %s ]" % (local_path, error))
+ return False
+ else:
+ return True
+
+ def _get_wrt_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+ test_app_id = None
+ if auto_iu:
+ test_wgt = test_set
+ test_wgt_path = WRT_LOCATION % (test_suite, test_wgt)
+ if not self.install_app(test_wgt_path):
+ LOGGER.info("[ failed to install widget \"%s\" in target ]"
+ % test_wgt)
+ return None
+ else:
+ test_wgt = test_suite
+
+ # check if widget installed already
+ cmd = WRT_QUERY_STR % (self.deviceid, test_wgt)
+ exit_code, ret = shell_command(cmd)
+ if exit_code == -1:
+ return None
+ for line in ret:
+ items = line.split(':')
+ if len(items) < 1:
+ continue
+ if (fuzzy_match and items[0].find(test_wgt) != -1) or items[0] == test_wgt:
+ test_app_id = items[1].strip('\r\n')
+ break
+
+ if test_app_id is None:
+ LOGGER.info("[ test widget \"%s\" not found in target ]"
+ % test_wgt)
+ return None
+
+ return test_app_id
+
+ def _get_xwalk_app(self, test_suite, test_set, fuzzy_match, auto_iu):
+ test_app_id = None
+ if auto_iu:
+ test_wgt = test_set
+ test_wgt_path = XWALK_LOCATION % (test_suite, test_wgt)
+
+ if not self.install_app(test_wgt_path):
+ LOGGER.info("[ failed to install widget \"%s\" in target ]"
+ % test_wgt)
+ return None
+ else:
+ test_wgt = test_suite
+
+ # check if widget installed already
+ cmd = XWALK_QUERY_STR % (self.deviceid, TIZEN_USER, self.port, test_wgt)
+ exit_code, ret = shell_command(cmd)
+ if exit_code == -1:
+ return None
+ for line in ret:
+ test_app_id = line.strip('\r\n')
+ if test_app_id is None:
+ LOGGER.info("[ test widget \"%s\" not found in target ]"
+ % test_wgt)
+ return None
+
+ return test_app_id
+
+ def get_launcher_opt(self, test_launcher, test_ext, test_widget, test_suite, test_set):
+ """
+ get test option dict
+ """
+ test_opt = {}
+ self._wrt = False
+ self._xwalk = False
+ app_id = None
+ test_opt["suite_name"] = test_suite
+ test_opt["launcher"] = test_launcher
+ if test_widget is not None and test_widget != "":
+ test_suite = test_widget
+ if test_launcher.find('WRTLauncher') >= 0:
+ self._wrt = True
+ test_opt["launcher"] = WRT_MAIN
+ client_cmds = test_launcher.strip().split()
+ wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+ test_opt['fuzzy_match'] = fuzzy_match = wrt_tag.find('z') != -1
+ test_opt['auto_iu'] = auto_iu = wrt_tag.find('iu') != -1
+ test_opt['self_exec'] = wrt_tag.find('a') != -1
+ test_opt['self_repeat'] = wrt_tag.find('r') != -1
+ app_id = self._get_wrt_app(test_suite, test_set, fuzzy_match, auto_iu)
+ elif test_launcher.find('xwalk') >= 0 and len(test_launcher) <= 16:
+ self._xwalk = True
+ test_opt["launcher"] = XWALK_MAIN
+ client_cmds = test_launcher.strip().split()
+ xpk_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+ test_opt['fuzzy_match'] = fuzzy_match = xpk_tag.find('z') != -1
+ test_opt['auto_iu'] = auto_iu = xpk_tag.find('iu') != -1
+ test_opt['self_exec'] = xpk_tag.find('a') != -1
+ test_opt['self_repeat'] = xpk_tag.find('r') != -1
+ app_id = self._get_xwalk_app(test_suite, test_set, fuzzy_match, auto_iu)
+ else:
+ app_id = test_launcher
+
+ if app_id is None:
+ return None
+ length = len(app_id) - 1
+ #test_opt["test_app_id"] = '''%s''' % app_id[1:length]
+ test_opt["test_app_id"] = app_id
+ print app_id
+ cmd_app_id = app_id.split('.')[0]
+ cmd1 = WRT_SMACK_STR % (self.deviceid, cmd_app_id[1:])
+ cmd2 = WRT_SMACK_REV_STR % (self.deviceid, cmd_app_id[1:])
+ print cmd1
+ print cmd2
+
+ shell_command(cmd1)
+ shell_command(cmd2)
+
+ return test_opt
+
+ def install_package(self, pkgpath):
+ """install a package on tizen device:
+ push package and install with shell command
+ """
+ cmd = RPM_INSTALL % (self.deviceid, pkgpath)
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def uninstall_package(self, pkgname):
+ """install a package on tizen device:
+ push package and install with shell command
+ """
+ cmd = RPM_UNINSTALL % (self.deviceid, pkgname)
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def get_installed_package(self):
+ """get list of installed package from device"""
+ cmd = RPM_LIST % self.deviceid
+ exit_code, ret = shell_command(cmd)
+ return ret
+
+ def start_debug(self, dlogfile):
+ global debug_flag, metux
+ if self.is_NE_mode():
+ return
+ debug_flag = True
+ metux = threading.Lock()
+ cmdline = DLOG_CLEAR % self.deviceid
+ exit_code, ret = shell_command(cmdline)
+ cmdline = DLOG_WRT % self.deviceid
+ th = threading.Thread(target=debug_trace, args=(cmdline, dlogfile+'.dlog'))
+ th.setDaemon(True)
+ th.start()
+
+ def stop_debug(self):
+ global debug_flag, metux
+ if self.is_NE_mode():
+ return
+ metux.acquire()
+ debug_flag = False
+ metux.release()
+
+ def launch_app(self, wgt_name):
+ blauched = False
+ if self._wrt:
+ timecnt = 0
+ cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ cmdline = WRT_START_STR % (self.deviceid, wgt_name)
+ while timecnt < 3:
+ exit_code, ret_out, ret_err = shell_command_ext(cmdline, 30)
+ if exit_code == "0":
+ blauched = True
+ break
+ timecnt += 1
+ time.sleep(3)
+ elif self._xwalk:
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ cmdline = XWALK_START_STR % (self.deviceid, TIZEN_USER, self.port, XWALK_MAIN, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ time.sleep(3)
+ blauched = True
+ else:
+ cmdline = APP_NONBLOCK_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ time.sleep(3)
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmd)
+ if ret and len(ret):
+ blauched = True
+
+ return blauched
+
+ def kill_app(self, wgt_name):
+ if self._wrt:
+ cmdline = WRT_STOP_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmdline)
+ elif self._xwalk:
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_name)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ return True
+
+ def install_app(self, wgt_path="", timeout=90):
+ if self._wrt:
+ cmd = WRT_INSTALL_STR % (self.deviceid, wgt_path)
+ elif self._xwalk:
+ if len(wgt_path):
+ ext = wgt_path.split(".")[1]
+ cmd = XWALK_INSTALL_STR % (self.deviceid, TIZEN_USER, self.port, ext, wgt_path)
+ else:
+ return True
+ exit_code, ret = shell_command(cmd, timeout)
+ if exit_code == -1:
+ cmd = APP_QUERY_STR % (self.deviceid, wgt_path)
+ exit_code, ret = shell_command(cmd)
+ for line in ret:
+ cmd = APP_KILL_STR % (self.deviceid, line.strip('\r\n'))
+ exit_code, ret = shell_command(cmd)
+ return False
+ else:
+ return True
+
+ def uninstall_app(self, wgt_name):
+ if self._wrt:
+ cmd = WRT_UNINSTL_STR % (self.deviceid, TIZEN_USER, self.port, wgt_name)
+ elif self._xwalk:
+ cmd = XWALK_UNINSTL_STR % (self.deviceid, TIZEN_USER,self.port, wgt_name)
+ else:
+ return True
+ exit_code, ret = shell_command(cmd)
+ return True
+
+ def get_buildinfo(self, _tizenV):
+ """ get builf info"""
+ device_file = DEVICE_SUITE_TARGET_30 + '/Documents/tct/buildinfo.xml'
+
+ buildinfo_file = '/opt/testkit/lite3.0/' + self.deviceid + '/buildinfo.xml'
+ build_info = {}
+ build_info['buildid'] = ''
+ build_info['manufacturer'] = ''
+ build_info['model'] = ''
+
+ if self.download_file(device_file, buildinfo_file) \
+ and EXISTS(buildinfo_file):
+ root = etree.parse(buildinfo_file).getroot()
+ for element in root.findall("buildinfo"):
+ if element is not None:
+ if element.get("name").lower() == 'buildversion':
+ child = etree.Element.getchildren(element)
+ if child and child[0].text:
+ buildid = child[0].text
+ build_info['buildid'] = buildid
+ if element.get("name").lower() == 'manufacturer':
+ child = etree.Element.getchildren(element)
+ if child and child[0].text:
+ manufacturer = child[0].text
+ build_info['manufacturer'] = manufacturer
+ if element.get("name").lower() == 'model':
+ child = etree.Element.getchildren(element)
+ if child and child[0].text:
+ model = child[0].text
+ build_info['model'] = model
+ os.remove(buildinfo_file)
+ return build_info
+
+def get_target_conn(device_id=None):
+ """ Get connection for Test Target"""
+ if device_id is None:
+ dev_list = _get_device_ids()
+ if len(dev_list):
+ device_id = dev_list[0]
+ else:
+ raise InvalidDeviceException('No TIZEN device found!')
+ return TizenMobile(device_id)
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitliteenginesdir = /usr/lib/python2.7/dist-packages/testkitlite/engines
+dist_testkitliteengines_SCRIPTS = *.py
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+""" The implementation of pyunit test engine"""
+
+import os
+import time
+import sys
+import threading
+import uuid
+import StringIO
+import unittest
+from unittest import TestResult
+from datetime import datetime
+from testkitlite.util.log import LOGGER
+from testkitlite.util.result import TestSetResut
+
+
+ANDROID_UNIT_STATUS = "INSTRUMENTATION_STATUS:"
+ANDROID_UNIT_STATUS_CODE = "INSTRUMENTATION_STATUS_CODE:"
+ANDROID_UNIT_STATUS_LEN = len(ANDROID_UNIT_STATUS)
+ANDROID_UNIT_STATUS_CODE_LEN = len(ANDROID_UNIT_STATUS_CODE)
+ANDROID_UNIT_START = "am instrument -r -w -e class %s %s/android.test.InstrumentationTestRunner"
+DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
+result_buffer = None
+
+
+def _case_create(case_class, case_id, purpose, status, message):
+ _case = dict()
+ _case['case_class'] = case_class
+ _case['case_id'] = case_id
+ _case['purpose'] = case_id
+ _case['start_at'] = datetime.now().strftime(DATE_FORMAT_STR)
+ if status == '-2':
+ _case['result'] = 'FAIL'
+ elif status == '0':
+ _case['result'] = 'PASS'
+ _case['stdout'] = '[message]' + message
+ _case['end_at'] = datetime.now().strftime(DATE_FORMAT_STR)
+ return _case
+
+
+def _adunit_lines_handler(outstr):
+ """android unittest result wrapper"""
+ lines = outstr.split('\r\n')
+ results = []
+ b_stack = False
+ case_class=case_id = purpose = result = message = ''
+ for line in lines:
+ #print 'debug', line
+ if line.startswith(ANDROID_UNIT_STATUS):
+ content = line[ANDROID_UNIT_STATUS_LEN:].strip()
+ if content.startswith('class='):
+ case_class = content[content.find('class=')+6:]
+ elif content.startswith('test='):
+ result = message = ''
+ b_stack = False
+ case_id = content[content.find('test=')+5:]
+ purpose = case_id
+ elif content.startswith('stack='):
+ message = content[content.find('stack=')+6:]
+ b_stack = True
+ elif line.startswith(ANDROID_UNIT_STATUS_CODE):
+ status = line[ANDROID_UNIT_STATUS_CODE_LEN:].strip()
+ if status != '1': # FAIL / PASS
+ results.append(_case_create(case_class, case_id, purpose, status, message))
+ # print 'debug', results
+ else:
+ if b_stack:
+ message += line
+ result_buffer.extend_result(results)
+
+
+def _adunit_test_exec(conn, test_session, test_set_path, result_obj):
+ """function for running core tests"""
+ global result_buffer
+ result_buffer = result_obj
+ result_obj.set_status(0)
+ for tc in test_set_path['cases']:
+ # LOGGER.info('[ android unit test, entry: %s ]' % test_set_path)
+ # test_cmd = ANDROID_UNIT_START % (test_set_path, '.'.join(test_set_path.split('.')[:-1]))
+ # _code, _out, _error = conn.shell_cmd_ext(cmd=test_cmd, timeout=None, boutput=True, callbk=_adunit_lines_handler)
+ # result_obj.set_status(1)
+ LOGGER.info('[ android unit test, entry: %s ]' % tc['entry'])
+ test_cmd = ANDROID_UNIT_START % (tc['entry'], '.'.join(tc['entry'].split('.')[:-1]))
+ _code, _out, _error = conn.shell_cmd_ext(cmd=test_cmd, timeout=None, boutput=True, callbk=_adunit_lines_handler)
+ result_obj.set_status(1)
+
+class TestWorker(object):
+
+ """Test executor for testkit-lite"""
+
+ def __init__(self, conn):
+ super(TestWorker, self).__init__()
+ self.conn = conn
+ self.server_url = None
+ self.result_obj = None
+ self.opts = dict({'block_size': 300,
+ 'test_type': None,
+ 'auto_iu': False,
+ 'fuzzy_match': False,
+ 'self_exec': False,
+ 'self_repeat': False,
+ 'debug_mode': False
+ })
+
+ def init_test(self, params):
+ """init the test envrionment"""
+ self.opts['testset_name'] = params.get('testset-name', '')
+ self.opts['testsuite_name'] = params.get('testsuite-name', '')
+ self.opts['debug_log_base'] = params.get("debug-log-base", '')
+ return str(uuid.uuid1())
+
+ def run_test(self, sessionid, test_set):
+ """
+ process the execution for a test set
+ """
+ #print 'debug', test_set
+ if sessionid is None:
+ return False
+ disabledlog = os.environ.get("disabledlog","")
+ # start debug trace thread
+ if len(disabledlog) > 1:
+ pass
+ else:
+ self.conn.start_debug(self.opts['debug_log_base'])
+ time.sleep(1)
+ self.result_obj = TestSetResut(
+ self.opts['testsuite_name'], self.opts['testset_name'])
+ self.opts['async_th'] = threading.Thread(
+ target=_adunit_test_exec,
+ args=(self.conn, sessionid, test_set, self.result_obj)
+ )
+ # self.opts['async_th'] = threading.Thread(
+ # target=_adunit_test_exec,
+ # args=(self.conn, sessionid, test_set['test_set_src'], self.result_obj)
+ # )
+ self.opts['async_th'].start()
+ return True
+
+ def get_test_status(self, sessionid):
+ """poll the test task status"""
+ if sessionid is None:
+ return None
+ result = {}
+ result["msg"] = []
+ result["finished"] = str(self.result_obj.get_status())
+ return result
+
+ def get_test_result(self, sessionid):
+ """get the test result for a test set """
+ result = {}
+ if sessionid is None:
+ return result
+
+ result = self.result_obj.get_result()
+ return result
+
+ def finalize_test(self, sessionid):
+ """clear the test stub and related resources"""
+ if sessionid is None:
+ return False
+
+ if self.result_obj is not None:
+ self.result_obj.set_status(1)
+
+ # stop debug thread
+ self.conn.stop_debug()
+
+ return True
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+""" The implementation of default test engine"""
+
+import os
+import time
+import threading
+import uuid
+import ConfigParser
+
+from datetime import datetime
+from testkitlite.util.log import LOGGER
+from testkitlite.util.httprequest import get_url, http_request
+from testkitlite.util.result import TestSetResut
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = ConfigParser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+
+CNT_RETRY = 10
+DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
+UIFW_MAX_TIME = 300
+UIFW_MAX_WRITE_TIME = 10
+UIFW_RESULT = os.path.join(DEVICE_SUITE_TARGET_30, "Documents/tcresult")
+UIFW_SET_NUM = 0
+LAUNCH_ERROR = 1
+BLOCK_ERROR = 3
+FILES_ROOT = os.path.expanduser("~") + os.sep
+
+
+def _core_test_exec(conn, test_session, test_set_name, exetype, \
+ cases_queue, result_obj):
+ """function for running core tests"""
+ exetype = exetype.lower()
+ total_count = len(cases_queue)
+ current_idx = 0
+ manual_skip_all = False
+ result_list = []
+ stdout_file = FILES_ROOT + test_session + "_stdout.log"
+ stderr_file = FILES_ROOT + test_session + "_stderr.log"
+ initscript = os.environ.get('initscript', '')
+ postscript = os.environ.get('postscript', '')
+ for test_case in cases_queue:
+ if result_obj.get_status() == 1:
+ break
+
+ current_idx += 1
+ core_cmd = ""
+ if "entry" in test_case:
+ core_cmd = test_case["entry"]
+ else:
+ LOGGER.info(
+ "[ Warnning: test script is empty,"
+ " please check your test xml file ]")
+ continue
+ expected_result = test_case.get('expected_result', '0')
+ time_out = int(test_case.get('timeout', '90'))
+ location = test_case.get('location', 'device')
+ measures = test_case.get('measures', [])
+ retmeasures = []
+ os.environ['CASE_ID'] = test_case['case_id']
+
+ LOGGER.info("\n[%s:%s] TestCase: %s\n"
+ "TestEntry: %s"
+ % (current_idx, total_count, test_case['case_id'], core_cmd))
+
+ strtime = datetime.now().strftime(DATE_FORMAT_STR)
+ LOGGER.info("start: %s" % strtime)
+ test_case["start_at"] = strtime
+ if exetype == 'auto':
+ return_code, stdout, stderr = -1, [], []
+ if location == 'host':
+ if len(initscript) > 1:
+ return_code, stdout, stderr = \
+ conn.shell_cmd_host(initscript, time_out, False, \
+ stdout_file, stderr_file)
+
+ if return_code is not None and return_code != "timeout":
+ LOGGER.info('init script ok')
+ else:
+ LOGGER.info('init script fail')
+ return_code, stdout, stderr = -1, [], []
+ return_code, stdout, stderr = \
+ conn.shell_cmd_host(core_cmd, time_out, False, \
+ stdout_file, stderr_file)
+ else:
+ if len(initscript) > 1:
+ return_code, stdout, stderr = \
+ conn.shell_cmd_ext(initscript, time_out, False, \
+ stdout_file, stderr_file)
+ if return_code is not None and return_code != "timeout":
+ LOGGER.info('init script ok')
+ else:
+ LOGGER.info('init script fail')
+ return_code, stdout, stderr = -1, [], []
+ return_code, stdout, stderr = \
+ conn.shell_cmd_ext(core_cmd, time_out, False, \
+ stdout_file, stderr_file)
+ print 'return ', return_code, stdout, stderr
+ if return_code is not None and return_code != "timeout":
+ test_case["result"] = "pass" if str(
+ return_code) == expected_result else "fail"
+ test_case["stdout"] = stdout
+ test_case["stderr"] = stderr
+ for item in measures:
+ ind = item['name']
+ fname = item['file']
+ if fname is None:
+ continue
+ tmpname = FILES_ROOT + test_session + "_mea_tmp"
+ if conn.download_file(fname, tmpname):
+ try:
+ config = ConfigParser.ConfigParser()
+ config.read(tmpname)
+ item['value'] = config.get(ind, 'value')
+ retmeasures.append(item)
+ os.remove(tmpname)
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: fail to parse value,"
+ " error:%s ]\n" % error)
+ test_case["measures"] = retmeasures
+ else:
+ test_case["result"] = "BLOCK"
+ test_case["stdout"] = stdout
+ test_case["stderr"] = stderr
+ elif exetype == 'manual':
+ # handle manual core cases
+ try:
+ # LOGGER.infopre-condition info
+ if "pre_condition" in test_case:
+ LOGGER.info("\n****\nPre-condition: %s\n ****\n"
+ % test_case['pre_condition'])
+ # LOGGER.infostep info
+ if "steps" in test_case:
+ for step in test_case['steps']:
+ LOGGER.info(
+ "********************\n"
+ "Step Order: %s" % step['order'])
+ LOGGER.info("Step Desc: %s" % step['step_desc'])
+ LOGGER.info(
+ "Expected: %s\n********************\n"
+ % step['expected'])
+ if manual_skip_all:
+ test_case["result"] = "N/A"
+ else:
+ while True:
+ test_result = raw_input(
+ '[ please input case result ]'
+ ' (p^PASS, f^FAIL, b^BLOCK, n^Next, d^Done):')
+ if test_result.lower() == 'p':
+ test_case["result"] = "PASS"
+ break
+ elif test_result.lower() == 'f':
+ test_case["result"] = "FAIL"
+ break
+ elif test_result.lower() == 'b':
+ test_case["result"] = "BLOCK"
+ break
+ elif test_result.lower() == 'n':
+ test_case["result"] = "N/A"
+ break
+ elif test_result.lower() == 'd':
+ manual_skip_all = True
+ test_case["result"] = "N/A"
+ break
+ else:
+ LOGGER.info(
+ "[ Warnning: you input: '%s' is invalid,"
+ " please try again ]" % test_result)
+ except IOError as error:
+ LOGGER.info(
+ "[ Error: fail to get core manual test step,"
+ " error: %s ]\n" % error)
+ strtime = datetime.now().strftime(DATE_FORMAT_STR)
+ LOGGER.info("end : %s" % strtime)
+ test_case["end_at"] = strtime
+ LOGGER.info("execute case: %s" % test_case["result"])
+ result_list.append(test_case)
+ if len(postscript) > 1:
+ if location == 'host':
+ return_code, stdout, stderr = \
+ conn.shell_cmd_host(postscript, time_out, False, \
+ stdout_file, stderr_file)
+ if return_code is not None and return_code != "timeout":
+ LOGGER.info('post script ok')
+ else:
+ LOGGER.info('post script fail')
+
+ else:
+ if postscript is not None or postscript is not '':
+ return_code, stdout, stderr = \
+ conn.shell_cmd_ext(postscript, time_out, False, \
+ stdout_file, stderr_file)
+ if return_code is not None and return_code != "timeout":
+ LOGGER.info('post script ok')
+ else:
+ LOGGER.info('post script fail')
+
+ result_obj.extend_result(result_list, False)
+ result_obj.set_status(1)
+
+
+def _web_test_exec(conn, server_url, test_web_app, exetype, \
+ cases_queue, result_obj):
+ """function for running web tests"""
+ exetype = exetype.lower()
+ test_set_finished = False
+ err_cnt = 0
+ for test_group in cases_queue:
+ if test_set_finished:
+ break
+
+ ret = http_request(
+ get_url(server_url, "/set_testcase"), "POST", test_group, 30)
+ if ret is None:
+ LOGGER.error(
+ "[ set testcases timeout, please check device! ]")
+ result_obj.set_status(1)
+ break
+
+ if not conn.launch_app(test_web_app):
+ LOGGER.error("[ ERROR: launch test app %s failed! ]" \
+ % test_web_app)
+ result_obj.set_status(1)
+ break
+
+ while True:
+ if result_obj.get_status() == 1:
+ test_set_finished = True
+ break
+ ret = http_request(
+ get_url(server_url, "/check_server_status"), "GET", {})
+ if ret is None:
+ LOGGER.error(
+ "[ ERROR: get server status timeout, please check device! ]")
+ err_cnt += 1
+ else:
+ result_cases = ret.get("cases")
+ error_code = ret.get("error_code")
+ if error_code is not None:
+ if not conn.launch_app(test_web_app):
+ test_set_finished = True
+ result_obj.set_status(1)
+ break
+ if error_code == LAUNCH_ERROR:
+ LOGGER.error("[ERROR : test app no response, hang or not launched!]")
+ test_set_finished = True
+ result_obj.set_status(1)
+ break
+ elif error_code == BLOCK_ERROR:
+ LOGGER.error("[ ERROR: test case block issue! ]")
+ err_cnt += 1
+ else:
+ err_cnt = 0
+
+ if result_cases is not None and len(result_cases):
+ result_obj.extend_result(result_cases)
+ elif exetype == 'manual':
+ LOGGER.info(
+ "[ please execute manual cases ]\r\n")
+
+ if ret["finished"] == 1:
+ test_set_finished = True
+ result_obj.set_status(1)
+ break
+ elif ret["block_finished"] == 1:
+ break
+
+ if err_cnt >= CNT_RETRY:
+ LOGGER.error(
+ "[error: get too many errors, stop current set]")
+ test_set_finished = True
+ result_obj.set_status(1)
+ break
+ time.sleep(2)
+
+
+def _webuifw_test_exec(conn, test_web_app, test_session, test_set_name, \
+ exetype, cases_queue, result_obj):
+ """function for running webuifw tests"""
+ global UIFW_SET_NUM
+ UIFW_SET_NUM = UIFW_SET_NUM + 1
+ set_UIFW_RESULT = UIFW_RESULT + "_" + str(UIFW_SET_NUM) + ".xml"
+ result_obj.set_status(0)
+ result_obj.set_result({"resultfile": ""})
+ ls_cmd = "ls -l %s" % set_UIFW_RESULT
+ sz_cmd = "du -hk %s " % set_UIFW_RESULT
+ time_out = UIFW_MAX_TIME
+ rm_cmd = "rm " + os.path.join(DEVICE_SUITE_TARGET_30, "Documents/tcresult*.xml")
+ #jh0219.han@samsung.com
+ if exetype == "auto":
+ conn.shell_cmd(rm_cmd)
+ UIFW_SET_NUM = 1
+ LOGGER.info('[webuifw] start test executing')
+ if not conn.launch_app(test_web_app):
+ LOGGER.info("[ launch test app \"%s\" failed! ]" % test_web_app)
+ result_obj.set_result({"resultfile": ""})
+ result_obj.set_status(1)
+
+ result_file = FILES_ROOT + test_session + "_uifw.xml"
+
+ while time_out > 0:
+ LOGGER.info('[webuifw] waiting for test completed...')
+ exit_code, ret = conn.shell_cmd(ls_cmd)
+ if not 'No such file or directory' in ret[0]:
+ exit_code, ret = conn.shell_cmd(sz_cmd)
+ f_size = int(ret[0].split("\t")[0])
+ if f_size > 0:
+ break
+ if time_out > UIFW_MAX_WRITE_TIME:
+ time_out = UIFW_MAX_WRITE_TIME
+ time.sleep(2)
+ time_out -= 2
+
+ LOGGER.info('[webuifw] end test executing')
+ if conn.download_file(set_UIFW_RESULT, result_file):
+ result_obj.set_result({"resultfile": result_file})
+ for test_case in cases_queue:
+ LOGGER.info("[webuifw] execute case: %s # %s" %
+ (test_set_name, test_case['case_id']))
+ result_obj.set_status(1)
+
+
+class TestWorker(object):
+
+ """Test executor for testkit-lite"""
+
+ def __init__(self, conn):
+ super(TestWorker, self).__init__()
+ self.conn = conn
+ self.server_url = None
+ self.result_obj = None
+
+ self.opts = dict({'block_size': 300,
+ 'test_type': None,
+ 'auto_iu': False,
+ 'fuzzy_match': False,
+ 'self_exec': False,
+ 'self_repeat': False,
+ 'debug_mode': False
+ })
+
+ def set_TizenVersion(self, tizenversion):
+ print ""
+
+ def __init_test_stub(self, stub_app, stub_port, debug_opt):
+ # init testkit-stub deamon process
+ timecnt = 0
+ blaunched = False
+ while timecnt < CNT_RETRY:
+ #print 'stub_app' ,stub_app
+ if not self.conn.check_process(stub_app):
+ LOGGER.info("[ no stub process activated, now try to launch %s ]" % stub_app)
+ self.conn.launch_stub(stub_app, stub_port, debug_opt)
+ timecnt += 1
+ else:
+ blaunched = True
+ break
+
+ if not blaunched:
+ LOGGER.info("[ launch stub process failed! ]")
+ return False
+
+ if self.server_url is None:
+ self.server_url = self.conn.get_server_url(stub_port)
+
+ timecnt = 0
+ blaunched = False
+ while timecnt < CNT_RETRY:
+ ret = http_request(get_url(
+ self.server_url, "/check_server_status"), "GET", {})
+ if ret is None:
+ LOGGER.info("[ check server status, not ready yet! ]")
+ timecnt += 1
+ time.sleep(1)
+ else:
+ blaunched = True
+ break
+ return blaunched
+
+ def __init_webtest_opt(self, params):
+ """init the test runtime, mainly process the star up of test stub"""
+ if params is None:
+ return None
+
+ session_id = str(uuid.uuid1())
+ stub_app = params.get('stub-name', 'testkit-stub')
+ stub_port = params.get('stub-port', '8000')
+ testsuite_name = params.get('testsuite-name', '')
+ testset_name = params.get('testset-name', '')
+ capability_opt = params.get("capability", None)
+ test_launcher = params.get('test-launcher', '')
+ test_extension = params.get('test-extension', None)
+ test_widget = params.get('test-widget', None)
+ # jh0219.han@samsung.com //in
+ client_cmds = params.get('test-launcher', '').strip().split()
+ wrt_tag = client_cmds[1] if len(client_cmds) > 1 else ""
+ self.opts['self_exec'] = wrt_tag.find('a') != -1
+ self.opts['self_repeat'] = wrt_tag.find('r') != -1
+ # jh0219.han@samsung.com //out
+ # LOGGER.info("[f*: %s ]" % str(params))
+ test_opt = self.conn.get_launcher_opt(
+ test_launcher, test_extension, test_widget, \
+ testsuite_name, testset_name)
+ if test_opt is None:
+ LOGGER.info("[ init the test launcher, get failed ]")
+ return None
+ LOGGER.info("[ test launcher: %s ]" % test_opt["launcher"])
+ LOGGER.info("[ test app: %s ]" % test_opt["test_app_id"])
+ self.opts.update(test_opt)
+ self.opts['debug_mode'] = params.get("debug", False)
+
+ # uifw, this suite don't need stub
+ if self.opts['self_exec'] or self.opts['self_repeat']:
+ self.opts['test_type'] = "jqunit"
+ return session_id
+
+ # enable debug information
+ stub_debug_opt = "--debug" if self.opts['debug_mode'] else ""
+
+ # suite_id to be removed in later version
+ test_opt["suite_id"] = test_opt["test_app_id"]
+ if self.__init_test_stub(stub_app, stub_port, stub_debug_opt):
+ ret = http_request(get_url(
+ self.server_url, "/init_test"), "POST", test_opt)
+ if ret is None:
+ LOGGER.info("[ init test suite failed! ]")
+ return None
+ elif "error_code" in ret:
+ LOGGER.info("[ init test suite, "
+ "get error code %d ! ]" % ret["error_code"])
+ return None
+
+ if capability_opt is not None:
+ ret = http_request(get_url(self.server_url,
+ "/set_capability"),
+ "POST", capability_opt)
+ return session_id
+ else:
+ LOGGER.info("[ Init test failed ! ]")
+ return None
+
+ def init_test(self, params):
+ """init the test envrionment"""
+ self.opts['testset_name'] = params.get('testset-name', '')
+ self.opts['testsuite_name'] = params.get('testsuite-name', '')
+ self.opts['debug_log_base'] = params.get("debug-log-base", '')
+ if params.get('test-launcher') is not None:
+ self.opts['test_type'] = "webapi"
+ return self.__init_webtest_opt(params)
+ elif params.get('set_type') in ['ref', 'js']:
+ self.opts['test_type'] = "webapi"
+ params['test-launcher'] = "xwalk"
+ return self.__init_webtest_opt(params)
+ else:
+ self.opts['test_type'] = "coreapi"
+ return str(uuid.uuid1())
+
+ def __run_core_test(self, sessionid, test_set_name, exetype, cases):
+ """
+ process the execution for core api test
+ """
+ self.opts['async_th'] = threading.Thread(
+ target=_core_test_exec,
+ args=(
+ self.conn, sessionid, test_set_name, exetype, \
+ cases, self.result_obj)
+ )
+ self.opts['async_th'].start()
+ return True
+
+ def __run_jqt_test(self, sessionid, test_set_name, cases):
+ """
+ process the execution for Qunit testing
+ """
+ exetype = "auto" if self.opts['self_exec'] else ""
+ self.opts['async_th'] = threading.Thread(
+ target=_webuifw_test_exec,
+ args=(
+ self.conn, self.opts['test_app_id'], sessionid, \
+ test_set_name, exetype, cases, self.result_obj)
+ )
+ self.opts['async_th'].start()
+ return True
+
+ def __run_web_test(self, sessionid, test_set_name, exetype, ctype, cases):
+ """
+ process the execution for web api test
+ may be splitted to serveral blocks,
+ with the unit size defined by block_size
+ """
+ #print 'web test'
+ case_count = len(cases)
+ blknum = 0
+ if case_count % self.opts['block_size'] == 0:
+ blknum = case_count / self.opts['block_size']
+ else:
+ blknum = case_count / self.opts['block_size'] + 1
+
+ idx = 1
+ test_set_queues = []
+ while idx <= blknum:
+ block_data = {}
+ block_data["exetype"] = exetype
+ block_data["type"] = ctype
+ block_data["totalBlk"] = str(blknum)
+ block_data["currentBlk"] = str(idx)
+ block_data["casecount"] = str(case_count)
+ start = (idx - 1) * self.opts['block_size']
+ if idx == blknum:
+ end = case_count
+ else:
+ end = idx * self.opts['block_size']
+ block_data["cases"] = cases[start:end]
+ test_set_queues.append(block_data)
+ idx += 1
+ self.opts['async_th'] = threading.Thread(
+ target=_web_test_exec,
+ args=(
+ self.conn, self.server_url, self.opts['test_app_id'], \
+ exetype, test_set_queues, self.result_obj)
+ )
+ self.opts['async_th'].start()
+ return True
+
+ def run_test(self, sessionid, test_set):
+ """
+ process the execution for a test set
+ """
+ if sessionid is None:
+ return False
+
+ if not "cases" in test_set:
+ return False
+ disabledlog = os.environ.get('disabledlog', '')
+ cases, exetype, ctype = test_set[
+ "cases"], test_set["exetype"], test_set["type"]
+ #print 'exetype', exetype
+ if len(cases) == 0:
+ return False
+ # start debug trace thread
+ if disabledlog == 'True':
+ pass
+ else:
+ self.conn.start_debug(self.opts['debug_log_base'])
+ time.sleep(1)
+
+ self.result_obj = TestSetResut(
+ self.opts['testsuite_name'], self.opts['testset_name'])
+
+ devid = self.conn.get_devid()
+ if self.conn.is_NE_mode() or (devid and devid.find('None') > -1):
+ result_list = []
+ for case in cases:
+ test_case = {}
+ test_case['case_id'] = case['case_id']
+ test_case['result'] = 'N/A'
+ if devid.find('None') > -1:
+ test_case['stdout'] = "target not found"
+ else:
+ issue_num = int(self.conn.is_NE_mode())
+ err_msg = "precondition failed "
+ if issue_num == 1:
+ err_msg += "(not connected to wifi)"
+ elif issue_num == 2:
+ err_msg += "(not set email account)"
+ elif issue_num == 3:
+ err_msg += "(not available device network)"
+ elif issue_num == 4:
+ err_msg += "(not enable bluetooth)"
+ elif issue_num == 5:
+ err_msg += "(not enable nfc)"
+ elif issue_num == 6:
+ err_msg += "(not available sim card)"
+ test_case['stdout'] = err_msg
+
+ result_list.append(test_case)
+
+ self.result_obj.extend_result(result_list)
+ self.result_obj.set_status(1)
+ return True
+
+ if self.opts['test_type'] == "webapi":
+ if ctype == 'ref':
+ exetype = 'manual'
+ return self.__run_web_test(sessionid, \
+ self.opts['testset_name'], exetype, ctype, cases)
+ elif self.opts['test_type'] == "coreapi":
+ return self.__run_core_test(sessionid, \
+ self.opts['testset_name'], exetype, cases)
+ #elif self.opts['test_type'] == "jqunit":
+ elif self.opts['test_type'] in ["jqunit", 'pyunit']:
+ return self.__run_jqt_test(sessionid, \
+ self.opts['testset_name'], cases)
+ else:
+ LOGGER.info("[ unsupported test suite type ! ]")
+ return False
+
+ def get_test_status(self, sessionid):
+ """poll the test task status"""
+ if sessionid is None:
+ return None
+ result = {}
+ result["msg"] = []
+ result["finished"] = str(self.result_obj.get_status())
+ return result
+
+ def get_test_result(self, sessionid):
+ """get the test result for a test set """
+ result = {}
+ if sessionid is None:
+ return result
+
+ result = self.result_obj.get_result()
+ return result
+
+ def finalize_test(self, sessionid):
+ """clear the test stub and related resources"""
+ if sessionid is None:
+ return False
+
+ if self.result_obj is not None:
+ self.result_obj.set_status(1)
+
+ # stop test app
+ if self.opts['test_type'] == "webapi":
+ self.conn.kill_app(self.opts['test_app_id'])
+ # uninstall test app
+ if self.opts['auto_iu']:
+ self.conn.uninstall_app(\
+ self.opts['test_app_id'].split('.')[0][1:])
+
+ # stop debug thread
+ self.conn.stop_debug()
+
+ return True
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+""" The implementation of pyunit test engine"""
+
+import os
+import time
+import sys
+import threading
+import uuid
+import StringIO
+import unittest
+from unittest import TestResult
+from datetime import datetime
+from testkitlite.util.log import LOGGER
+from testkitlite.util.result import TestSetResut
+
+
+DATE_FORMAT_STR = "%Y-%m-%d %H:%M:%S"
+result_buffer = None
+class LiteTestResult(TestResult):
+
+ """Python unittest result wrapper"""
+
+ def startTest(self, test):
+ super(LiteTestResult, self).startTest(test)
+ self._case = {}
+ case_full_id = test.id()
+ self._case['case_id'] = case_full_id.split('.')[-1]
+ self._case['purpose'] = case_full_id
+ self._case['start_at'] = datetime.now().strftime(DATE_FORMAT_STR)
+
+ def stopTest(self, test):
+ self._case['end_at'] = datetime.now().strftime(DATE_FORMAT_STR)
+ super(LiteTestResult, self).stopTest(test)
+ if result_buffer is not None:
+ result_buffer.extend_result([self._case])
+
+ def addSuccess(self, test):
+ super(LiteTestResult, self).addSuccess(test)
+ self._case['result'] = 'PASS'
+
+ def addError(self, test, err):
+ super(LiteTestResult, self).addError(test, err)
+ _, _exc_str = self.errors[-1]
+ self._case['result'] = 'BLOCK'
+ self._case['stdout'] = '[message]' + _exc_str
+
+ def addFailure(self, test, err):
+ super(LiteTestResult, self).addFailure(test, err)
+ _, _exc_str = self.failures[-1]
+ self._case['result'] = 'FAIL'
+ self._case['stdout'] = '[message]' + _exc_str
+
+
+def _pyunit_test_exec(test_session, cases, result_obj):
+ """function for running core tests"""
+ global result_buffer
+ result_buffer = result_obj
+ result_obj.set_status(0)
+ total = unittest.TestSuite()
+ for tc in cases['cases']:
+ if tc['entry'].find(os.sep) != -1:
+ arr = tc['entry'].split(os.sep)
+ path = tc['entry'][:tc['entry'].rindex(os.sep)]
+ case = arr[-1]
+ else:
+ path = os.getcwd()
+ case = tc['entry']
+ try:
+ tests = unittest.TestLoader().discover(path, pattern='''%s''' %case)
+ total.addTest(tests)
+ # unittest.TextTestRunner(resultclass=LiteTestResult, buffer=True).run(tests)
+ except ImportError as error:
+ pass
+ try:
+ unittest.TextTestRunner(resultclass=LiteTestResult, buffer=True).run(total)
+ except ImportError as error:
+ pass
+
+ #result_obj.extend_result(resultclass)
+ result_obj.set_status(1)
+
+
+class TestWorker(object):
+
+ """Test executor for testkit-lite"""
+
+ def __init__(self, conn):
+ super(TestWorker, self).__init__()
+ self.conn = conn
+ self.server_url = None
+ self.result_obj = None
+ self.opts = dict({'block_size': 300,
+ 'test_type': None,
+ 'auto_iu': False,
+ 'fuzzy_match': False,
+ 'self_exec': False,
+ 'self_repeat': False,
+ 'debug_mode': False
+ })
+
+ def init_test(self, params):
+ """init the test envrionment"""
+ self.opts['testset_name'] = params.get('testset-name', '')
+ self.opts['testsuite_name'] = params.get('testsuite-name', '')
+ self.opts['debug_log_base'] = params.get("debug-log-base", '')
+ return str(uuid.uuid1())
+
+ def run_test(self, sessionid, test_set):
+ """
+ process the execution for a test set
+ """
+ if sessionid is None:
+ return False
+ disabledlog = os.environ.get("disabledlog","")
+ # start debug trace thread
+ if len(disabledlog) > 0 :
+ pass
+ else:
+ self.conn.start_debug(self.opts['debug_log_base'])
+ time.sleep(1)
+ self.result_obj = TestSetResut(
+ self.opts['testsuite_name'], self.opts['testset_name'])
+ # self.opts['async_th'] = threading.Thread(
+ # target=_pyunit_test_exec,
+ # args=(sessionid, test_set['test_set_src'], test_set, self.result_obj)
+ # )
+ self.opts['async_th'] = threading.Thread(
+ target=_pyunit_test_exec,
+ args=(sessionid, test_set, self.result_obj)
+ )
+
+ self.opts['async_th'].start()
+ return True
+
+ def get_test_status(self, sessionid):
+ """poll the test task status"""
+ if sessionid is None:
+ return None
+ result = {}
+ result["msg"] = []
+ result["finished"] = str(self.result_obj.get_status())
+ return result
+
+ def get_test_result(self, sessionid):
+ """get the test result for a test set """
+ result = {}
+ if sessionid is None:
+ return result
+
+ result = self.result_obj.get_result()
+ return result
+
+ def finalize_test(self, sessionid):
+ """clear the test stub and related resources"""
+ if sessionid is None:
+ return False
+
+ if self.result_obj is not None:
+ self.result_obj.set_status(1)
+
+ # stop debug thread
+ self.conn.stop_debug()
+
+ return True
--- /dev/null
+import os
+import re
+import time
+import sys
+import thread
+import threading
+import socket
+import json
+import hashlib
+import signal
+import logging
+import subprocess
+import ConfigParser
+from testkitlite.util import tr_utils
+from testkitlite.util.log import LOGGER as g_logger
+from urlparse import urlparse
+
+try:
+ from selenium.webdriver.remote.webdriver import WebDriver
+ from selenium.webdriver.support.ui import WebDriverWait
+except ImportError, err:
+ g_logger.info("Failed to import 'selenium' module, please check your installation:")
+ g_logger.info(" You can use 'sudo pip install selenium' to install the module!")
+ raise ImportError
+
+TE = None
+EXE_LOCK = threading.Lock()
+DEFAULT_TIMEOUT = 90
+REF_SET_TYPE = 'ref'
+JS_SET_TYPE = 'js'
+SCRIPT_SET_TYPE = 'script'
+STR_PASS = 'PASS'
+STR_FAIL = 'FAIL'
+STR_BLOCK = 'BLOCK'
+STR_NOTRUN = 'n/a'
+DEFAULT_WD_URL = 'http://127.0.0.1:9515'
+MH_FILE = "/opt/testkit/lite3.0/mh.html"
+
+
+class TestExecuter:
+
+ def __init__(self, test_env=None):
+ self.runner_proc = test_env['runner_proc']
+ self.exe_thread = None
+ self.exe_status = 'READY'
+ self.tests_json = ''
+ self.target_platform = test_env['target_platform']
+ self.web_driver = None
+ self.wd_url = test_env.get("wd_url", '') or DEFAULT_WD_URL
+ self.suite_name = test_env['suite_name']
+ self.set_type = test_env['set_type']
+ self.set_exetype = test_env['set_exetype']
+ self.test_prefix = ''
+ self.exe_socket_file = test_env['exe_socket_file']
+ self.exe_socket_buff_size = test_env['exe_socket_buff_size']
+ self.exe_socket = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
+ self.exe_socket.connect(self.exe_socket_file)
+ self.TE_LOG = g_logger
+ self.debugip = test_env.get("debugip", '')
+ self.appid = test_env.get("appid", '')
+ signal.signal(signal.SIGINT, self.__exitHandler)
+ signal.signal(signal.SIGTERM, self.__exitHandler)
+
+ def __exitHandler(self, a, b):
+ if self.web_driver:
+ self.web_driver.quit()
+ self.web_driver = None
+ with EXE_LOCK:
+ self.exe_status = 'DONE'
+
+ def __updateTestPrefix(self):
+ if self.target_platform.upper().find('ANDROID') >= 0:
+ url_components = urlparse(self.web_driver.current_url)
+ if url_components.scheme == 'http':
+ self.test_prefix = '%s://%s/' % (url_components.scheme,
+ url_components.netloc)
+ elif self.target_platform.upper().find('TIZEN') >=0:
+ url_components = urlparse(self.web_driver.current_url)
+ self.test_prefix = '%s://%s/' % (url_components.scheme,
+ url_components.netloc)
+
+
+
+ def __initWebDriver(self):
+ from selenium import webdriver
+ self.TE_LOG.info('init web driver')
+ if self.web_driver:
+ self.web_driver.quit()
+ self.web_driver = None
+
+ test_app = test_ext = ''
+ driver_env = {}
+ try:
+ exec 'from testkitlite.capability.%s import initCapability' % self.target_platform
+ if self.target_platform.upper().find('TIZEN') >= 0:
+ test_app = self.appid
+ test_ext = self.debugip
+ capa = {'xwalkOptions': {'tizenAppId': test_app[1:-1], 'tizenDebuggerAddress': test_ext}}
+ elif self.target_platform.upper().find('ANDROID') >= 0:
+ test_app, test_ext = self.appid.split('/')
+ driver_env = initCapability(test_app, test_ext)
+ capa = driver_env['desired_capabilities']
+ driver_env = initCapability(test_app, test_ext)
+ self.test_prefix = driver_env['test_prefix']
+ self.web_driver = WebDriver(self.wd_url, capa)
+ url_compon = urlparse(self.web_driver.current_url)
+ self.__updateTestPrefix()
+ return True
+ except Exception, e:
+ if self.target_platform.upper().find('ANDROID') >= 0:
+ try:
+ test_ext = test_ext.strip('.').replace('Activity', '')
+ tmps = test_ext.split('_')
+ actv_name = ''.join([it.capitalize() for it in tmps if it])
+ test_ext = '.%sActivity' % actv_name
+ self.TE_LOG.info('activity : %s' %test_ext)
+ driver_env = initCapability(test_app, test_ext)
+ self.web_driver = WebDriver(self.wd_url, driver_env['desired_capabilities'])
+ self.__updateTestPrefix()
+ return True
+ except Exception, e:
+ try:
+ test_app, test_ext = self.appid.split('/')
+ test_ext = test_ext.replace('Activity', '')
+ self.TE_LOG.info('activity : %s' %test_ext)
+ driver_env = initCapability(test_app, test_ext)
+ self.web_driver = WebDriver(self.wd_url, driver_env['desired_capabilities'])
+ self.__updateTestPrefix()
+ return True
+ except Exception, e:
+ self.TE_LOG.error('Retry to init Web Driver get failed: %s' % e)
+ return False
+ else:
+ self.TE_LOG.error('Init Web Driver failed: %s' % e)
+ return False
+
+ def __talkWithRunnerRecv(self):
+ try:
+ exe_data = self.exe_socket.recv(self.exe_socket_buff_size)
+ if exe_data is None:
+ return (None, None)
+ exe_json = json.loads(exe_data)
+ command = exe_json['COMMAND']
+ data = exe_json['DATA']
+ except Exception, e:
+ self.TE_LOG.debug('Receive data failed, %s' % e)
+ time.sleep(2)
+ return (None, None)
+ return (command, data)
+
+ def __talkWithRunnerSend(self, data=None):
+ try:
+ self.exe_socket.send(json.dumps(data))
+ except Exception, e:
+ self.TE_LOG.debug('Send data failed, %s' % e)
+ time.sleep(2)
+ return False
+ return True
+
+ def __initWebManualHarness(self):
+ if self.target_platform.upper().find('CHROME') >= 0:
+ self.web_driver.get('%s%s' % (self.test_prefix, MH_FILE))
+ else:
+ self.web_driver.get('%s/index.html' % self.test_prefix)
+
+ try:
+ harness_page_file = open(MH_FILE)
+ harness_page_raw = harness_page_file.read()
+ harness_page_file.close()
+ except Exception, e:
+ self.TE_LOG.debug('Read manual harness file failed: %s' % e)
+ return False
+ harness_page_raw = harness_page_raw.replace(
+ '\n', '').replace('"', '\\"').replace("'", "\\'")
+ self.web_driver.execute_script(
+ "document.write(\"%s\")" % harness_page_raw)
+ self.web_driver.execute_script("document.close()")
+ self.web_driver.execute_script("init_mh()")
+
+ return True
+
+ def __runWebManualTests(self):
+ if not self.__initWebManualHarness():
+ self.TE_LOG.error(
+ 'Init web manual harness failed, exit from executer')
+ return False
+
+ case_num = len(self.tests_json['cases'])
+ i_case = 0
+ while True:
+ try:
+ if i_case >= (case_num - 1):
+ i_case = case_num - 1
+ self.web_driver.execute_script(
+ "document.getElementById(\"forward-bt\").disabled=\"true\"")
+ else:
+ self.web_driver.execute_script(
+ "document.getElementById(\"forward-bt\").disabled=\"\"")
+
+ if i_case <= 0:
+ i_case = 0
+ self.web_driver.execute_script(
+ "document.getElementById(\"back-bt\").disabled=\"true\"")
+ else:
+ self.web_driver.execute_script(
+ "document.getElementById(\"back-bt\").disabled=\"\"")
+
+ if self.set_type == REF_SET_TYPE:
+ self.web_driver.execute_script(
+ "document.getElementById(\"test-entry\").textContent=\"%s%s\"" % (self.test_prefix, self.tests_json['cases'][i_case]['entry']))
+ self.web_driver.execute_script(
+ "document.getElementById(\"refer-test-entry\").textContent=\"%s%s\"" % (self.test_prefix, self.tests_json['cases'][i_case]['refer_entry']))
+ self.web_driver.execute_script(
+ "document.getElementById(\"run-refer-test-bt\").style.display=\"\"")
+ self.web_driver.execute_script(
+ "document.getElementById(\"refer-test-entry-area\").style.display=\"\"")
+ elif self.set_type == JS_SET_TYPE:
+ self.web_driver.execute_script(
+ "document.getElementById(\"test-entry\").textContent=\"%s%s\"" % (self.test_prefix, self.tests_json['cases'][i_case]['entry']))
+ self.web_driver.execute_script(
+ "document.getElementById(\"run-refer-test-bt\").style.display=\"none\"")
+ self.web_driver.execute_script(
+ "document.getElementById(\"refer-test-entry-area\").style.display=\"none\"")
+
+ WebDriverWait(self.web_driver, 3600).until(lambda strdiff: self.web_driver.execute_script(
+ "return document.getElementById(\"case-info-area\").className") != "READY")
+ i_case_status = self.web_driver.find_element_by_id(
+ "case-info-area").get_attribute("class")
+ self.web_driver.execute_script(
+ "document.getElementById(\"case-info-area\").className = \"READY\"")
+ if i_case_status in [STR_PASS, STR_FAIL, STR_BLOCK]:
+ self.tests_json['cases'][i_case]['result'] = i_case_status
+ i_case = i_case + 1
+ elif i_case_status == "FORWARD":
+ i_case = i_case + 1
+ elif i_case_status == "BACK":
+ i_case = i_case - 1
+ else:
+ break
+ except Exception, e:
+ self.tests_json['cases'][i_case]['result'] = STR_BLOCK
+ self.TE_LOG.error("Run %s: failed: %s, exit from executer" %
+ (self.tests_json['cases'][i_case]['case_id'], e))
+ break
+
+ def __checkPageNotFound(self, page_url=None):
+ try:
+ if self.web_driver.current_url.find('data:text/html,chromewebdata') >= 0:
+ self.TE_LOG.debug("Page not found: %s" %
+ self.web_driver.current_url)
+ return False
+ else:
+ return True
+ except Exception, e:
+ self.TE_LOG.error("Failed to get current url")
+ return False
+
+ def __runRefTests(self, haha=None, kkkk=None):
+ for i_case in self.tests_json['cases']:
+ with EXE_LOCK:
+ if self.exe_status == 'DONE':
+ return False
+
+ i_case['start_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ try:
+ i_case_timeout = i_case['timeout']
+ except Exception, e:
+ i_case_timeout = DEFAULT_TIMEOUT
+
+ i_page_url = '%s%s' % (self.test_prefix, i_case['entry'])
+ try:
+ self.web_driver.set_page_load_timeout(i_case_timeout)
+ self.web_driver.implicitly_wait(i_case['onload_delay'])
+ self.web_driver.get(i_page_url)
+ except Exception, e:
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.info(
+ "Cases %s: blocked by %s" % (i_case['case_id'], e))
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ continue
+
+ if not self.__checkPageNotFound(i_page_url):
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.info(
+ "Cases %s: blocked, page not found" % i_case['case_id'])
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ i_case['stdout'] = "page not found"
+ continue
+
+ try:
+ test01_md5 = hashlib.md5(
+ self.web_driver.get_screenshot_as_base64()).hexdigest().upper()
+ except Exception, e:
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.info(
+ "Cases %s: blocked by %s" % (i_case['case_id'], e))
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ continue
+
+ try:
+ i_refer_case_timeout = i_case['refer_timeout']
+ except Exception, e:
+ i_refer_case_timeout = DEFAULT_TIMEOUT
+
+ i_ref_page_url = '%s%s' % (self.test_prefix, i_case['refer_entry'])
+ try:
+ self.web_driver.set_page_load_timeout(i_refer_case_timeout)
+ self.web_driver.implicitly_wait(i_case['onload_delay'])
+ self.web_driver.get(i_ref_page_url)
+ except Exception, e:
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.info(
+ "Cases %s: blocked by %s" % (i_case['case_id'], e))
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ continue
+
+ if not self.__checkPageNotFound(i_ref_page_url):
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.info(
+ "Cases %s: blocked, ref page not found" % i_case['case_id'])
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ continue
+
+ try:
+ test02_md5 = hashlib.md5(
+ self.web_driver.get_screenshot_as_base64()).hexdigest().upper()
+ except Exception, e:
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.info(
+ "Cases %s: blocked by %s" % (i_case['case_id'], e))
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ continue
+
+ if test01_md5 == test02_md5:
+ i_case['result'] = STR_PASS
+ else:
+ i_case['result'] = STR_FAIL
+
+ def __getCaseIndex(self, url):
+ try:
+ value_pos = url.rindex('value')
+ if value_pos == -1:
+ return 0
+ eq_value = url[value_pos:]
+ eq_index = eq_value.index('=')
+ if eq_index == -1:
+ return 0
+ sub_value = eq_value[eq_index + 1:]
+ if sub_value is not None:
+ return sub_value
+ except Exception, e:
+ return 0
+
+ def __checkUrlSame(self, pre_url, url):
+ try:
+ if pre_url == '' or url == '':
+ return False
+
+ index_pre_url = pre_url.index('?')
+ if index_pre_url == -1:
+ return False
+ ab_pre_url = pre_url[0:index_pre_url]
+
+ index_url = url.index('?')
+ if index_url == -1:
+ return False
+ ab_url = url[0:index_url]
+ if ab_pre_url == ab_url:
+ return True
+ else:
+ return False
+ except Exception:
+ return False
+
+ def __runJSTests(self, haha=None, kkkk=None):
+ element_index = -1
+ for i_case in self.tests_json['cases']:
+ element_index += 1
+ with EXE_LOCK:
+ if self.exe_status == 'DONE':
+ return False
+ i_case['start_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ try:
+ sub_index = 0
+ url_equal = False
+ if element_index:
+ pre_url = self.tests_json['cases'][
+ element_index - 1]['entry']
+ url_equal = self.__checkUrlSame(pre_url, i_case['entry'])
+ i_case_timeout = i_case['timeout']
+ except Exception, e:
+ i_case_timeout = DEFAULT_TIMEOUT
+ #self.test_prefix = '/home/app/.config/xwalk-service/applications/css3backgr.WebAPICSS3BackgroundsTests'
+ i_page_url = '%s%s' % (self.test_prefix, i_case['entry'])
+ try:
+ self.web_driver.set_page_load_timeout(i_case_timeout)
+ sub_index = self.__getCaseIndex(i_case['entry'])
+ if not url_equal:
+ self.web_driver.implicitly_wait(i_case['onload_delay'])
+ self.web_driver.get(i_page_url)
+ except Exception, e:
+ print 'exception'
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.debug(
+ "Cases %s: blocked by %s" % (i_case['case_id'], e))
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ continue
+
+ if not self.__checkPageNotFound(i_page_url):
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.info(
+ "Cases %s: blocked, page not found" % i_case['case_id'])
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ i_case['stdout'] = "page not found"
+ continue
+
+ try:
+ if sub_index:
+ sub_index = int(sub_index) - 1
+ table = self.web_driver.find_element_by_xpath(
+ "//table[@id='results']")
+ tr = table.find_elements_by_xpath(".//tbody/tr")[sub_index]
+ sub_result = tr.find_elements_by_xpath(".//td")[0].text
+ error_message = tr.find_elements_by_xpath(".//td")[2].text
+ if sub_result.upper() == 'PASS':
+ i_case['result'] = STR_PASS
+ elif sub_result.upper() == 'FAIL':
+ i_case['result'] = STR_FAIL
+ i_case['stdout'] = error_message
+ else:
+ i_case['result'] = STR_BLOCK
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+ except Exception, e:
+ try:
+ result = self.web_driver.find_element_by_class_name('pass')
+ except:
+ i_case['result'] = STR_FAIL
+ else:
+ if result.text == STR_FAIL:
+ i_case['result'] = STR_FAIL
+ elif result.text == STR_PASS:
+ i_case['result'] = STR_PASS
+ else:
+ i_case['result'] = STR_BLOCK
+ i_case['end_at'] = time.strftime(
+ "%Y-%m-%d %H:%M:%S", time.localtime())
+
+ def __runScriptTests(self, haha=None, kkkk=None):
+ for i_case in self.tests_json['cases']:
+ with EXE_LOCK:
+ if self.exe_status == 'DONE':
+ return False
+ try:
+ i_case_timeout = int(i_case['timeout'])
+ except Exception, e:
+ i_case_timeout = DEFAULT_TIMEOUT
+
+ try:
+ i_case_proc = subprocess.Popen(
+ args="%s" % i_case['entry'], shell=True)
+ i_case_pre_time = time.time()
+ while True:
+ i_case_exit_code = i_case_proc.poll()
+ i_case_elapsed_time = time.time() - i_case_pre_time
+ if i_case_exit_code == None:
+ if i_case_elapsed_time >= i_case_timeout:
+ tr_utils.KillAllProcesses(ppid=i_case_proc.pid)
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.debug(
+ "Run %s timeout" % i_case['case_id'])
+ break
+ elif str(i_case_exit_code) == str(i_case['expected_result']):
+ i_case['result'] = STR_PASS
+ break
+ else:
+ i_case['result'] = STR_FAIL
+ break
+ time.sleep(1)
+ except Exception, e:
+ i_case['result'] = STR_BLOCK
+ self.TE_LOG.error(
+ "Run %s: failed: %s, exit from executer" % (i_case['case_id'], e))
+ break
+
+ def __runTests(self, haha=None, kkkk=None):
+ for i_case in self.tests_json['cases']:
+ i_case['result'] = STR_NOTRUN
+ if self.set_exetype == "manual":
+ self.__runWebManualTests()
+ elif self.set_type == REF_SET_TYPE:
+ self.__runRefTests()
+ elif self.set_type == JS_SET_TYPE:
+ self.__runJSTests()
+ elif self.set_type == SCRIPT_SET_TYPE:
+ self.__runScriptTests()
+
+ with EXE_LOCK:
+ self.exe_status = 'DONE'
+
+ return True
+
+ def runTestsExecuter(self):
+ if not self.set_type in [REF_SET_TYPE, JS_SET_TYPE, SCRIPT_SET_TYPE]:
+ self.TE_LOG.error(
+ "Unsupported set type %s, exit from executer" % self.set_type)
+ return False
+
+ if self.set_type in [REF_SET_TYPE, JS_SET_TYPE]:
+ try:
+ if not self.__initWebDriver():
+ if self.web_driver:
+ self.web_driver.quit()
+ self.web_driver = None
+ self.TE_LOG.error("Exit from executer")
+ return False
+ except Exception, e:
+ if self.web_driver:
+ self.web_driver.quit()
+ self.TE_LOG.error(
+ "Init Web Driver failed: %s, exit from executer" % e)
+ return False
+
+ while True:
+ if not tr_utils.pidExists(self.runner_proc):
+ if self.set_type in [REF_SET_TYPE, JS_SET_TYPE]:
+ if self.web_driver:
+ self.web_driver.quit()
+ self.web_driver = None
+ self.TE_LOG.debug('Can not find runner, exit from executer')
+ return False
+ exe_command, exe_data = self.__talkWithRunnerRecv()
+ if exe_command == 'GET_STATUS':
+ with EXE_LOCK:
+ self.__talkWithRunnerSend(
+ {'COMMAND': exe_command, 'DATA': self.exe_status})
+ elif exe_command == 'TESTS':
+ with EXE_LOCK:
+ self.exe_status = 'RUNNING'
+ self.tests_json = exe_data['data']
+ self.exe_thread = thread.start_new_thread(
+ self.__runTests, (1, 2))
+ self.__talkWithRunnerSend(
+ {'COMMAND': exe_command, 'DATA': 'OK'})
+ elif exe_command == 'GET_RESULTS':
+ if not self.__talkWithRunnerSend({'COMMAND': exe_command, 'DATA': self.tests_json}):
+ continue
+ with EXE_LOCK:
+ self.exe_status = 'READY'
+ elif exe_command == 'TERMINAL':
+ if self.web_driver:
+ self.web_driver.quit()
+ self.web_driver = None
+ with EXE_LOCK:
+ self.exe_status = 'DONE'
+ self.__talkWithRunnerSend(
+ {'COMMAND': exe_command, 'DATA': 'OK'})
+ else:
+ continue
+
+ def EndExecuter(self):
+ if self.web_driver:
+ self.web_driver.quit()
+ self.web_driver = None
+ return True
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+""" The implementation of default test engine"""
+import os
+import time
+import sys
+import json
+import socket
+import shutil
+import uuid
+import threading
+import re
+import ConfigParser
+from datetime import datetime
+from tempfile import mktemp
+import xml.etree.ElementTree as etree
+from testkitlite.engines import test_executer
+from shutil import copyfile
+from testkitlite.util import tr_utils
+from testkitlite.util.log import LOGGER
+from testkitlite.util.result import TestSetResut
+
+EXECUTER_POLLING_INTERVAL = 2
+CNT_RETRY = 10
+
+
+def initExecuter(test_env=None):
+ TE = test_executer.TestExecuter(test_env)
+ TE.runTestsExecuter()
+
+
+def _run_webdrvier_test(self, cases, result_obj):
+ """
+ process the execution for web api test
+ may be splitted to serveral blocks,
+ with the unit size defined by block_size
+ """
+ case_count = len(cases)
+ blknum = 0
+ if case_count % self.opts['block_size'] == 0:
+ blknum = case_count / self.opts['block_size']
+ else:
+ blknum = case_count / self.opts['block_size'] + 1
+
+ idx = 1
+ test_set_queues = []
+ while idx <= blknum:
+ block_data = {}
+ start = (idx - 1) * self.opts['block_size']
+ if idx == blknum:
+ end = case_count
+ else:
+ end = idx * self.opts['block_size']
+ block_data = cases[start:end]
+ for tc in block_data:
+ tc.pop('purpose')
+ test_set_queues.append({'cases': block_data})
+ idx += 1
+
+ self.testcases = []
+ get_result = False
+ abort_from_set = False
+
+ for section_json in test_set_queues:
+ if result_obj.get_status() == 1:
+ break
+ LOGGER.info("Load a new section for testing, please wait ...")
+ get_result = False
+ while True:
+ if result_obj.get_status() == 1:
+ break
+ exe_command, exe_data = self.talkWithEXE(
+ 'GET_STATUS', '', 0)
+ if exe_command == 'GET_STATUS':
+ if exe_data == 'READY':
+ exe_command, exe_data = self.talkWithEXE(
+ 'TESTS', {'data': section_json}, 0)
+ if exe_command != 'TESTS' or exe_data != 'OK':
+ LOGGER.debug('Send tests failed')
+ result_obj.set_status(1)
+ break
+ continue
+ elif exe_data == 'RUNNING':
+ time.sleep(EXECUTER_POLLING_INTERVAL)
+ continue
+ elif exe_data == 'DONE':
+ exe_command, exe_data = self.talkWithEXE(
+ 'GET_RESULTS', '', 0)
+ if exe_data is not None and len(exe_data):
+ result_obj.extend_result(exe_data['cases'])
+ get_result = True
+ break
+ elif exe_data == 'ERROR':
+ LOGGER.error('Executer got error')
+ get_result = True
+ result_obj.set_status(1)
+ break
+ else:
+ abort_from_set = True
+ result_obj.set_status(1)
+ break
+ if abort_from_set:
+ LOGGER.error('Exit from current set execution')
+ return
+ ### normally exit
+ result_obj.set_status(1)
+ exe_command, exe_data = self.talkWithEXE(
+ 'TERMINAL', '', 1)
+
+
+class TestWorker(object):
+
+ """Test executor for testkit-lite"""
+
+ def __init__(self, conn):
+ super(TestWorker, self).__init__()
+ self.conn = conn
+ self.server_url = None
+ self.result_obj = None
+ self.opts = dict({'block_size': 10,
+ 'test_type': None,
+ 'exe_socket_buff_size': 20480,
+ 'runner_proc': os.getpid(),
+ })
+ self.testcases = []
+ self.runner_proc = self.opts['runner_proc']
+ self.exe_socket_file = os.path.expanduser(
+ "~") + os.sep + str(self.runner_proc) + '.socket'
+ self.exe_proc = None
+ self.exe_socket = None
+ self.exe_socket_connect = None
+
+ def init_test(self, params):
+ """init the test envrionment"""
+ self.opts['testset_name'] = params.get('testset-name', '')
+ self.opts['suite_name'] = params.get('testsuite-name', '')
+ self.opts['debug_log_base'] = params.get("debug-log-base", '')
+ self.opts['wd_url'] = params.get("wd_url", '')
+ self.opts['target_platform'] = params.get("target_platform", '')
+ self.opts['set_type'] = params.get("set_type", '')
+ self.opts['set_exetype'] = params.get("set_exetype", '')
+ self.opts['session_dir'] = params.get("session_dir", '')
+ self.opts['log_debug'] = params.get("log_debug", '')
+ self.opts['exe_socket_file'] = self.exe_socket_file
+ test_launcher = params.get('test-launcher', None) or 'xwalk'
+ test_extension = params.get('test-extension', None)
+ test_widget = params.get('test-widget', None)
+ #kill stub
+ self.conn.kill_stub()
+ # get app id from commodule
+ _opts = self.conn.get_launcher_opt(test_launcher, test_extension, test_widget, self.opts['suite_name'], self.opts['testset_name'])
+ self.opts['appid'] = _opts.get("test_app_id", '') if _opts else ''
+ #self.opts['debugip'] = params.get("debugip", '')
+ self.opts['debugip'] = os.environ.get("wd-debugip", '')
+
+ if not self.__exitExecuter():
+ LOGGER.debug('__exitExecuter failed')
+ return None
+
+ if self.__initExecuterSocket():
+ time.sleep(EXECUTER_POLLING_INTERVAL)
+ if (not self.exe_proc) or (not tr_utils.pidExists(self.exe_proc)):
+ LOGGER.debug('Executer not existing')
+ return None
+ else:
+ timecnt = 0
+ blaunched = False
+ while timecnt < CNT_RETRY:
+ exe_command, exe_data = self.talkWithEXE(
+ 'GET_STATUS', '', 0)
+ if exe_command == 'GET_STATUS':
+ if exe_data == 'READY':
+ blaunched = True
+ break
+ else:
+ timecnt += 1
+ if not blaunched:
+ LOGGER.info("[ launch webdriver failed! ]")
+ return None
+ else:
+ return str(uuid.uuid1())
+
+ def __initExecuter(self):
+ try:
+ new_proc = os.fork()
+
+ if new_proc == 0:
+ initExecuter(self.opts)
+ sys.exit(0)
+ else:
+ self.exe_proc = new_proc
+ LOGGER.debug('Runner Proc: %s, Executer Proc: %s' %
+ (self.runner_proc, self.exe_proc))
+ return True
+ except OSError, e:
+ return False
+
+ def __exitExecuter(self):
+ if self.exe_socket:
+ self.exe_socket_connect.close()
+ self.exe_socket.close()
+ self.exe_socket = None
+ try:
+ os.remove(self.exe_socket_file)
+ except Exception, e:
+ pass
+
+ if self.exe_proc and tr_utils.pidExists(self.exe_proc):
+ if not tr_utils.KillAllProcesses(self.exe_proc):
+ return False
+ self.exe_proc = None
+ return True
+
+ def __initExecuterSocket(self):
+ if not self.exe_socket:
+ try:
+ os.remove(self.exe_socket_file)
+ except OSError:
+ pass
+ try:
+ self.exe_socket = socket.socket(
+ socket.AF_UNIX, socket.SOCK_STREAM)
+ self.exe_socket.bind(self.exe_socket_file)
+ self.exe_socket.listen(1)
+ except Exception, e:
+ LOGGER.error('Setup socket failed')
+ return False
+ if not self.__initExecuter():
+ LOGGER.error('Init Executer failed')
+ if self.exe_proc and tr_utils.pidExists(self.exe_proc):
+ killProcGroup(self.exe_proc)
+ self.exe_proc = None
+ self.exe_socket.close()
+ self.exe_socket = None
+ return False
+ self.exe_socket_connect, addr = self.exe_socket.accept()
+ return True
+
+ def talkWithEXE(self, command=None, data=None, recv_timeout=None):
+ # LOGGER.debug('Start send: %s, %s' % (command, data))
+ try:
+ if self.exe_socket is None:
+ return (None, None)
+ self.exe_socket.settimeout(recv_timeout)
+ self.exe_socket_connect.send(
+ json.dumps({'COMMAND': command, 'DATA': data}))
+ exe_data = self.exe_socket_connect.recv(
+ self.opts['exe_socket_buff_size'])
+ if not exe_data:
+ return (None, None)
+ exe_json = json.loads(exe_data)
+ if exe_json['COMMAND']:
+ command = exe_json['COMMAND']
+ if exe_json['DATA']:
+ data = exe_json['DATA']
+ except Exception, e:
+ LOGGER.error('Talk with executer failed: %s, kill executer' % e)
+ self.__exitExecuter()
+ return (None, None)
+
+ return (command, data)
+
+ def __saveSectionToSetJSON(self, testcases, exe_data):
+ if exe_data:
+ for i_case in exe_data['cases']:
+ testcases.append(i_case)
+
+ return testcases
+
+ def run_test(self, sessionid, test_set):
+ """
+ process the execution for a test set
+ """
+ if sessionid is None:
+ return False
+
+ if not "cases" in test_set:
+ return False
+
+ if len(test_set["cases"]) == 0:
+ return False
+
+ self.result_obj = TestSetResut(
+ self.opts['suite_name'], self.opts['testset_name'])
+ cases, exetype, ctype = test_set[
+ "cases"], test_set["exetype"], test_set["type"]
+
+ self.opts['async_th'] = threading.Thread(
+ target=_run_webdrvier_test,
+ args=(self, cases, self.result_obj)
+ )
+ self.opts['async_th'].start()
+ return True
+
+ def get_test_status(self, sessionid):
+ """poll the test task status"""
+ if sessionid is None:
+ return None
+ result = {}
+ result["msg"] = []
+ result["finished"] = str(self.result_obj.get_status())
+ return result
+
+ def get_test_result(self, sessionid):
+ """get the test result for a test set """
+ result = {}
+ if sessionid is None:
+ return result
+
+ result = self.result_obj.get_result()
+ return result
+
+ def finalize_test(self, sessionid):
+ """clear the test stub and related resources"""
+ if sessionid is None:
+ return False
+
+ if self.result_obj is not None:
+ self.result_obj.set_status(1)
+
+ # remove socketfile
+
+ return True
--- /dev/null
+[LOGGING]
+log_level=INFO
+
+[EXTENSION]
+crosswalk=--external-extensions-path=/usr/lib/tizen-extensions-crosswalk
+
+[TIZEN]
+tizen_user=app
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitliteutildir = /usr/lib/python2.7/dist-packages/testkitlite/util
+dist_testkitliteutil_SCRIPTS = *.py
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Liu,chengtao <chengtaox.liu@intel.com>
+""" The shell command executor module"""
+
+import os
+import sys
+import time
+import subprocess
+
+from testkitlite.util.killall import killall
+from testkitlite.util.str2 import str2str
+
+
+def shell_command(cmd, timeout=15):
+ """shell communication for quick return in sync mode"""
+ proc = subprocess.Popen(cmd,
+ shell=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE)
+ time_cnt = 0
+ exit_code = None
+ result = []
+ while time_cnt < timeout:
+ exit_code = proc.poll()
+ if not exit_code is None:
+ break
+ time_cnt += 0.2
+ time.sleep(0.2)
+
+ if exit_code is None:
+ killall(proc.pid)
+ exit_code = -1
+ result = []
+ elif not cmd.endswith('&'):
+ while True:
+ line = proc.stdout.readline()
+ if not line or line.find('daemon started') >= 0:
+ break
+ result.append(line)
+ return [exit_code, result]
+
+
+def shell_command_ext(cmd="",
+ timeout=None,
+ boutput=False,
+ stdout_file=None,
+ stderr_file=None,
+ callbk=None):
+ """shell executor, return [exitcode, stdout/stderr]
+ timeout: None means unlimited timeout
+ boutput: specify whether print output during the command running
+ """
+ if stdout_file is None:
+ stdout_file = os.path.expanduser("~") + os.sep + "shell_stdout"
+
+ if stderr_file is None:
+ stderr_file = os.path.expanduser("~") + os.sep + "shell_stderr"
+
+ exit_code = None
+ wbuffile1 = file(stdout_file, "w")
+ wbuffile2 = file(stderr_file, "w")
+ rbuffile1 = file(stdout_file, "r")
+ rbuffile2 = file(stderr_file, "r")
+ cmd_open = subprocess.Popen(args=cmd,
+ shell=True,
+ stdout=wbuffile1,
+ stderr=wbuffile2)
+ rbuffile1.seek(0)
+ rbuffile2.seek(0)
+
+ def print_log():
+ """print the stdout to terminate"""
+ if callbk and callable(callbk):
+ callbk(rbuffile1.read())
+ else:
+ sys.stdout.write(rbuffile1.read())
+ sys.stdout.write(rbuffile2.read())
+ sys.stdout.flush()
+
+ while True:
+ exit_code = cmd_open.poll()
+ if exit_code is not None:
+ break
+ if boutput:
+ print_log()
+ if timeout is not None:
+ timeout -= 0.1
+ if timeout <= 0:
+ exit_code = "timeout"
+ killall(cmd_open.pid)
+ time.sleep(3)
+ break
+ time.sleep(0.1)
+
+ if boutput:
+ print_log()
+ rbuffile1.seek(0)
+ rbuffile2.seek(0)
+ stdout_log = str2str(rbuffile1.read())
+ stderr_log = str2str(rbuffile2.read())
+ if 'returncode=' in stdout_log:
+ index = stdout_log.find('returncode=') + 11
+ exit_code = str(stdout_log[index:]).strip('\r\n')
+ stdout_log = '<![CDATA[' + stdout_log + ']]>'
+ stderr_log = '<![CDATA[' + stderr_log + ']]>'
+
+ wbuffile1.close()
+ wbuffile2.close()
+ rbuffile1.close()
+ rbuffile2.close()
+ os.remove(stdout_file)
+ os.remove(stderr_file)
+ return [exit_code, stdout_log, stderr_log]
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Liu,chengtao <liux.chengtao@intel.com>
+"""General Config Class"""
+
+import os
+import ConfigParser
+from ConfigParser import NoOptionError, NoSectionError
+
+CONFIG_FILE = "/opt/testkit/lite3.0/testkitlite/commodule/CONFIG"
+cfg = ConfigParser.ConfigParser()
+if os.path.exists(CONFIG_FILE):
+ cfg.read(CONFIG_FILE)
+else:
+ cfg.read(os.path.join(os.getcwd(), "CONFIG"))
+
+
+class Config:
+
+ LOG_LEVEL = cfg.get('LOGGING', 'log_level')
+
+ @staticmethod
+ def get_extension(extension_name):
+ ret = ""
+ try:
+ if extension_name is not None:
+ ret = cfg.get('EXTENSION', extension_name)
+ except (NoOptionError, NoSectionError) as error:
+ pass
+ except IOError as error:
+ pass
+ return ret
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Liu,chengtao <chengtaox.liu@intel.com>
+"""Test connector for test instance and target instance"""
+
+from testkitlite.util.log import LOGGER
+
+
+class ConnectorBuilder:
+
+ """Communication module for test host and test remote"""
+
+ def __init__(self, config):
+ self.conn = None
+ if "commodule" in config:
+ try:
+ exec "from testkitlite.commodule.%s import get_target_conn" % config[
+ "commodule"]
+ device_no = config.get('deviceid', None)
+ if device_no is not None:
+ self.conn = get_target_conn(device_no)
+ else:
+ self.conn = get_target_conn()
+ except Exception as error:
+ LOGGER.error("[ Error: Initialize commodule failed: '%s']\n" % error)
+
+ def get_connector(self):
+ """list the handler instance"""
+ return self.conn
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Liu,chengtao <liux.chengtao@intel.com>
+""" The definition of exceptions"""
+
+
+class InvalidDeviceException(Exception):
+ """
+ Device_Id not defined / Invalid Exception
+ """
+ __data = ""
+ def __init__(self, data):
+ self.__data = data
+
+ def __str__(self):
+ return self.__data
+
+class TestCaseNotFoundException(Exception):
+ """
+ Test case not found Exception
+ """
+ __data = ""
+ def __init__(self, data):
+ self.__data = data
+
+ def __str__(self):
+ return self.__data
+
+class TestEngineException(Exception):
+ """
+ Test case not found Exception
+ """
+ def __init__(self, name):
+ self.__engine = name
+
+ def __str__(self):
+ return "Failed to load test engine '%s'" % self.__engine
\ No newline at end of file
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Liu,chengtao <chengtaox.liu@intel.com>
+""" The http request process module"""
+
+import json
+from testkitlite.util.log import LOGGER
+
+try:
+ import requests
+except ImportError, err:
+ LOGGER.info("Failed to import 'requests' module, please check your installation:")
+ LOGGER.info(" You can use 'sudo pip install requests' to install the module!")
+ raise ImportError
+
+def get_url(baseurl, api):
+ """get full url string"""
+ return "%s%s" % (baseurl, api)
+
+
+def http_request(url, rtype="POST", data=None, time_out=30):
+ """
+ http request to the device http server
+ """
+ result = None
+ if rtype == "POST":
+ headers = {'content-type': 'application/json'}
+ try:
+ ret = requests.post(url, data=json.dumps(
+ data), headers=headers, timeout=time_out)
+
+ if ret:
+ result = ret.json()
+ except Exception as error:
+ LOGGER.error(str(error))
+ pass
+ elif rtype == "GET":
+ try:
+ ret = requests.get(url, params=data, timeout=time_out)
+ if ret:
+ result = ret.json()
+ except Exception as error:
+ LOGGER.error(str(error))
+ pass
+ return result
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+""" The process kill for os"""
+
+import os
+import platform
+import signal
+import re
+import ctypes
+
+
+def killall(ppid):
+ """Kill all children process by parent process ID"""
+ os_ver = platform.system()
+ try:
+ if os_ver == "Linux" or os_ver == "Darwin":
+ ppid = str(ppid)
+ pidgrp = []
+ if not ppid.isdigit():
+ return
+ def getchildpids(ppid):
+ """Return a list of children process"""
+ command = "ps -ef | awk '{if ($3 == %s) print $2;}'" % str(
+ ppid)
+ pids = os.popen(command).read()
+ pids = pids.split()
+ return pids
+
+ pidgrp.extend(getchildpids(ppid))
+ for pid in pidgrp:
+ pidgrp.extend(getchildpids(pid))
+ # Insert self process ID to PID group list
+ pidgrp.insert(0, ppid)
+ while len(pidgrp) > 0:
+ pid = pidgrp.pop()
+ try:
+ os.kill(int(pid), signal.SIGKILL)
+ except OSError, error:
+ pattern = re.compile('No such process')
+ match = pattern.search(str(error))
+ if not match:
+ print "[ Error: fail to kill pid: %s," \
+ " error: %s ]\n" % (int(pid), error)
+ # kill for windows platform
+ else:
+ kernel32 = ctypes.windll.kernel32
+ handle = kernel32.OpenProcess(1, 0, int(ppid))
+ kernel32.TerminateProcess(handle, 0)
+ except OSError, error:
+ pattern = re.compile('No such process')
+ match = pattern.search(str(error))
+ if not match:
+ print "[ Error: fail to kill pid: %s, error: %s ]\n" \
+ % (int(ppid), error)
+ return None
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright (C) 2013 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Liu,chengtao <liux.chengtao@intel.com>
+"""General Implementation"""
+
+import threading
+import logging
+import logging.handlers
+import sys
+import os
+
+# logger levels
+LEVELS = {"CRITICAL": 50,
+ "ERROR": 40,
+ "WARNING": 30,
+ "INFO": 20,
+ "DEBUG": 10,
+ "NOTSET": 0
+ }
+
+
+class Logger:
+
+ """General Logger Class"""
+ _instance = None
+ _mutex = threading.Lock()
+
+ def __init__(self, level="DEBUG", format_str="%(message)s"):
+ """Generate root logger"""
+ self._logger = logging.getLogger("TCT")
+ self._level = LEVELS[level]
+ self._logger.setLevel(LEVELS[level])
+ self._formatter = logging.Formatter(format_str)
+ self.add_print_logger()
+
+ def add_print_logger(self, level="INFO"):
+ """Generate console writer [StreamHandler]"""
+ writer = logging.StreamHandler(sys.stdout)
+ writer.setLevel(LEVELS[level])
+ writer.setFormatter(self._formatter)
+ self._logger.addHandler(writer)
+
+ @staticmethod
+ def get_logger(level="DEBUG", format_str="%(message)s"):
+ """sinlgeton of Logger"""
+ if Logger._instance is None:
+ Logger._mutex.acquire()
+ if Logger._instance is None:
+ Logger._instance = Logger(level, format_str)
+ else:
+ pass
+ Logger._mutex.release()
+ return Logger._instance
+
+ def debug(self, msg):
+ """debug level message"""
+ if msg is not None:
+ sys.stdout.write(msg + '\r\n')
+ sys.stdout.flush()
+
+ def info(self, msg):
+ """info level message"""
+ if msg is not None:
+ sys.stdout.write(msg + '\r\n')
+ sys.stdout.flush()
+
+ def warning(self, msg):
+ """warning level message"""
+ if msg is not None:
+ self._logger.warning(msg)
+
+ def error(self, msg):
+ """error level message"""
+ if msg is not None:
+ sys.stdout.write(msg + '\r\n')
+ sys.stdout.flush()
+
+ def critical(self, msg):
+ """critical level message"""
+ if msg is not None:
+ self._logger.critical(msg)
+
+from .config import Config
+
+LOGGER = Logger.get_logger(level=Config.LOG_LEVEL)
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Yuanyuan,Zou <yuanyuanx.zou@intel.com>
+
+""" kill testkit-lite """
+import os
+import re
+import platform
+if not platform.system() == "Windows":
+ import dbus
+
+import time
+from testkitlite.util.log import LOGGER
+from testkitlite.util.killall import killall
+from testkitlite.util.autoexec import shell_command
+
+DEVICE_DBUS = "testkit-lite-dbus"
+DEVICE_WHITE_LIST = ['localhost', '127.0.0.1']
+
+
+def kill_testkit_lite(pid_file):
+ """ kill testkit lite"""
+ try:
+ with open(pid_file, "r") as pidfile:
+ pid = pidfile.readline().rstrip("\n")
+ if pid:
+ killall(pid)
+ except IOError as error:
+ pattern = re.compile('No such file or directory|No such process')
+ match = pattern.search(str(error))
+ if not match:
+ LOGGER.info("[ Error: fail to kill existing testkit-lite, "\
+ "error: %s ]\n" % error)
+ return None
+
+def launch_dbus_deamon():
+ exit_code, ret = shell_command(DEVICE_DBUS + '&')
+ time.sleep(3)
+
+def get_device_lock(device_id):
+ if not OS_VER == "Windows":
+ LOGGER.debug("method using dbus is not implemented on windows")
+ return True
+
+ """ set device lock for current testkit lite"""
+ if device_id in DEVICE_WHITE_LIST:
+ return True
+ bus = dbus.SessionBus()
+ try:
+ device_service = bus.get_object('com.intel.testkit', '/com/intel/testkit/devices')
+ except Exception as error:
+ launch_dbus_deamon()
+ device_service = bus.get_object('com.intel.testkit', '/com/intel/testkit/devices')
+
+ try:
+ ret = device_service.addDevice(device_id)
+ return bool(ret)
+ except Exception as error:
+ return False
+
+def release_device_lock(device_id):
+ if not OS_VER == "Linux" and not OS_VER == "Darwin":
+ LOGGER.debug("method using dbus is not implemented on windows")
+ return True
+
+ """ kill testkit lite"""
+ if device_id in DEVICE_WHITE_LIST:
+ return True
+ bus = dbus.SessionBus()
+ try:
+ device_service = bus.get_object('com.intel.testkit', '/com/intel/testkit/devices')
+ ret = device_service.removeDevice(device_id)
+ return True
+ except Exception as error:
+ return False
+
+def clean_testxml(testxmls,remote_test):
+ """clean all test xmls"""
+ if remote_test:
+ EXISTS = os.path.exists
+ for testxml in testxmls:
+ if EXISTS(testxml):
+ fd_name = os.path.dirname(testxml)
+ os.remove(testxml)
+ os.rmdir(fd_name)
+ return None
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Chengtao,Liu <chengtaox.liu@intel.com>
+""" The implementation test result"""
+
+import threading
+from testkitlite.util.log import LOGGER
+from testkitlite.util.str2 import str2str
+
+
+class TestSetResut(object):
+
+ """ test result """
+
+ _progress = "execute case: %s # %s...(%s)"
+ _mutex = threading.Lock()
+
+ def __init__(self, testsuite_name="", testset_name=""):
+ self._suite_name = testsuite_name
+ self._set_name = testset_name
+ self._result = {"cases": []}
+ self._finished = 0
+
+ def set_status(self, flag=0):
+ """set finished tag"""
+ self._mutex.acquire()
+ self._finished = flag
+ self._mutex.release()
+
+ def get_status(self):
+ """return finished tag"""
+ self._mutex.acquire()
+ flag = self._finished
+ self._mutex.release()
+ return flag
+
+ def set_result(self, tresult):
+ """set cases result to result buffer"""
+ self._mutex.acquire()
+ self._result = tresult
+ self._mutex.release()
+
+ def extend_result(self, cases_result=None, print_out=True):
+ """update cases result to the result buffer"""
+ self._mutex.acquire()
+ if cases_result is not None:
+ self._result["cases"].extend(cases_result)
+
+ if print_out:
+ for case_it in cases_result:
+ LOGGER.info(self._progress %
+ (self._suite_name, case_it['case_id'], case_it['result']))
+ if case_it['result'].lower() in ['fail', 'block'] and 'stdout' in case_it:
+ LOGGER.info(str2str(case_it['stdout']))
+ self._mutex.release()
+
+ def get_result(self):
+ """get cases result from the result buffer"""
+ self._mutex.acquire()
+ result = self._result
+ self._mutex.release()
+
+ return result
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+# Yuanyuan,Zou <zouyuanx@intel.com>
+""" prepare run , split xml ,run case , merge result """
+import traceback
+import os
+import platform
+import time
+import sys
+from datetime import datetime
+from shutil import copyfile
+import xml.etree.ElementTree as etree
+import ConfigParser
+from tempfile import mktemp
+from shutil import move
+from os import remove
+import copy
+import re
+import ConfigParser
+from testkitlite.util.log import LOGGER
+from testkitlite.util.str2 import str2xmlstr
+from testkitlite.util.errors import TestCaseNotFoundException
+from testkitlite.util.errors import TestEngineException
+
+if platform.system().startswith("Linux"):
+ import fcntl
+if platform.system().startswith("Windows"):
+ import win32con
+ import win32file
+ import pywintypes
+
+
+
+
+
+JOIN = os.path.join
+DIRNAME = os.path.dirname
+BASENAME = os.path.basename
+EXISTS = os.path.exists
+ABSPATH = os.path.abspath
+
+# test constants
+OPT_LAUNCHER = 'test-launcher'
+OPT_EXTENSION = 'test-extension'
+OPT_DEBUG_LOG = 'debug-log-base'
+OPT_CAPABILITY = 'capability'
+OPT_DEBUG = 'debug'
+OPT_RERUN = 'rerun'
+OPT_WIDGET = 'test-widget'
+OPT_STUB = 'stub-name'
+OPT_STUB_PORT = 'stub-port'
+OPT_SUITE = 'testsuite-name'
+OPT_SET = 'testset-name'
+OPT_test_set_src = 'test-set-src'
+
+TCT_CONFIG_FILE = "/opt/tools/TCT_CONFIG"
+tct_parser = ConfigParser.ConfigParser()
+tct_parser.read(TCT_CONFIG_FILE)
+
+DEVICE_SUITE_TARGET_30 = tct_parser.get('DEVICE', 'DEVICE_SUITE_TARGET_30')
+DEVICE_EXECUTION_MODE_30 = tct_parser.get('DEVICE', 'DEVICE_EXECUTION_MODE_30')
+DEVICE_SUITE_TARGET_30_STR = "{DEVICE_SUITE_TARGET_30}"
+DEVICE_EXECUTION_MODE_30_STR = "{DEVICE_EXECUTION_MODE_30}"
+
+class TestSession:
+
+ """
+ Parse the testdefinition.xml files.
+ Apply filter for each run.
+ Conduct tests execution.
+ """
+
+ def __init__(self, connector, worker):
+ """ init all self parameters here """
+ # dryrun
+ self.bdryrun = False
+ # non_active
+ self.non_active = False
+ # result file
+ self.resultfile = None
+ # external test
+ self.external_test = None
+ # filter rules
+ self.filter_rules = None
+ self.debug = False
+ self.resultfiles = set()
+ self.core_auto_files = []
+ self.core_manual_files = []
+ self.unit_test_files = []
+ self.skip_all_manual = False
+ self.testsuite_dict = {}
+ self.exe_sequence = []
+ self.testresult_dict = {"pass": 0, "fail": 0,
+ "block": 0, "not_run": 0}
+ self.current_test_xml = "none"
+ self.first_run = True
+ self.deviceid = None
+ self.session_id = None
+ self.set_parameters = {}
+ self.connector = connector
+ self.stub_name = "testkit-stub"
+ self.testworker = worker
+ self.capabilities = {}
+ self.has_capability = False
+ self.rerun = False
+ self.test_prefix = ""
+ self.filter_ok = False
+ #self.wdurl = ""
+ #self.debugip = ""
+ self.targetplatform = ""
+ self.system = platform.system()
+ self.tizenV = None
+ self.stub_port = "8000"
+ self.skip_tc = None
+
+ def set_global_parameters(self, options):
+ "get all options "
+ # apply dryrun
+ if options.bdryrun:
+ self.bdryrun = options.bdryrun
+ # Disable set the result of core manual cases from the console
+ if options.non_active:
+ self.non_active = options.non_active
+ # apply user specify test result file
+ if options.resultfile:
+ self.resultfile = options.resultfile
+ # set the external test
+ if options.exttest:
+ self.external_test = options.exttest
+ if options.debug:
+ self.debug = options.debug
+ if options.rerun:
+ self.rerun = options.rerun
+ if options.test_prefix:
+ self.test_prefix = options.test_prefix
+ if options.device_serial:
+ self.deviceid = options.device_serial
+ if options.worker:
+ self.worker_name = options.worker
+ else:
+ self.worker_name = None
+ #if options.targetplatform:
+ self.targetplatform = os.environ.get("targetplatform",'')
+ #modify the wdurl value, yangx.zhou@intel.com, 2014.09.18
+ #if options.wdurl:
+ # self.wdurl = options.wdurl
+ #if options.debugip:
+ # self.debugip = options.debugip
+
+ def add_filter_rules(self, **kargs):
+ """
+ kargs: key:values - "":["",]
+ """
+ self.filter_rules = kargs
+
+ def set_session_id(self, session_id):
+ """ set the set test session id which is get form com_module """
+ self.session_id = session_id
+
+ def set_stubport(self, stubport):
+ self.stub_port = stubport
+
+ def set_tizenversion(self, tizenversion):
+ self.tizenV = tizenversion
+ self.testworker.set_TizenVersion(self.tizenV)
+
+ def set_skip_tc(self, skip_tc):
+ self.skip_tc = skip_tc
+
+ def set_capability(self, capabilities):
+ """ set capabilitys """
+ self.capabilities = capabilities
+ self.has_capability = True
+
+ def prepare_run(self, testxmlfile, resultdir=None):
+ """
+ testxmlfile: target testxml file
+ execdir and resultdir: should be the absolute path since TestSession
+ is the common lib
+ """
+ # resultdir is set to current directory by default
+ if not resultdir:
+ resultdir = os.getcwd()
+ self.session_dir = resultdir
+ try:
+ filename = testxmlfile
+ filename = os.path.splitext(filename)[0]
+ os_ver = platform.system()
+ if os_ver == "Linux" or os_ver == "Darwin":
+ file_items = filename.split('/')
+ else:
+ file_items = re.split(r'[/\\]+', filename)
+ if len(file_items) < 2 or file_items[-2] == "" or file_items[-1] == "":
+ return False
+ filename = file_items[-2] + '_' + file_items[-1]
+ if self.filter_rules["execution_type"] == ["manual"]:
+ resultfile = "%s.manual.xml" % filename
+ else:
+ resultfile = "%s.auto.xml" % filename
+ resultfile = JOIN(resultdir, resultfile)
+ if not EXISTS(resultdir):
+ os.mkdir(resultdir)
+ LOGGER.info("[ analysis test xml file: %s ]" % resultfile)
+ self.__prepare_result_file(testxmlfile, resultfile)
+ self.__split_test_xml(resultfile, resultdir)
+ except IOError as error:
+ LOGGER.error(error)
+ return False
+ return True
+
+ def __split_test_xml(self, resultfile, resultdir):
+ """ split_test_xml into auto and manual"""
+ setfind = etree.parse(resultfile).getiterator('set')
+ if setfind:
+ test_file_name = "%s" % BASENAME(resultfile)
+ test_file_name = os.path.splitext(test_file_name)[0]
+ self.__splite_external_test(
+ resultfile, test_file_name, resultdir)
+
+ def __splite_external_test(self, resultfile, test_file_name, resultdir):
+ """select external_test"""
+ testsuite_dict_value_list = []
+ testsuite_dict_add_flag = 0
+ filename_diff = 1
+
+ parser = etree.parse(resultfile)
+ for tsuite in parser.getiterator('suite'):
+ root = etree.Element('test_definition')
+ suitefilename = os.path.splitext(resultfile)[0]
+ suitefilename += ".suite_%s.xml" % filename_diff
+ suitefilename = JOIN(resultdir, suitefilename)
+ tsuite.tail = "\n"
+ root.append(tsuite)
+ try:
+ with open(suitefilename, 'w') as output:
+ tree = etree.ElementTree(element=root)
+ tree.write(output)
+ except IOError as error:
+ LOGGER.error("[ Error: create filtered result file: %s failed,\
+ error: %s ]" % (suitefilename, error))
+ case_suite_find = etree.parse(
+ suitefilename).getiterator('testcase')
+ if case_suite_find:
+ #add by yangx.zhou@intel.com. 2014.09.12
+ set_type = tsuite.find('set').get('type')
+ if set_type == 'script' or set_type == 'pyunit' or set_type == 'androidunit':
+ if set_type == 'script':
+ self.external_test = None
+ if self.filter_rules["execution_type"] == ["auto"]:
+ self.core_auto_files.append(suitefilename)
+ else:
+ self.core_manual_files.append(suitefilename)
+ self.resultfiles.add(suitefilename)
+
+ #if tsuite.get('launcher'):
+ elif set_type in ['js', 'ref','wrt', 'qunit']:
+ #elif set_type in ['js','wrt', 'qunit']:
+ testsuite_dict_value_list.append(suitefilename)
+ if testsuite_dict_add_flag == 0:
+ self.exe_sequence.append(test_file_name)
+ testsuite_dict_add_flag = 1
+ self.resultfiles.add(suitefilename)
+
+ # elif set_type =='ref' and self.worker_name == "webdriver":
+ # testsuite_dict_value_list.append(suitefilename)
+ # if testsuite_dict_add_flag == 0:
+ # self.exe_sequence.append(test_file_name)
+ # testsuite_dict_add_flag = 1
+ # self.resultfiles.add(suitefilename)
+
+ else:
+ if self.filter_rules["execution_type"] == ["auto"]:
+ self.core_auto_files.append(suitefilename)
+ else:
+ self.core_manual_files.append(suitefilename)
+ self.resultfiles.add(suitefilename)
+ else:
+ self.unit_test_files.append(suitefilename)
+ self.resultfiles.add(suitefilename)
+
+ filename_diff += 1
+ if testsuite_dict_add_flag:
+ self.testsuite_dict[test_file_name] = testsuite_dict_value_list
+
+ def __prepare_result_file(self, testxmlfile, resultfile):
+ """ write the test_xml content to resultfile"""
+ try:
+ parse_tree = etree.parse(testxmlfile)
+ suiteparent = parse_tree.getroot()
+ no_test_definition = 1
+ if parse_tree.getiterator('test_definition'):
+ no_test_definition = 0
+ if no_test_definition:
+ suiteparent = etree.Element('test_definition')
+ suiteparent.tail = "\n"
+ for suite in parse_tree.getiterator('suite'):
+ suite.tail = "\n"
+ suiteparent.append(suite)
+ self.apply_filter(suiteparent)
+ try:
+ with open(resultfile, 'w') as output:
+ tree = etree.ElementTree(element=suiteparent)
+ tree.write(output)
+ except IOError as error:
+ LOGGER.error("[ Error: create filtered result file: %s failed,\
+ error: %s ]" % (resultfile, error))
+ except IOError as error:
+ LOGGER.error(error)
+ return False
+
+ def run_case(self, latest_dir):
+ """ run case """
+ # case not found
+ case_ids = self.filter_rules.get('id')
+ #print 'disable dlog', self.disabledlog
+ if case_ids and not self.filter_ok:
+ raise TestCaseNotFoundException('Test case %s not found!' % case_ids)
+
+ # run core auto cases
+ self.__run_core_auto()
+
+ # run webAPI cases
+ self.__run_webapi_test(latest_dir)
+
+ # run core manual cases
+ self.__run_core_manual()
+
+ # run unit test cases
+ self.__run_unit_test()
+
+ def __run_core_auto(self):
+ """ core auto cases run"""
+ self.core_auto_files.sort()
+ for core_auto_file in self.core_auto_files:
+ temp_test_xml = os.path.splitext(core_auto_file)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml += ".auto"
+ # print identical xml file name
+ if self.current_test_xml != temp_test_xml:
+ time.sleep(3)
+ LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+ self.current_test_xml = temp_test_xml
+ self.__run_with_worker(core_auto_file)
+
+ def __run_core_manual(self):
+ """ core manual cases run """
+ self.core_manual_files.sort()
+ for core_manual_file in self.core_manual_files:
+ temp_test_xml = os.path.splitext(core_manual_file)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml += ".manual"
+ # print identical xml file name
+ if self.current_test_xml != temp_test_xml:
+ time.sleep(3)
+ LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+ self.current_test_xml = temp_test_xml
+ if self.non_active:
+ self.skip_all_manual = True
+ else:
+ self.__run_with_worker(core_manual_file)
+
+ def __run_unit_test(self):
+ """ unit test cases run """
+ for ut_file in self.unit_test_files:
+ temp_test_xml = os.path.splitext(ut_file)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml = os.path.splitext(temp_test_xml)[0]
+ temp_test_xml += ".auto"
+ # print identical xml file name
+ if self.current_test_xml != temp_test_xml:
+ time.sleep(3)
+ LOGGER.info("\n[ testing xml: %s.xml ]" % temp_test_xml)
+ self.current_test_xml = temp_test_xml
+ self.__run_with_worker(ut_file)
+
+ def __run_webapi_test(self, latest_dir):
+ """ run webAPI test"""
+ if self.bdryrun:
+ LOGGER.info("[ Web Test mode does not support dryrun ]")
+ return True
+
+ list_auto = []
+ list_manual = []
+ for i in self.exe_sequence:
+ if i[-4::1] == "auto":
+ list_auto.append(i)
+ if i[-6::1] == "manual":
+ list_manual.append(i)
+ list_auto.sort()
+ list_manual.sort()
+ self.exe_sequence = []
+ self.exe_sequence.extend(list_auto)
+ self.exe_sequence.extend(list_manual)
+
+ for webapi_total_file in self.exe_sequence:
+ for webapi_file in self.testsuite_dict[webapi_total_file]:
+ # print identical xml file name
+ if self.current_test_xml != JOIN(latest_dir, webapi_total_file):
+ time.sleep(3)
+ LOGGER.info("\n[ testing xml: %s.xml ]\n"
+ % JOIN(latest_dir, webapi_total_file))
+ self.current_test_xml = JOIN(latest_dir, webapi_total_file)
+
+ self.__run_with_worker(webapi_file)
+
+ def __run_with_worker(self, suite_test_xml):
+ """run_with_commodule,Initialization,check status,get result"""
+ try:
+ # prepare test set list
+ test_xml_set_list = self.__split_xml_to_set(suite_test_xml)
+ # create temporary parameter
+ for test_xml_set in test_xml_set_list:
+ LOGGER.info("\n[ run set: %s ]" % test_xml_set)
+ # prepare the test JSON
+ self.__prepare_external_test_json(test_xml_set)
+
+ # init test here
+ init_status = self.__init_com_module(test_xml_set)
+ if not init_status:
+ continue
+ # send set JSON Data to com_module
+ # if not self.worker_name and self.set_parameters['type'] == 'ref':
+ # continue
+ # else:
+ u_ret = self.testworker.run_test(self.session_id, self.set_parameters)
+ if not u_ret:
+ continue
+ while True:
+ time.sleep(1)
+ # check the test status ,if the set finished,get
+ # the set_result,and finalize_test
+ if self.__check_test_status():
+ set_result = self.testworker.get_test_result(
+ self.session_id)
+ # write_result to set_xml
+ self.__write_set_result(
+ test_xml_set, set_result)
+ # shut down server
+ self.finalize_test(self.session_id)
+ break
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: fail to run webapi test xml, error: %s ]" % error)
+
+ def __split_xml_to_set(self, webapi_file):
+ """split xml by <set>"""
+
+ LOGGER.debug("[ split xml: %s by <set> ]" % webapi_file)
+ LOGGER.debug("[ this might take some time, please wait ]")
+ set_number = 1
+ test_xml_set_list = []
+ self.resultfiles.discard(webapi_file)
+ test_xml_temp = etree.parse(webapi_file)
+ for test_xml_temp_suite in test_xml_temp.getiterator('suite'):
+ while set_number <= len(test_xml_temp_suite.getiterator('set')):
+ #print 'debug',test_xml_temp_suite.find('set')[set_number].get('type')
+ copy_url = os.path.splitext(webapi_file)[0]
+ copy_url += "_set_%s.xml" % set_number
+ copyfile(webapi_file, copy_url)
+ test_xml_set_list.append(copy_url)
+ self.resultfiles.add(copy_url)
+ set_number += 1
+ time.sleep(3)
+ set_number -= 1
+ LOGGER.info("[ total set number is: %s ]" % set_number)
+
+ # only keep one set in each xml file and remove empty set
+ test_xml_set_list_empty = []
+ if len(test_xml_set_list) > 1:
+ test_xml_set_list.reverse()
+ for test_xml_set in test_xml_set_list:
+ test_xml_set_tmp = etree.parse(test_xml_set)
+ set_keep_number = 1
+ for temp_suite in test_xml_set_tmp.getiterator('suite'):
+ for test_xml_set_temp_set in temp_suite.getiterator('set'):
+ if set_keep_number != set_number:
+ temp_suite.remove(test_xml_set_temp_set)
+ else:
+ if not test_xml_set_temp_set.getiterator('testcase'):
+ test_xml_set_list_empty.append(test_xml_set)
+ set_keep_number += 1
+ set_number -= 1
+ test_xml_set_tmp.write(test_xml_set)
+ for empty_set in test_xml_set_list_empty:
+ LOGGER.debug("[ remove empty set: %s ]" % empty_set)
+ test_xml_set_list.remove(empty_set)
+ self.resultfiles.discard(empty_set)
+ if len(test_xml_set_list) > 1:
+ test_xml_set_list.reverse()
+ return test_xml_set_list
+
+ def lock(self, fl):
+ try:
+ if self.system.startswith("Linux"):
+ #if self.system.startswith("Linux"):
+ fcntl.flock(fl, fcntl.LOCK_EX)
+ else:
+ hfile = win32file._get_osfhandle(fl.fileno())
+ ov = pywintypes.OVERLAPPED()
+ win32file.LockFileEx(hfile, win32con.LOCKFILE_EXCLUSIVE_LOCK, 0, -0x10000, ov)
+ except:
+ print traceback.print_exc()
+ return False
+ else:
+ return True
+
+ def release(self, fl):
+ if self.system.startswith("Linux"):
+ fcntl.flock(fl, fcntl.LOCK_UN)
+ elif self.system.startswith("Windows"):
+ hfile = win32file._get_osfhandle(fl.fileno())
+ win32file.UnlockFileEx(hfile, 0, -0x10000, pywintypes.OVERLAPPED())
+
+ def merge_resultfile(self, start_time, latest_dir):
+ """ merge_result_file """
+ mergefile = mktemp(suffix='.xml', prefix='tests.', dir=latest_dir)
+ mergefile = os.path.splitext(mergefile)[0]
+ mergefile = os.path.splitext(mergefile)[0]
+ mergefile = "%s.result" % BASENAME(mergefile)
+ mergefile = "%s.xml" % mergefile
+ mergefile = JOIN(latest_dir, mergefile)
+ end_time = datetime.today().strftime("%Y-%m-%d_%H_%M_%S")
+ LOGGER.info("\n[ test complete at time: %s ]" % end_time)
+ LOGGER.debug("[ start merging test result xml files, "\
+ "this might take some time, please wait ]")
+ LOGGER.debug("[ merge result files into %s ]" % mergefile)
+ root = etree.Element('test_definition')
+ root.tail = "\n"
+ totals = set()
+
+ # merge result files
+ resultfiles = self.resultfiles
+ totals = self.__merge_result(resultfiles, totals)
+ for total in totals:
+ result_xml = etree.parse(total)
+ for suite in result_xml.getiterator('suite'):
+ if suite.getiterator('testcase'):
+ suite.tail = "\n"
+ root.append(suite)
+
+ # print test summary
+ self.__print_summary()
+ # generate actual xml file
+ LOGGER.info("[ generate result xml: %s ]" % mergefile)
+ if self.skip_all_manual:
+ LOGGER.info("[ some results of core manual cases are N/A,"
+ "please refer to the above result file ]")
+ LOGGER.info("[ merge complete, write to the result file,"
+ " this might take some time, please wait ]")
+ # get useful info for xml
+ # add environment node
+ # add summary node
+ root.insert(0, get_summary(start_time, end_time))
+ root.insert(0, self.__get_environment())
+ # add XSL support to testkit-lite
+ declaration_text = """<?xml version="1.0" encoding="UTF-8"?>
+ <?xml-stylesheet type="text/xsl" href="testresult.xsl"?>\n"""
+ try:
+ with open(mergefile, 'w') as output:
+ output.write(declaration_text)
+ tree = etree.ElementTree(element=root)
+ tree.write(output, xml_declaration=False, encoding='utf-8')
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: merge result file failed, error: %s ]" % error)
+ # change <![CDATA[]]> to <![CDATA[]]>
+ replace_cdata(mergefile)
+ # copy result to -o option
+ self._final_merge(mergefile)
+
+ def _final_merge(self, mergefile):
+ try:
+ if self.resultfile:
+ if os.path.splitext(self.resultfile)[-1] == '.xml':
+ if not EXISTS(os.path.dirname(self.resultfile)):
+ if len(os.path.dirname(self.resultfile)) > 0:
+ os.makedirs(os.path.dirname(self.resultfile))
+ LOGGER.info("[ copy result xml to output file: %s ]" % self.resultfile)
+ copyfile(mergefile, self.resultfile)
+ else:
+ LOGGER.info(
+ "[ Please specify and xml file for result output,"
+ " not:%s ]" % self.resultfile)
+ except IOError as error:
+ LOGGER.error("[ Error: fail to copy the result file to: %s,"
+ " please check if you have created its parent directory,"
+ " error: %s ]" % (self.resultfile, error))
+ '''
+ if not EXISTS(self.resultfile):
+ if not EXISTS(DIRNAME(self.resultfile)):
+ if len(DIRNAME(self.resultfile)) > 0:
+ os.makedirs(DIRNAME(self.resultfile))
+ LOGGER.info("[ copy result xml to output file:"
+ " %s ]" % self.resultfile)
+ copyfile(mergefile, self.resultfile)
+
+ else:
+ suite_total = {}
+ #print 'result file path : ' , self.resultfile
+ xml_element_tree = etree.parse(self.resultfile).getroot()
+ for suite in xml_element_tree.getiterator('suite'):
+ suite_name = suite.get('name').strip()
+ #print suite_name,'suite_name'
+ if suite_name:
+ if suite_name not in suite_total.keys():
+ suite_total[suite_name] = []
+ for set in suite.getiterator('set'):
+ set_name = set.get('name').strip()
+ if set_name:
+ suite_total['%s' %suite_name].append(set_name)
+
+ if xml_element_tree is not None:
+ #f = open(self.resultfile, 'w')
+ while True:
+ #self.lock(f)
+ f = open(self.resultfile, 'w')
+ if self.lock(f):
+ time.sleep(1)
+ #pass
+
+ root = etree.parse(mergefile).getroot()
+ for suite in root.getiterator('suite'):
+ suite_name = suite.get('name').strip()
+ if suite_name in suite_total.keys():
+ for set in suite.getiterator('set'):
+ set_name = set.get('name').strip()
+ if set_name in suite_total[suite_name]:
+ # for testcase in set.getiterator('testcase'):
+ for dest_suite in xml_element_tree.getiterator('suite'):
+ if cmp(dest_suite.get('name').strip(),suite_name) ==0:
+ for dest_set in dest_suite.getiterator('set'):
+ if cmp(dest_set.get('name').strip(),set_name) == 0:
+ #xml_element_tree.find(suite).find(set).append(testcase)
+ for testcase in set.getiterator('testcase'):
+ dest_set.append(testcase)
+ else:
+ for dest_suite in xml_element_tree.getiterator('suite'):
+ if cmp(dest_suite.get('name').strip(),suite_name) ==0:
+ dest_suite.append(set)
+ suite_total[suite_name].append(set_name)
+ else:
+ xml_element_tree.append(suite)
+ suite_total[suite_name] = []
+ for set in suite.getiterator('set'):
+ if set.get('name'):
+ suite_total[suite_name].append(set.get('name'))
+ try:
+ f.write(etree.tostring(xml_element_tree))
+ except:
+ self.release(f)
+ LOGGER.Warning("[ can not write to result file:" " %s]" %self.resultfile)
+ break
+ else:
+ self.release(f)
+ f.close()
+ try:
+ root = etree.parse(self.resultfile).getroot()
+ except:
+ break
+ else:
+ self.testresult_dict = {"pass":0 , "fail":0, "block":0, "not_run": 0}
+ for result_testcase in root.getiterator("testcase"):
+ if result_testcase.get("result") == "PASS":
+ self.testresult_dict["pass"] += 1
+ if result_testcase.get("result") == "FAIL":
+ self.testresult_dict["fail"] += 1
+ if result_testcase.get("result") == "BLOCK":
+ self.testresult_dict["block"] += 1
+ if result_testcase.get("result").lower() == "NOT_RUN":
+ self.testresult_dict["not_run"] += 1
+ self.__print_summary()
+ break
+ else:
+ time.sleep(1)
+ self.lock(f)
+ '''
+
+ def __merge_result(self, setresultfiles, totals):
+ """ merge set result to total"""
+ resultfiles = setresultfiles
+ for resultfile in resultfiles:
+ totalfile = os.path.splitext(resultfile)[0]
+ totalfile = os.path.splitext(totalfile)[0]
+ totalfile = os.path.splitext(totalfile)[0]
+ totalfile = "%s.total" % totalfile
+ totalfile = "%s.xml" % totalfile
+ total_xml = etree.parse(totalfile)
+ # LOGGER.info("|--[ merge webapi result file: %s ]" % resultfile)
+ result_xml = etree.parse(resultfile)
+ root = result_xml.getroot()
+ for total_suite in total_xml.getiterator('suite'):
+ for total_set in total_suite.getiterator('set'):
+ for result_suite in result_xml.getiterator('suite'):
+ for result_set in result_suite.getiterator('set'):
+ # when total xml and result xml have same suite, set
+ # print result_set.get('type'),'debug',resultfile
+ if result_set.get('type') =='pyunit':
+ for test_case in result_set.getiterator('testcase'):
+ #print test_case.find('description/test_script_entry').text
+ if (test_case.find('description/test_script_entry') is not None) and test_case.find('description/test_script_entry').text:
+ result_set.remove(test_case)
+ self.__merge_result_by_name(
+ result_set, total_set, result_suite, total_suite)
+ else:
+ self.__merge_result_by_name(
+ result_set, total_set, result_suite, total_suite)
+ total_xml.write(totalfile)
+ totals.add(totalfile)
+ return totals
+
+ def __merge_result_by_name(
+ self, result_set, total_set, result_suite, total_suite):
+ ''' merge result select by name'''
+ if result_set.get('name') == total_set.get('name') \
+ and result_suite.get('name') == total_suite.get('name'):
+ if result_set.get('set_debug_msg'):
+ total_set.set("set_debug_msg", result_set.get('set_debug_msg'))
+ result_case_iterator = result_set.getiterator(
+ 'testcase')
+ if result_case_iterator:
+ for result_case in result_case_iterator:
+ try:
+ if self.skip_tc and str(self.skip_tc).find(result_case.get('id')) > -1:
+ continue
+ self.__count_result(result_case)
+ total_set.append(result_case)
+ except IOError as error:
+ LOGGER.error("[ Error: fail to append %s, error: %s ]"
+ % (result_case.get('id'), error))
+ def __count_result(self, result_case):
+ """ record the pass,failed,block,N/A case number"""
+ if not result_case.get('result'):
+ result_case.set('result', 'N/A')
+ # add empty result node structure for N/A case
+ resinfo_elm = etree.Element('result_info')
+ res_elm = etree.Element('actual_result')
+ start_elm = etree.Element('start')
+ end_elm = etree.Element('end')
+ stdout_elm = etree.Element('stdout')
+ stderr_elm = etree.Element('stderr')
+ resinfo_elm.append(res_elm)
+ resinfo_elm.append(start_elm)
+ resinfo_elm.append(end_elm)
+ resinfo_elm.append(stdout_elm)
+ resinfo_elm.append(stderr_elm)
+ result_case.append(resinfo_elm)
+ res_elm.text = 'N/A'
+ if result_case.get('result') == "PASS":
+ self.testresult_dict["pass"] += 1
+ if result_case.get('result') == "FAIL":
+ self.testresult_dict["fail"] += 1
+ if result_case.get('result') == "BLOCK":
+ self.testresult_dict["block"] += 1
+ if result_case.get('result') == "N/A":
+ self.testresult_dict["not_run"] += 1
+
+ def __get_environment(self):
+ """ get environment """
+ device_info = self.connector.get_device_info()
+ build_infos = self.connector.get_buildinfo(self.tizenV)
+ # add environment node
+ environment = etree.Element('environment')
+ environment.attrib['device_id'] = device_info["device_id"]
+ environment.attrib['device_model'] = device_info["device_model"]
+ environment.attrib['device_name'] = device_info["device_name"]
+ environment.attrib['host'] = platform.platform()
+ environment.attrib['lite_version'] = get_version_info()
+ environment.attrib['resolution'] = device_info["resolution"]
+ environment.attrib['screen_size'] = device_info["screen_size"]
+ environment.attrib['build_id'] = device_info['build_id']
+ environment.attrib['manufacturer'] = build_infos['manufacturer']
+ other = etree.Element('other')
+ other.text = ""
+ environment.append(other)
+ environment.tail = "\n"
+
+ return environment
+
+ def __print_summary(self):
+ """ print test summary infomation"""
+ LOGGER.info("[ test summary ]")
+ total_case_number = int(self.testresult_dict["pass"]) \
+ + int(self.testresult_dict["fail"]) \
+ + int(self.testresult_dict["block"]) \
+ + int(self.testresult_dict["not_run"])
+ #LOGGER.info(" [ total case number: %s ]" % (total_case_number))
+ if total_case_number == 0:
+ LOGGER.info("[Warning: found 0 case from the result files, "
+ "if it's not right, please check the test xml files, "
+ "or the filter values ]")
+ else:
+ LOGGER.info(" [ total case number: %s ]" % (total_case_number))
+ LOGGER.info(" [ pass rate: %.2f%% ]" % (float(
+ self.testresult_dict["pass"]) * 100 / int(total_case_number)))
+ LOGGER.info(" [ PASS case number: %s ]" %
+ self.testresult_dict["pass"])
+ LOGGER.info(" [ FAIL case number: %s ]" %
+ self.testresult_dict["fail"])
+ LOGGER.info(" [ BLOCK case number: %s ]" %
+ self.testresult_dict["block"])
+ LOGGER.info(" [ N/A case number: %s ]" %
+ self.testresult_dict["not_run"])
+
+ def __prepare_external_test_json(self, resultfile):
+ """Run external test"""
+ parameters = {}
+ xml_set_tmp = resultfile
+ # split set_xml by <case> get case parameters
+ LOGGER.debug("[ split xml: %s by <case> ]" % xml_set_tmp)
+ LOGGER.debug("[ this might take some time, please wait ]")
+ try:
+ parse_tree = etree.parse(xml_set_tmp)
+ root_em = parse_tree.getroot()
+ tsuite = root_em.getiterator('suite')[0]
+ case_tmp = []
+ parameters.setdefault("suite_name", tsuite.get('name'))
+ for tset in root_em.getiterator('set'):
+ case_order = 1
+ parameters.setdefault("casecount", str(len(tset.getiterator('testcase'))))
+ parameters.setdefault("current_set_name", xml_set_tmp)
+ parameters.setdefault("name", tset.get('name'))
+ parameters.setdefault("type", tset.get('type'))
+ parameters.setdefault("exetype", '')
+ #add test set location, yangx.zhou@intel.com
+ parameters.setdefault("location", '')
+ if tset.get("location") is not None:
+ parameters["location"] = tset.get("location")
+
+ # if tset.get("test_set_src") is not None:
+ # set_entry = self.test_prefix + tset.get("test_set_src")
+ # parameters.setdefault("test_set_src", set_entry)
+
+ for tcase in tset.getiterator('testcase'):
+ if self.skip_tc and str(self.skip_tc).find(tcase.get('id')) > -1:
+ continue
+
+ case_detail_tmp = {}
+ step_tmp = []
+ parameters["exetype"] = tcase.get('execution_type')
+ case_detail_tmp.setdefault("case_id", tcase.get('id'))
+ case_detail_tmp.setdefault("purpose", tcase.get('purpose'))
+ case_detail_tmp.setdefault("order", str(case_order))
+ case_detail_tmp.setdefault("onload_delay", "3")
+ if parameters["location"] != '':
+ case_detail_tmp.setdefault("location", parameters["location"])
+ else:
+ case_detail_tmp.setdefault("location", "device")
+
+ if tcase.find('description/test_script_entry') is not None:
+ tc_entry = tcase.find(
+ 'description/test_script_entry').text
+ if not tc_entry:
+ tc_entry = ""
+
+ tc_entry = tc_entry.replace(DEVICE_SUITE_TARGET_30_STR,DEVICE_SUITE_TARGET_30)
+ tc_entry = tc_entry.replace(DEVICE_EXECUTION_MODE_30_STR,DEVICE_EXECUTION_MODE_30)
+
+ case_detail_tmp["entry"] = self.test_prefix + tc_entry
+ if tcase.find(
+ 'description/test_script_entry').get('timeout'):
+ case_detail_tmp["timeout"] = tcase.find(
+ 'description/test_script_entry'
+ ).get('timeout')
+ if tcase.find(
+ 'description/test_script_entry'
+ ).get('test_script_expected_result'):
+ case_detail_tmp["expected_result"] = tcase.find(
+ 'description/test_script_entry'
+ ).get('test_script_expected_result')
+ if tcase.find(
+ 'description/test_script_entry'
+ ).get('location'):
+ case_detail_tmp["location"] = tcase.find(
+ 'description/test_script_entry'
+ ).get('location')
+ tc_refer_entry = ""
+ if tcase.find('description/refer_test_script_entry') is not None:
+ tc_refer_entry = tcase.find(
+ 'description/refer_test_script_entry').text
+
+ case_detail_tmp["refer_entry"] = tc_refer_entry
+
+ if tcase.find('description/refer_test_script_entry')is not None:
+ case_detail_tmp["refer_timeout"] = tcase.find(
+ 'description/refer_test_script_entry').get('timeout')
+ if tcase.find('description/refer_test_script_entry')is not None:
+ case_detail_tmp["refer_expected_result"] = tcase.find(
+ 'description/refer_test_script_entry').get('test_script_expected_result')
+ if tcase.find('description/refer_test_script_entry') is not None:
+ case_detail_tmp["refer_location"] = tcase.find(
+ 'description/refer_test_script_entry').get('location')
+
+ if tcase.getiterator("step"):
+ for this_step in tcase.getiterator("step"):
+ step_detail_tmp = {}
+ step_detail_tmp.setdefault("order", "1")
+ step_detail_tmp["order"] = str(
+ this_step.get('order'))
+
+ if this_step.find("step_desc") is not None:
+ text = this_step.find("step_desc").text
+ if text is not None:
+ step_detail_tmp["step_desc"] = text
+
+ if this_step.find("expected") is not None:
+ text = this_step.find("expected").text
+ if text is not None:
+ step_detail_tmp["expected"] = text
+
+ step_tmp.append(step_detail_tmp)
+
+ case_detail_tmp['steps'] = step_tmp
+
+ if tcase.find('description/pre_condition') is not None:
+ text = tcase.find('description/pre_condition').text
+ if text is not None:
+ case_detail_tmp["pre_condition"] = text
+
+ if tcase.find('description/post_condition') is not None:
+ text = tcase.find('description/post_condition').text
+ if text is not None:
+ case_detail_tmp['post_condition'] = text
+
+ if tcase.get('onload_delay') is not None:
+ case_detail_tmp[
+ 'onload_delay'] = tcase.get('onload_delay')
+ # Check performance test
+ if tcase.find('measurement') is not None:
+ measures = tcase.getiterator('measurement')
+ measures_array = []
+ for measure in measures:
+ measure_json = {}
+ measure_json['name'] = measure.get('name')
+ measure_json['file'] = measure.get('file')
+ measures_array.append(measure_json)
+ case_detail_tmp['measures'] = measures_array
+ case_tmp.append(case_detail_tmp)
+ case_order += 1
+ parameters.setdefault("cases", case_tmp)
+ if self.bdryrun:
+ parameters.setdefault("dryrun", True)
+ self.set_parameters = parameters
+
+ #add by yangx.zhou@intel.com, 2014.09.11
+ # if self.worker_name !=None and self.worker_name == 'webdriver':
+ # value = 'webdriver'
+ value = None
+ if parameters['type']!= None and self.worker_name == None:
+ # if parameters['type'] == 'script':
+ # value = 'default'
+ if parameters['type'] == 'androidunit':
+ value = 'androidunit'
+ #value ='default'
+ elif parameters['type'] == 'pyunit' :
+ value = 'pyunit'
+ elif parameters['type'] == 'qunit':
+ value = 'default'
+ if value != None:
+ try:
+ exec "from testkitlite.engines.%s import TestWorker" %value
+ LOGGER.info("TestWorker is %s" %value)
+ except Exception as error:
+ #print 'path: ', os.getcwd()
+ raise TestEngineException(value)
+ else:
+ self.testworker = TestWorker(self.connector)
+ except IOError as error:
+ LOGGER.error("[ Error: fail to prepare cases parameters, "
+ "error: %s ]\n" % error)
+ return False
+ return True
+
+ def apply_filter(self, root_em):
+ """ apply filter """
+ rules = self.filter_rules
+ for tsuite in root_em.getiterator('suite'):
+ if rules.get('suite'):
+ if tsuite.get('name') not in rules['suite']:
+ root_em.remove(tsuite)
+ for tset in tsuite.getiterator('set'):
+ if rules.get('set'):
+ if tset.get('name') not in rules['set']:
+ tsuite.remove(tset)
+
+ for tsuite in root_em.getiterator('suite'):
+ for tset in tsuite.getiterator('set'):
+ # if there are capabilities ,do filter
+ if self.has_capability:
+ tset_status = self.__apply_capability_filter_set(tset)
+ if not tset_status:
+ tsuite.remove(tset)
+ continue
+ for tcase in tset.getiterator('testcase'):
+ if not self.__apply_filter_case_check(tcase):
+ tset.remove(tcase)
+ else:
+ self.filter_ok = True
+
+ def __apply_filter_case_check(self, tcase):
+ """filter cases"""
+ rules = self.filter_rules
+ for key in rules.iterkeys():
+ if key in ["suite", "set"]:
+ continue
+ # Check attribute
+ t_val = tcase.get(key)
+ if t_val:
+ if not t_val in rules[key]:
+ return False
+ else:
+ # Check sub-element
+ items = tcase.getiterator(key)
+ if items:
+ t_val = []
+ for i in items:
+ t_val.append(i.text)
+ if len(set(rules[key]) & set(t_val)) == 0:
+ return False
+ else:
+ return False
+ return True
+
+ def __apply_capability_filter_set(self, tset):
+ """ check the set required capability with self.capabilities """
+
+ for tcaps in tset.getiterator('capabilities'):
+ for tcap in tcaps.getiterator('capability'):
+ capname = None
+ capvalue = None
+ capname = tcap.get('name').lower()
+ if tcap.find('value') is not None:
+ capvalue = tcap.find('value').text
+
+ if capname in self.capabilities:
+ if capvalue is not None:
+ if capvalue != self.capabilities[capname]:
+ # if capability value is not equal ,remove the case
+ return False
+ else:
+ # if does not hava this capability ,remove case
+ return False
+ return True
+
+ # sdx@kooltux.org: parse measures returned by test script
+ # and insert in XML result
+ # see xsd/test_definition.xsd: measurementType
+ _MEASURE_ATTRIBUTES = ['name', 'value', 'unit',
+ 'target', 'failure', 'power']
+
+ def __insert_measures(self, case, buf, pattern="###[MEASURE]###"):
+ """ get measures """
+ measures = self.__extract_measures(buf, pattern)
+ for measure in measures:
+ m_elm = etree.Element('measurement')
+ for key in measure:
+ m_elm.attrib[key] = measure[key]
+ case.append(m_elm)
+
+ def __extract_measures(self, buf, pattern):
+ """
+ This function extracts lines from <buf> containing the defined
+ <pattern>. For each line containing the pattern, it extracts the
+ string to the end of line Then it splits the content in multiple
+ fields using the defined separator <field_sep> and maps the fields
+ to measurement attributes defined in xsd. Finally, a list containing
+ all measurement objects found in input buffer is returned
+ """
+ out = []
+ for line in buf.split("\n"):
+ pos = line.find(pattern)
+ if pos < 0:
+ continue
+
+ measure = {}
+ elts = collections.deque(line[pos + len(pattern):].split(':'))
+ for k in self._MEASURE_ATTRIBUTES:
+ if len(elts) == 0:
+ measure[k] = ''
+ else:
+ measure[k] = elts.popleft()
+
+ # don't accept unnamed measure
+ if measure['name'] != '':
+ out.append(measure)
+ return out
+
+ def __init_com_module(self, testxml):
+ """
+ send init test to com_module
+ if webapi test,com_module will start testkit-stub
+ else com_module send the test case to devices
+ """
+ starup_prms = self.__prepare_starup_parameters(testxml)
+ # init stub and get the session_id
+ session_id = self.testworker.init_test(starup_prms)
+ if session_id == None:
+ LOGGER.error("[ Error: Initialization Error]")
+ return False
+ else:
+ self.set_session_id(session_id)
+ return True
+
+ def __prepare_starup_parameters(self, testxml):
+ """ prepare_starup_parameters """
+
+ starup_parameters = {}
+ LOGGER.info("[ preparing for startup options ]")
+ try:
+ parse_tree = etree.parse(testxml)
+ tsuite = parse_tree.getroot().getiterator('suite')[0]
+ tset = parse_tree.getroot().getiterator('set')[0]
+ #if tset.get("launcher") is not None:
+ # starup_parameters[OPT_LAUNCHER] = tset.get("launcher")
+ #else:
+ # starup_parameters[OPT_LAUNCHER] = tsuite.get("launcher")
+
+
+ if self.external_test is not None:
+ starup_parameters[OPT_LAUNCHER] = self.external_test
+ starup_parameters[OPT_EXTENSION] = self.external_test.split(' ')[0]
+
+ tp = tset.get('type')
+
+ if tp == "wrt":
+ starup_parameters[OPT_LAUNCHER] = "xwalk -iu"
+ starup_parameters[OPT_EXTENSION] = "xwalk"
+ elif tp in ['js','qunit', 'ref']:
+ starup_parameters[OPT_LAUNCHER] = "xwalk"
+ # jh0219.han@samsung.com //in
+ elif tp == "uifw":
+ starup_parameters[OPT_LAUNCHER] = "xwalk -a"
+ elif tp == "uifwr":
+ starup_parameters[OPT_LAUNCHER] = "xwalk -r"
+ # jh0219.han@samsung.com //out
+ #print starup_parameters[OPT_LAUNCHER],'debug'
+ # if self.external_test is not None:
+ # starup_parameters[OPT_LAUNCHER] = self.external_test
+ # starup_parameters[OPT_EXTENSION] = self.external_test.split(' ')[0]
+
+ if tsuite.get("extension") is not None:
+ starup_parameters[OPT_EXTENSION] = tsuite.get("extension")
+ if tsuite.get("widget") is not None:
+ starup_parameters[OPT_WIDGET] = tsuite.get("widget")
+ starup_parameters[OPT_SUITE] = tsuite.get("name")
+ starup_parameters[OPT_SET] = tset.get("name")
+ starup_parameters[OPT_STUB] = self.stub_name
+ starup_parameters[OPT_STUB_PORT] = self.stub_port
+ starup_parameters['tizen-version'] =self.tizenV
+
+ # if self.external_test is not None and \
+ # starup_parameters[OPT_LAUNHER].find(self.external_test) == -1:
+ # if self.external_test is not None:
+ # starup_parameters[OPT_LAUNCHER] = self.external_test
+ # starup_parameters[OPT_EXTENSION] = self.external_test.split(' ')[0]
+ #print starup_parameters[OPT_LAUNCHER]
+ starup_parameters[OPT_DEBUG] = self.debug
+ if self.resultfile:
+ debug_dir = DIRNAME(self.resultfile)
+ debug_name = os.path.splitext(BASENAME(self.resultfile))[0]
+ if not EXISTS(debug_dir):
+ os.makedirs(debug_dir)
+ else:
+ debug_dir = DIRNAME(testxml)
+ debug_name = os.path.splitext(BASENAME(testxml))[0]
+ starup_parameters[OPT_DEBUG_LOG] = JOIN(debug_dir, debug_name)
+ self.debug_log_file = starup_parameters[OPT_DEBUG_LOG] + '.dlog'
+ if self.rerun:
+ starup_parameters[OPT_RERUN] = self.rerun
+ if len(self.capabilities) > 0:
+ starup_parameters[OPT_CAPABILITY] = self.capabilities
+ # for webdriver
+ starup_parameters['target_platform'] = self.targetplatform
+ #starup_parameters['debugip'] = self.debugip
+ #starup_parameters['wd_url'] = self.wdurl
+ starup_parameters['set_type'] = self.set_parameters['type']
+ starup_parameters['set_exetype'] = self.set_parameters['exetype']
+ starup_parameters['session_dir'] = self.session_dir
+ starup_parameters['log_debug'] = self.debug
+
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: prepare starup parameters, error: %s ]" % error)
+ return starup_parameters
+
+ def __check_test_status(self):
+ '''
+ get_test_status from com_module
+ check the status
+ if end ,return ture; else return False
+ '''
+ # check test running or end
+ # if the status id end return True ,else return False
+ session_status = self.testworker.get_test_status(self.session_id)
+ if not session_status == None:
+ if session_status["finished"] == "0":
+ progress_msg_list = session_status["msg"]
+ for line in progress_msg_list:
+ LOGGER.info(line)
+ return False
+ elif session_status["finished"] == "1":
+ return True
+ else:
+ LOGGER.error("[ session status error ,pls finalize test ]\n")
+ # return True to finished this set ,becasue server error
+ return True
+
+ def finalize_test(self, sessionid):
+ '''shut_down testkit-stub'''
+ try:
+ self.testworker.finalize_test(sessionid)
+ except Exception as error:
+ LOGGER.error("[ Error: fail to close webapi http server, "
+ "error: %s ]" % error)
+
+ def get_capability(self, file_name):
+ """get_capability from file """
+ if file_name is None:
+ return True
+ capability_xml = file_name
+ capabilities = {}
+ try:
+ parse_tree = etree.parse(capability_xml)
+ root_em = parse_tree.getroot()
+ for tcap in root_em.getiterator('capability'):
+ capability = get_capability_form_node(tcap)
+ capabilities = dict(capabilities, **capability)
+
+ self.set_capability(capabilities)
+ return True
+ except IOError as error:
+ LOGGER.error(
+ "[ Error: fail to parse capability xml, error: %s ]" % error)
+ return False
+
+ def __write_set_result(self, testxmlfile, result):
+ """
+ get the result JSON form com_module,
+ write them to orignal testxmlfile
+ """
+ #print 'debug', set_result
+ # write the set_result to set_xml
+ set_result_xml = testxmlfile
+ # covert JOSN to python dict string
+ set_result = result
+ if 'resultfile' in set_result:
+ write_file_result(set_result_xml, set_result, self.debug_log_file)
+ else:
+ write_json_result(set_result_xml, set_result, self.debug_log_file)
+
+
+def get_capability_form_node(capability_em):
+ ''' splite capability key and value form element tree'''
+ tmp_key = ''
+ capability = {}
+ tcap = capability_em
+ if tcap.get("name"):
+ tmp_key = tcap.get("name").lower()
+
+ if tcap.get("type").lower() == 'boolean':
+ if tcap.get("support").lower() == 'true':
+ capability[tmp_key] = True
+
+ if tcap.get("type").lower() == 'integer':
+ if tcap.get("support").lower() == 'true':
+ if tcap.getiterator(
+ "value") and tcap.find("value").text is not None:
+ capability[tmp_key] = int(tcap.find("value").text)
+
+ if tcap.get("type").lower() == 'string':
+ if tcap.get("support").lower() == 'true':
+ if tcap.getiterator(
+ "value") and tcap.find("value").text is not None:
+ capability[tmp_key] = tcap.find("value").text
+
+ return capability
+
+
+def get_version_info():
+ """
+ get testkit tool version ,just read the version in VERSION file
+ VERSION file must put in /opt/testkit/lite3.0/
+ """
+ try:
+ config = ConfigParser.ConfigParser()
+ if platform.system() == "Linux":
+ config.read('/opt/testkit/lite3.0/VERSION')
+ else:
+ version_file = os.path.join(sys.path[0], 'VERSION')
+ config.read(version_file)
+ version = config.get('public_version', 'version')
+ return version
+ except KeyError as error:
+ LOGGER.error(
+ "[ Error: fail to parse version info, error: %s ]\n" % error)
+ return ""
+
+
+def replace_cdata(file_name):
+ """ replace some character"""
+ try:
+ abs_path = mktemp()
+ new_file = open(abs_path, 'w')
+ old_file = open(file_name)
+ for line in old_file:
+ line_temp = line.replace('<![CDATA', '<![CDATA')
+ new_file.write(line_temp.replace(']]>', ']]>'))
+ new_file.close()
+ old_file.close()
+ remove(file_name)
+ move(abs_path, file_name)
+ except IOError as error:
+ LOGGER.error("[ Error: fail to replace cdata in the result file, "
+ "error: %s ]\n" % error)
+
+
+def extract_notes(buf, pattern):
+ """util func to split lines in buffer, search for pattern on each line
+ then concatenate remaining content in output buffer"""
+ out = ""
+ for line in buf.split("\n"):
+ pos = line.find(pattern)
+ if pos >= 0:
+ out += line[pos + len(pattern):] + "\n"
+ return out
+
+# sdx@kooltux.org: parse notes in buffer and insert them in XML result
+
+
+def insert_notes(case, buf, pattern="###[NOTE]###"):
+ """ insert notes"""
+ desc = case.find('description')
+ if desc is None:
+ return
+
+ notes_elm = desc.find('notes')
+ if notes_elm is None:
+ notes_elm = etree.Element('notes')
+ desc.append(notes_elm)
+ if notes_elm.text is None:
+ notes_elm.text = extract_notes(buf, pattern)
+ else:
+ notes_elm.text += "\n" + extract_notes(buf, pattern)
+
+
+def get_summary(start_time, end_time):
+ """ set summary node """
+ summary = etree.Element('summary')
+ summary.attrib['test_plan_name'] = "Empty test_plan_name"
+ start_at = etree.Element('start_at')
+ start_at.text = start_time
+ end_at = etree.Element('end_at')
+ end_at.text = end_time
+ summary.append(start_at)
+ summary.append(end_at)
+ summary.tail = "\n "
+ return summary
+
+
+def write_file_result(set_result_xml, set_result, debug_log_file):
+ """write xml result file"""
+ result_file = set_result['resultfile']
+ try:
+ test_tree = etree.parse(set_result_xml)
+ test_em = test_tree.getroot()
+ result_tree = etree.parse(result_file)
+ result_em = result_tree.getroot()
+ dubug_file = BASENAME(debug_log_file)
+ for result_suite in result_em.getiterator('suite'):
+ for result_set in result_suite.getiterator('set'):
+ for test_suite in test_em.getiterator('suite'):
+ for test_set in test_suite.getiterator('set'):
+ if result_set.get('name') == \
+ test_set.get('name'):
+ result_set.set("set_debug_msg", dubug_file)
+ test_suite.remove(test_set)
+ test_suite.append(result_set)
+ test_tree.write(set_result_xml)
+ os.remove(result_file)
+ LOGGER.info("[ cases result saved to resultfile ]\n")
+ except OSError as error:
+ traceback.print_exc()
+ LOGGER.error(
+ "[ Error: fail to write cases result, error: %s ]\n" % error)
+
+
+def __expand_subcases(tset, tcase, sub_num, result_msg, detail=None):
+ sub_case_result = result_msg.split("[assert]")[1:]
+ if not detail:
+ for i in range(sub_num):
+ sub_case = copy.deepcopy(tcase)
+ sub_case.set("id", "/".join([tcase.get("id"), str(i+1)]))
+ sub_case.set("purpose", "/".join([tcase.get("purpose"), str(i+1)]))
+ sub_case.remove(sub_case.find("./result_info"))
+ result_info = etree.SubElement(sub_case, "result_info")
+ actual_result = etree.SubElement(result_info, "actual_result")
+ stdout = etree.SubElement(result_info, "stdout")
+ if i < len(sub_case_result):
+ sub_info = sub_case_result[i].split('[message]')
+ #print sub_info
+ sub_case.set("result", sub_info[0].upper())
+ actual_result.text = sub_info[0].upper()
+ stdout.text = sub_info[1]
+ else:
+ sub_case.set("result", "")
+ actual_result.text = ""
+ stdout.text = ""
+ tset.append(sub_case)
+ else:
+ for i in range(sub_num):
+ print 'debug', detail[i], i
+ sub_case = copy.deepcopy(tcase)
+ sub_case.set("id", "/".join([tcase.get("id"), str(i+1)]))
+ sub_case.set("purpose", "/".join([tcase.get("purpose"), str(i+1)]))
+ sub_case.remove(sub_case.find("./result_info"))
+ result_info = etree.SubElement(sub_case, "result_info")
+ actual_result = etree.SubElement(result_info, "actual_result")
+ stdout = etree.SubElement(result_info, "stdout")
+ #add 1392 co 1395,1396 --1399 tab
+ if i > len(detail) -1:
+ sub_info = detail[i]['stdout'].split('[message]')
+ sub_case.set("result", "BLOCK")
+ actual_result.text = "BLOCK"
+ else:
+ sub_case.set("result", detail[i]['result'])
+ actual_result.text = detail[i]['result'].upper()
+ #actual_result.text = sub_info[0].upper()
+ stdout.text = detail[i]['stdout']
+ #stdout.text = sub_info[1]
+ # else:
+ # sub_case.set("result", "")
+ # actual_result.text = ""
+ # stdout.text = ""
+ tset.append(sub_case)
+
+ tset.remove(tcase)
+
+
+def __write_by_create(tset, case_results, cm):
+ for case_result in case_results:
+ tcase = etree.Element('testcase')
+ tcase.set('id', case_result['case_id'])
+ tcase.set('purpose', case_result['purpose'])
+ tcase.set('result', case_result['result'].upper())
+ tcase.set('component',cm)
+ result_info = etree.SubElement(tcase, "result_info")
+ actual_result = etree.SubElement(result_info, "actual_result")
+ actual_result.text = case_result['result'].upper()
+ start = etree.SubElement(result_info, "start")
+ end = etree.SubElement(result_info, "end")
+ stdout = etree.SubElement(result_info, "stdout")
+ stderr = etree.SubElement(result_info, "stderr")
+ if 'start_at' in case_result:
+ start.text = case_result['start_at']
+ if 'end_at' in case_result:
+ end.text = case_result['end_at']
+ if 'stdout' in case_result:
+ stdout.text = str2xmlstr(case_result['stdout'])
+ if 'stderr' in case_result:
+ stderr.text = str2xmlstr(case_result['stderr'])
+ tset.append(tcase)
+
+
+def __write_by_caseid(tset, case_results):
+ #tset.set("set_debug_msg", "N/A")
+ for tcase in tset.getiterator('testcase'):
+ for case_result in case_results:
+ if tcase.get("id") == case_result['case_id']:
+ tcase.set('result', case_result['result'].upper())
+ # Check performance test
+ if tcase.find('measurement') is not None:
+ for measurement in tcase.getiterator(
+ 'measurement'):
+ if 'measures' in case_result:
+ m_results = case_result['measures']
+ for m_result in m_results:
+ if measurement.get('name') == \
+ m_result['name'] and 'value' in m_result:
+ measurement.set(
+ 'value', m_result[
+ 'value'])
+ if tcase.find("./result_info") is not None:
+ tcase.remove(tcase.find("./result_info"))
+ result_info = etree.SubElement(tcase, "result_info")
+ actual_result = etree.SubElement(
+ result_info, "actual_result")
+ actual_result.text = case_result['result'].upper()
+ start = etree.SubElement(result_info, "start")
+ end = etree.SubElement(result_info, "end")
+ stdout = etree.SubElement(result_info, "stdout")
+ stderr = etree.SubElement(result_info, "stderr")
+ if 'start_at' in case_result:
+ start.text = case_result['start_at']
+ if 'end_at' in case_result:
+ end.text = case_result['end_at']
+ if 'stdout' in case_result:
+ stdout.text = str2xmlstr(case_result['stdout'])
+ if 'stderr' in case_result:
+ stderr.text = str2xmlstr(case_result['stderr'])
+ if tcase.get("subcase") is not None:
+ #print 'subcase', tcase.get('subcase')
+ sub_num = int(tcase.get("subcase"))
+ result_msg = case_result['stdout']
+ __expand_subcases(tset, tcase, sub_num, result_msg)
+
+def __write_by_class(tset, case_results):
+ tset.set("set_debug_msg", "N/A")
+ for tcase in tset.getiterator('testcase'):
+ #for key in case_results.keys():
+ sub_no = int(tcase.get('subcase'))
+ text = tcase.find('description/test_script_entry').text
+ if text in case_results:
+ # tcase.set('result', case_result['result'].upper())
+ if tcase.find("./result_info") is not None:
+ tcase.remove(tcase.find("./result_info"))
+ result_info = etree.SubElement(tcase, "result_info")
+ if sub_no == len(case_results[text]):
+ for case_result in case_results[text]:
+ actual_result = etree.SubElement(
+ result_info, "actual_result")
+ actual_result.text = case_result['result'].upper()
+ start = etree.SubElement(result_info, "start")
+ end = etree.SubElement(result_info, "end")
+ stdout = etree.SubElement(result_info, "stdout")
+ stderr = etree.SubElement(result_info, "stderr")
+ if 'start_at' in case_result:
+ start.text = case_result['start_at']
+ if 'end_at' in case_result:
+ end.text = case_result['end_at']
+ if 'stdout' in case_result:
+ stdout.text = str2xmlstr(case_result['stdout'])
+ if 'stderr' in case_result:
+ stderr.text = str2xmlstr(case_result['stderr'])
+ else:
+ for case_result in case_results[text]:
+ actual_result = etree.SubElement(
+ result_info, "actual_result")
+ actual_result.text = case_result['result'].upper()
+ start = etree.SubElement(result_info, "start")
+ end = etree.SubElement(result_info, "end")
+ stdout = etree.SubElement(result_info, "stdout")
+ stderr = etree.SubElement(result_info, "stderr")
+ if 'start_at' in case_result:
+ start.text = case_result['start_at']
+ if 'end_at' in case_result:
+ end.text = case_result['end_at']
+ if 'stdout' in case_result:
+ stdout.text = str2xmlstr(case_result['stdout'])
+ if 'stderr' in case_result:
+ stderr.text = str2xmlstr(case_result['stderr'])
+ for i in range(sub_no - len(case_results[text])):
+ case_result = case_results[text][-1]
+ actual_result = etree.SubElement(
+ result_info, "actual_result")
+ actual_result.text = case_result['result'].upper()
+ start = etree.SubElement(result_info, "start")
+ end = etree.SubElement(result_info, "end")
+ stdout = etree.SubElement(result_info, "stdout")
+ stderr = etree.SubElement(result_info, "stderr")
+ if 'start_at' in case_result:
+ start.text = case_result['start_at']
+ if 'end_at' in case_result:
+ end.text = case_result['end_at']
+ if 'stdout' in case_result:
+ stdout.text = str2xmlstr(case_result['stdout'])
+ if 'stderr' in case_result:
+ stderr.text = str2xmlstr(case_result['stderr'])
+
+
+ if tcase.get("subcase") is not None:
+ sub_num = int(tcase.get("subcase"))
+ result_msg = case_result['stdout']
+ __expand_subcases(tset, tcase, sub_num, result_msg, case_results[text])
+
+def sort_result(case_results):
+ total = dict()
+ for result in case_results:
+ if result['case_class'] in total:
+ total[result['case_class']].append(result)
+ else:
+ total[result['case_class']] = [result]
+ return total
+
+def write_json_result(set_result_xml, set_result, debug_log_file):
+ ''' fetch result form JSON'''
+ case_results = set_result["cases"]
+ try:
+ parse_tree = etree.parse(set_result_xml)
+ #print 'debug tree', debug_log_file
+ root_em = parse_tree.getroot()
+ dubug_file = BASENAME(debug_log_file)
+ for tset in root_em.getiterator('set'):
+ tset.set("set_debug_msg", dubug_file)
+ if tset.get('type') == 'pyunit':
+ cm = tset.find('testcase').get('component')
+ __write_by_create(tset, case_results, cm)
+ elif tset.get('type') == 'androidunit':
+ total = sort_result(case_results)
+ __write_by_class(tset, total)
+ else:
+ __write_by_caseid(tset, case_results)
+ parse_tree.write(set_result_xml)
+ LOGGER.info("[ cases result saved to resultfile ]\n")
+ except IOError as error:
+ traceback.print_exc()
+ LOGGER.error(
+ "[ Error: fail to write cases result, error: %s ]\n" % error)
--- /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 of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+""" string convertor"""
+
+from types import IntType, FloatType, LongType
+import string
+
+
+def str2str(src):
+ """string to printable string"""
+ if isinstance(src, unicode):
+ return src.encode("utf8")
+
+ if isinstance(src, str):
+ accept = string.punctuation + string.letters + string.digits + ' \r\n'
+ return filter(lambda x: x in accept, src)
+
+ return ""
+
+
+def str2val(src):
+ """string to program value"""
+ ret = None
+ try:
+ ret = eval(str2str(src))
+ except:
+ pass
+ return ret
+
+
+def str2bool(src):
+ """string to boolean"""
+ if "TRUE" == str2str(src).upper():
+ return True
+ if "FALSE" == str2str(src).upper():
+ return False
+ return None
+
+
+def str2number(src):
+ """string to boolean"""
+ val = str2val(str2str(src))
+ if type(val) in [IntType, FloatType, LongType]:
+ return val
+ else:
+ return None
+
+
+def str2xmlstr(src):
+ """string to xml string value"""
+ return src.replace('\n', '\\n')
--- /dev/null
+import os
+import signal
+import sys
+import logging
+
+LOG = logging.getLogger("TestRunner")
+
+
+def pidExists(pid):
+ if pid < 0:
+ return False
+ try:
+ os.kill(pid, 0)
+ except OSError as e:
+ return False
+ else:
+ return True
+
+
+def IsWindows():
+ return sys.platform == 'cygwin' or sys.platform.startswith('win')
+
+
+def KillAllProcesses(ppid=None):
+ if IsWindows():
+ subprocess.check_call("TASKKILL /F /PID %s /T" % ppid)
+ else:
+ ppid = str(ppid)
+ pidgrp = []
+
+ def GetChildPids(ppid):
+ command = "ps -ef | awk '{if ($3 ==%s) print $2;}'" % str(ppid)
+ pids = os.popen(command).read()
+ pids = pids.split()
+
+ return pids
+
+ pidgrp.extend(GetChildPids(ppid))
+ for pid in pidgrp:
+ pidgrp.extend(GetChildPids(pid))
+
+ pidgrp.insert(0, ppid)
+ while len(pidgrp) > 0:
+ pid = pidgrp.pop()
+ try:
+ os.kill(int(pid), signal.SIGKILL)
+ return True
+ except OSError:
+ try:
+ os.popen("kill -9 %d" % int(pid))
+ return True
+ except:
+ return False
--- /dev/null
+#!/usr/bin/python
+#
+# Copyright (C) 2014 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Nicolas Zingile <n.zingile@gmail.com>
+
+"""Merger module for testkit xml files"""
+
+from lxml import etree
+import os
+
+#------------------------- Global variables -------------------------#
+
+TESTDEFATTRS = {}
+TESTDEFCHILDS = {"environment" : False, "summary" : False, "suite" : False}
+ENVATTRS = {"build_id" : False, "device_id" : False, "device_model" : False,
+ "device_name" : False, "host" : False, "lite_version" : False,
+ "manufacturer" : False, "resolution" : False, "screen_size" : False}
+ENVCHILDS = {"other" : False}
+SUMATTRS = {"test_plan_name" : False}
+SUMCHILDS = {"start_at" : True, "end_at" : True}
+SUITEATTRS = {"name" : True, "launcher" : False,'category':None,'extension':None}
+SUITECHILDS = {"set" : True}
+SETATTRS = {"name" : True, "set_debug_msg" : False,'type':None}
+SETCHILDS = {"testcase" : False,'capabilities':False}
+TCATTRS = {"component" : True, "execution_type" : True, "id" :True,
+ "name" : False, "priority" : True, "purpose" : True,"onload_delay":None,
+ "result" : True, "status" : True, "type" : True}
+TCCHILDS = {"description" : False ,"result_info":False}
+
+DESCATTRS ={}
+DESCCHILDS = {"test_script_entry": True,"refer_test_script_entry":False,"pre_condition" : False, "post_condition" : False, "steps" : False}
+RESULTCHILD = {'actual_result':True,'start':False,'end':False,'stdout':False}
+RESINFOATTRS = {}
+RESINFOCHILDS = {"actual_result" : True, "start" :False, "end" : False,
+ "stdout" : False, "stderr" : False}
+
+class ElementError(Exception):
+ """Custom class to handle the merging exceptions"""
+ pass
+
+def check_element(element, attrdico, childsdico):
+ """Checks a node of the testkit result xml tree.
+
+ Allows to verify the integrity of a testkit result xml node.
+ Check if element contains allowed attributes and if the value of
+ those attributes is filled if it should be.
+ Check if the child nodes of element are allowed and if so, checks
+ if the child node contains text if it should.
+
+ Args:
+ element : Element to check
+ attrdico: A dict that contains information on attributes of element
+ keys: String - allowed attributes of the element
+ values: Booleans indicating if the keys should be filled
+ childsdico: A dict that contains information on sub elements of element
+ keys: String - allowed sub elements of element
+ values: Booleans indicating if the keys should contain text
+ Returns:
+
+ Raises:
+ ElementError
+ """
+ for attrname, attrvalue in element.attrib.items():
+ if attrname in attrdico.keys():
+ if not attrvalue and attrdico.get(attrname):
+ raise ElementError("Attribute '" + attrname + "' of element '" + element.tag
+ + "' is not defined")
+ else:
+ raise ElementError("Attribute '" + attrname + "' is not authorized as an attribute of the '" + element.tag + "' element")
+ for child in list(element):
+ if (child.tag not in childsdico.keys()):
+ raise ElementError("Element '" + child.tag + " should not be a child element of '" + element.tag + "'")
+ elif (not child.text and childsdico.get(child.tag)):
+ raise ElementError("The element '" + child.tag + "' should contain some text")
+
+def create_xmltree():
+ """Creates an ElementTree object.
+ Args:
+
+ Return:
+ An ElementTree object that represents en empty testkit result xml file.
+ """
+ root = etree.Element("test_definition")
+ xmltree = etree.ElementTree(root)
+ print "xml tree created !"
+
+ return xmltree
+
+def create_envandsum(srcxmltree, destxmltree):
+ """Creates the environment and the summary nodes of
+ an ElementTree object.
+
+ Copy the environment and the summary nodes of srcxmltree in
+ the destxmltree. The destxmltree only contains the root element.
+
+ Args:
+ srcxmltree: Source xmltree from where we want to copy some nodes.
+ destxmltree: Destination xmltree to augment with some nodes.
+
+ Returns:
+ An ElementTree that partially represents a testkit result xml file.
+ """
+ testdef = destxmltree.getroot()
+ environment = srcxmltree.find("/environment")
+ summary = srcxmltree.find("/summary")
+ testdef.append(environment)
+ testdef.append(summary)
+
+ return destxmltree
+
+def check_testdefinition(xmltree):
+ """Checks the test_definition node of a testkit result xml.
+
+ Checkis that all the sub elements of the test_definition node are present
+ and that integrity of that sub elements is good.
+
+ Args:
+ xmltree: An ElementTree that represents a testkit result xml tree.
+
+ Returns:
+
+ Raises:
+ ElementError
+ """
+ testdef = xmltree.getroot()
+ check_element(testdef, TESTDEFATTRS, TESTDEFCHILDS)
+ environment = testdef.find("./environment")
+ summary = testdef.find("summary")
+ if environment is not None:
+ check_element(environment, ENVATTRS, ENVCHILDS)
+ else:
+ raise ElementError("Element 'test_definition' should contain an 'environment' element")
+ if summary is not None:
+ check_element(summary, SUMATTRS, SUMCHILDS)
+ else:
+ raise ElementError("Element 'test_definition' should contain a 'summary' element")
+ for asuite in testdef.findall("./suite"):
+ check_suite(asuite)
+
+def check_suite(eltsuite):
+ """Checks the integrity of a suite element.
+
+ Args:
+ eltsuite: A suite element to check
+
+ Returns:
+ """
+ check_element(eltsuite, SUITEATTRS, SUITECHILDS)
+ for child in list(eltsuite):
+ check_set(child)
+
+def check_set(eltset):
+ """Checks the integrity of a set element.
+
+ Args:
+ eltset: A set element to check.
+
+ Returns:
+ """
+ check_element(eltset, SETATTRS, SETCHILDS)
+ for child in list (eltset):
+ check_testcase(child)
+
+def check_testcase(eltcase):
+ """Checks the integrity of a testcase element.
+
+ Also verify that the result of the eltcase is present and consistent
+
+ Args:
+ eltcase: A testcase element to check
+
+ Returns:
+
+ Raises:
+ ElementError
+ """
+ try:
+ result = eltcase.get("result")
+ actual_result = eltcase.find("./result_info/actual_result").text
+ allowed_results = ["PASS", "FAIL", "N/A","BLOCK","TIMEOUT"]
+ except AttributeError:
+ raise ElementError("result of the testcase is not valid !")
+ if result not in allowed_results or result != actual_result:
+ raise ElementError("The testcase '" + eltcase.get("id") + "' doesn't have a consistent result")
+ check_element(eltcase, TCATTRS, TCCHILDS)
+ for child in list (eltcase):
+ if child.tag == "description":
+ # print "-- checking description node"
+ check_element(child, DESCATTRS, DESCCHILDS)
+ elif child.tag == "result_info":
+ # print "-- checking result_info node"
+ check_element(child, RESINFOATTRS, RESINFOCHILDS)
+ #elif child.tag == "categories":
+ # pass
+ else:
+ raise ElementError("Element '" + child.tag + "' is not allowed")
+
+def solve_conflicts(sourcecase, destcase):
+ """Selects a result when same testcase is encountered in both source and destination
+ testkit xml files.
+
+ The result is chosen according to the following priority : FAIL > N/A > PASS.
+
+ Args:
+ sourcecase: A testcase element of the source testkit xml result file
+ destcase: A testcase element of the destination testkit xml result file
+
+ Returns:
+ """
+ srcresult = sourcecase.get('result')
+ destresult = destcase.get('result')
+ if (srcresult == destresult) or (destresult == 'FAIL') \
+ or (srcresult == 'PASS' and destresult == 'N/A'):
+ pass
+ else:
+ destcase.set('result', srcresult)
+ destcase.find('./result_info/actual_result').text = srcresult
+
+def merge_testkitxml (sourcexmltree, destxmltree=None):
+ """Merge two testkit xml result files.
+
+ Merge the information of sourcexmltree in destxmltree. If destxmltree is
+ not definded, creates a new ElementTree and copy all the information of
+ sourcexmltree in it.
+
+ Args:
+ sourcexmltree: The source ElementTree object that represents the
+ testkit result xml source file
+ destxmltree: The destination ElementTree object that represents the
+ testkit result xml destination file
+ Returns:
+ An ElementTree that represents the result of the merging of the sourcexmltree
+ and destxmltree
+ """
+ print "## Checking source xml file ..."
+ check_testdefinition(sourcexmltree)
+ print "source xml file is correct. Ok\n"
+ if destxmltree is None:
+ print "Destination xml file doesn't exist... will be created"
+ destxmltree = create_xmltree()
+ create_envandsum(sourcexmltree, destxmltree)
+ for asuite in sourcexmltree.iter('suite'):
+ destsuite = destxmltree.find("/suite[@name='" + asuite.get('name') + "']")
+ if destsuite is not None:
+ for aset in asuite.iter('set'):
+ destset = destsuite.find("./set[@name='" + aset.get('name') + "']")
+ if destset is not None:
+ for acase in aset.iter('testcase'):
+ destcase = destset.find("./testcase[@id='" + acase.get('id') + "']")
+ if destcase is not None:
+ solve_conflicts(acase, destcase)
+ else:
+ destset.append(acase)
+ else:
+ destsuite.append(aset)
+ else:
+ destxmltree.getroot().append(asuite)
+
+ return destxmltree
--- /dev/null
+# Copyright (C) 2012 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# Authors:
+# Zhang, Huihui <huihuix.zhang@intel.com>
+# Wendong,Sui <weidongx.sun@intel.com>
+
+testkitxsddir = /opt/testkit/lite3.0/xsd
+dist_testkitxsd_DATA = *.js *.xsl *.css *.png *.txt *.xml *.xsd release-notes
--- /dev/null
+function getScrollTop() {
+ return f_scrollTop();
+}
+
+function f_scrollTop() {
+ return f_filterResults (
+ $(window) ? $(window).scrollTop() : 0,
+ document.documentElement ? document.documentElement.scrollTop : 0,
+ document.body ? document.body.scrollTop : 0
+ );
+}
+
+function f_filterResults(n_win, n_docel, n_body) {
+ var n_result = n_win ? n_win : 0;
+ if (n_docel && (!n_result || (n_result > n_docel)))
+ n_result = n_docel;
+ return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
+}
+
+function setScrollTop() {
+ $(window) ? $(window).scrollTop(0): 0;
+ document.documentElement ? document.documentElement.scrollTop = 0 :0;
+ document.body ? document.body.scrollTop = 0 : 0;
+}
+
+function goTopEx() {
+ $node = $('#goTopBtn');
+
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+
+ $(window).scroll(function () {
+ if (getScrollTop() > 0) {
+ $node.show();
+ } else {
+ $node.hide();
+ }
+ });
+
+ $node.click(function () {
+ setScrollTop();
+ });
+}
+
--- /dev/null
+/*! jQuery v1.7.1 jquery.com | jquery.org/license */
+(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cv(a){if(!ck[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){cl||(cl=c.createElement("iframe"),cl.frameBorder=cl.width=cl.height=0),b.appendChild(cl);if(!cm||!cl.createElement)cm=(cl.contentWindow||cl.contentDocument).document,cm.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),cm.close();d=cm.createElement(a),cm.body.appendChild(d),e=f.css(d,"display"),b.removeChild(cl)}ck[a]=e}return ck[a]}function cu(a,b){var c={};f.each(cq.concat.apply([],cq.slice(0,b)),function(){c[this]=a});return c}function ct(){cr=b}function cs(){setTimeout(ct,0);return cr=f.now()}function cj(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ci(){try{return new a.XMLHttpRequest}catch(b){}}function cc(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function cb(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function ca(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bE.test(a)?d(a,e):ca(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)ca(a+"["+e+"]",b[e],c,d);else d(a,b)}function b_(a,c){var d,e,g=f.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((g[d]?a:e||(e={}))[d]=c[d]);e&&f.extend(!0,a,e)}function b$(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bT,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=b$(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=b$(a,c,d,e,"*",g));return l}function bZ(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bP),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bC(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bx:by,g=0,h=e.length;if(d>0){if(c!=="border")for(;g<h;g++)c||(d-=parseFloat(f.css(a,"padding"+e[g]))||0),c==="margin"?d+=parseFloat(f.css(a,c+e[g]))||0:d-=parseFloat(f.css(a,"border"+e[g]+"Width"))||0;return d+"px"}d=bz(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0;if(c)for(;g<h;g++)d+=parseFloat(f.css(a,"padding"+e[g]))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+e[g]+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+e[g]))||0);return d+"px"}function bp(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(bf,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bo(a){var b=c.createElement("div");bh.appendChild(b),b.innerHTML=a.outerHTML;return b.firstChild}function bn(a){var b=(a.nodeName||"").toLowerCase();b==="input"?bm(a):b!=="script"&&typeof a.getElementsByTagName!="undefined"&&f.grep(a.getElementsByTagName("input"),bm)}function bm(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bl(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bk(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bj(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c,d,e,g=f._data(a),h=f._data(b,g),i=g.events;if(i){delete h.handle,h.events={};for(c in i)for(d=0,e=i[c].length;d<e;d++)f.event.add(b,c+(i[c][d].namespace?".":"")+i[c][d].namespace,i[c][d],i[c][d].data)}h.data&&(h.data=f.extend({},h.data))}}function bi(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function U(a){var b=V.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function T(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(O.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?parseFloat(d):j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c<d;c++)b[a[c]]=!0;return b}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.1",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b,c){var d;if(b){if(H)return H.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=r.exec(a)||s.exec(a)||t.exec(a)||a.indexOf("compatible")<0&&u.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test("Â ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g={};f.Callbacks=function(a){a=a?g[a]||h(a):{};var c=[],d=[],e,i,j,k,l,m=function(b){var d,e,g,h,i;for(d=0,e=b.length;d<e;d++)g=b[d],h=f.type(g),h==="array"?m(g):h==="function"&&(!a.unique||!o.has(g))&&c.push(g)},n=function(b,f){f=f||[],e=!a.memory||[b,f],i=!0,l=j||0,j=0,k=c.length;for(;c&&l<k;l++)if(c[l].apply(b,f)===!1&&a.stopOnFalse){e=!0;break}i=!1,c&&(a.once?e===!0?o.disable():c=[]:d&&d.length&&(e=d.shift(),o.fireWith(e[0],e[1])))},o={add:function(){if(c){var a=c.length;m(arguments),i?k=c.length:e&&e!==!0&&(j=a,n(e[0],e[1]))}return this},remove:function(){if(c){var b=arguments,d=0,e=b.length;for(;d<e;d++)for(var f=0;f<c.length;f++)if(b[d]===c[f]){i&&f<=k&&(k--,f<=l&&l--),c.splice(f--,1);if(a.unique)break}}return this},has:function(a){if(c){var b=0,d=c.length;for(;b<d;b++)if(a===c[b])return!0}return!1},empty:function(){c=[];return this},disable:function(){c=d=e=b;return this},disabled:function(){return!c},lock:function(){d=b,(!e||e===!0)&&o.disable();return this},locked:function(){return!d},fireWith:function(b,c){d&&(i?a.once||d.push([b,c]):(!a.once||!e)&&n(b,c));return this},fire:function(){o.fireWith(this,arguments);return this},fired:function(){return!!e}};return o};var i=[].slice;f.extend({Deferred:function(a){var b=f.Callbacks("once memory"),c=f.Callbacks("once memory"),d=f.Callbacks("memory"),e="pending",g={resolve:b,reject:c,notify:d},h={done:b.add,fail:c.add,progress:d.add,state:function(){return e},isResolved:b.fired,isRejected:c.fired,then:function(a,b,c){i.done(a).fail(b).progress(c);return this},always:function(){i.done.apply(i,arguments).fail.apply(i,arguments);return this},pipe:function(a,b,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[b,"reject"],progress:[c,"notify"]},function(a,b){var c=b[0],e=b[1],g;f.isFunction(c)?i[a](function(){g=c.apply(this,arguments),g&&f.isFunction(g.promise)?g.promise().then(d.resolve,d.reject,d.notify):d[e+"With"](this===i?d:this,[g])}):i[a](d[e])})}).promise()},promise:function(a){if(a==null)a=h;else for(var b in h)a[b]=h[b];return a}},i=h.promise({}),j;for(j in g)i[j]=g[j].fire,i[j+"With"]=g[j].fireWith;i.done(function(){e="resolved"},c.disable,d.lock).fail(function(){e="rejected"},b.disable,d.lock),a&&a.call(i,i);return i},when:function(a){function m(a){return function(b){e[a]=arguments.length>1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c<d;c++)b[c]&&b[c].promise&&f.isFunction(b[c].promise)?b[c].promise().then(l(c),j.reject,m(c)):--g;g||j.resolveWith(j,b)}else j!==a&&j.resolveWith(j,d?[a]:[]);return k}}),f.support=function(){var b,d,e,g,h,i,j,k,l,m,n,o,p,q=c.createElement("div"),r=c.documentElement;q.setAttribute("className","t"),q.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=q.getElementsByTagName("*"),e=q.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=q.getElementsByTagName("input")[0],b={leadingWhitespace:q.firstChild.nodeType===3,tbody:!q.getElementsByTagName("tbody").length,htmlSerialize:!!q.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:q.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete q.test}catch(s){b.deleteExpando=!1}!q.addEventListener&&q.attachEvent&&q.fireEvent&&(q.attachEvent("onclick",function(){b.noCloneEvent=!1}),q.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),q.appendChild(i),k=c.createDocumentFragment(),k.appendChild(q.lastChild),b.checkClone=k.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,k.removeChild(i),k.appendChild(q),q.innerHTML="",a.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",q.style.width="2px",q.appendChild(j),b.reliableMarginRight=(parseInt((a.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0);if(q.attachEvent)for(o in{submit:1,change:1,focusin:1})n="on"+o,p=n in q,p||(q.setAttribute(n,"return;"),p=typeof q[n]=="function"),b[o+"Bubbles"]=p;k.removeChild(q),k=g=h=j=q=i=null,f(function(){var a,d,e,g,h,i,j,k,m,n,o,r=c.getElementsByTagName("body")[0];!r||(j=1,k="position:absolute;top:0;left:0;width:1px;height:1px;margin:0;",m="visibility:hidden;border:0;",n="style='"+k+"border:5px solid #000;padding:0;'",o="<div "+n+"><div></div></div>"+"<table "+n+" cellpadding='0' cellspacing='0'>"+"<tr><td></td></tr></table>",a=c.createElement("div"),a.style.cssText=m+"width:0;height:0;position:static;top:0;margin-top:"+j+"px",r.insertBefore(a,r.firstChild),q=c.createElement("div"),a.appendChild(q),q.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",l=q.getElementsByTagName("td"),p=l[0].offsetHeight===0,l[0].style.display="",l[1].style.display="none",b.reliableHiddenOffsets=p&&l[0].offsetHeight===0,q.innerHTML="",q.style.width=q.style.paddingLeft="1px",f.boxModel=b.boxModel=q.offsetWidth===2,typeof q.style.zoom!="undefined"&&(q.style.display="inline",q.style.zoom=1,b.inlineBlockNeedsLayout=q.offsetWidth===2,q.style.display="",q.innerHTML="<div style='width:4px;'></div>",b.shrinkWrapBlocks=q.offsetWidth!==2),q.style.cssText=k+m,q.innerHTML=o,d=q.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,i={doesNotAddBorder:e.offsetTop!==5,doesAddBorderForTableAndCells:h.offsetTop===5},e.style.position="fixed",e.style.top="20px",i.fixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",i.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,i.doesNotIncludeMarginInBodyOffset=r.offsetTop!==j,r.removeChild(a),q=a=null,f.extend(b,i))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e<g;e++)delete d[b[e]];if(!(c?m:f.isEmptyObject)(d))return}}if(!c){delete j[k].data;if(!m(j[k]))return}f.support.deleteExpando||!j.setInterval?delete j[k]:j[k]=null,i&&(f.support.deleteExpando?delete a[h]:a.removeAttribute?a.removeAttribute(h):a[h]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d,e,g,h=null;if(typeof a=="undefined"){if(this.length){h=f.data(this[0]);if(this[0].nodeType===1&&!f._data(this[0],"parsedAttrs")){e=this[0].attributes;for(var i=0,j=e.length;i<j;i++)g=e[i].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),l(this[0],g,h[g]));f._data(this[0],"parsedAttrs",!0)}}return h}if(typeof a=="object")return this.each(function(){f.data(this,a)});d=a.split("."),d[1]=d[1]?"."+d[1]:"";if(c===b){h=this.triggerHandler("getData"+d[1]+"!",[d[0]]),h===b&&this.length&&(h=f.data(this[0],a),h=l(this[0],a,h));return h===b&&d[1]?this.data(d[0]):h}return this.each(function(){var b=f(this),e=[d[0],c];b.triggerHandler("setData"+d[1]+"!",e),f.data(this,a,c),b.triggerHandler("changeData"+d[1]+"!",e)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f.Callbacks("once memory"),!0))h++,l.add(m);m();return d.promise()}});var o=/[\n\t\r]/g,p=/\s+/,q=/\r/g,r=/^(?:button|input)$/i,s=/^(?:button|input|object|select|textarea)$/i,t=/^a(?:rea)?$/i,u=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,v=f.support.getSetAttribute,w,x,y;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(p);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(o," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(p);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(o," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.nodeName.toLowerCase()]||f.valHooks[g.type];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c<d;c++){e=i[c];if(e.selected&&(f.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!f.nodeName(e.parentNode,"optgroup"))){b=f(e).val();if(j)return b;h.push(b)}}if(j&&!h.length&&i.length)return f(i[g]).val();return h},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;h<g;h++)e=d[h],e&&(c=f.propFix[e]||e,f.attr(a,e,""),a.removeAttribute(v?e:c),u.test(e)&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(r.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},value:{get:function(a,b){if(w&&f.nodeName(a,"button"))return w.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(w&&f.nodeName(a,"button"))return w.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,g,h,i=a.nodeType;if(!!a&&i!==3&&i!==8&&i!==2){h=i!==1||!f.isXMLDoc(a),h&&(c=f.propFix[c]||c,g=f.propHooks[c]);return d!==b?g&&"set"in g&&(e=g.set(a,d,c))!==b?e:a[c]=d:g&&"get"in g&&(e=g.get(a,c))!==null?e:a[c]}},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):s.test(a.nodeName)||t.test(a.nodeName)&&a.href?0:b}}}}),f.attrHooks.tabindex=f.propHooks.tabIndex,x={get:function(a,c){var d,e=f.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},v||(y={name:!0,id:!0},w=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&(y[c]?d.nodeValue!=="":d.specified)?d.nodeValue:b},set:function(a,b,d){var e=a.getAttributeNode(d);e||(e=c.createAttribute(d),a.setAttributeNode(e));return e.nodeValue=b+""}},f.attrHooks.tabindex.set=w.set,f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})}),f.attrHooks.contenteditable={get:w.get,set:function(a,b,c){b===""&&(b="false"),w.set(a,b,c)}}),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex);return null}})),f.support.enctype||(f.propFix.enctype="encoding"),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/\bhover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function(a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};
+f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k<c.length;k++){l=A.exec(c[k])||[],m=l[1],n=(l[2]||"").split(".").sort(),s=f.event.special[m]||{},m=(g?s.delegateType:s.bindType)||m,s=f.event.special[m]||{},o=f.extend({type:m,origType:l[1],data:e,handler:d,guid:d.guid,selector:g,quick:G(g),namespace:n.join(".")},p),r=j[m];if(!r){r=j[m]=[],r.delegateCount=0;if(!s.setup||s.setup.call(a,e,n,i)===!1)a.addEventListener?a.addEventListener(m,i,!1):a.attachEvent&&a.attachEvent("on"+m,i)}s.add&&(s.add.call(a,o),o.handler.guid||(o.handler.guid=d.guid)),g?r.splice(r.delegateCount++,0,o):r.push(o),f.event.global[m]=!0}a=null}},global:{},remove:function(a,b,c,d,e){var g=f.hasData(a)&&f._data(a),h,i,j,k,l,m,n,o,p,q,r,s;if(!!g&&!!(o=g.events)){b=f.trim(I(b||"")).split(" ");for(h=0;h<b.length;h++){i=A.exec(b[h])||[],j=k=i[1],l=i[2];if(!j){for(j in o)f.event.remove(a,j+b[h],c,d,!0);continue}p=f.event.special[j]||{},j=(d?p.delegateType:p.bindType)||j,r=o[j]||[],m=r.length,l=l?new RegExp("(^|\\.)"+l.split(".").sort().join("\\.(?:.*\\.)?")+"(\\.|$)"):null;for(n=0;n<r.length;n++)s=r[n],(e||k===s.origType)&&(!c||c.guid===s.guid)&&(!l||l.test(s.namespace))&&(!d||d===s.selector||d==="**"&&s.selector)&&(r.splice(n--,1),s.selector&&r.delegateCount--,p.remove&&p.remove.call(a,s));r.length===0&&m!==r.length&&((!p.teardown||p.teardown.call(a,l)===!1)&&f.removeEvent(a,j,g.handle),delete o[j])}f.isEmptyObject(o)&&(q=g.handle,q&&(q.elem=null),f.removeData(a,["events","handle"],!0))}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){if(!e||e.nodeType!==3&&e.nodeType!==8){var h=c.type||c,i=[],j,k,l,m,n,o,p,q,r,s;if(E.test(h+f.event.triggered))return;h.indexOf("!")>=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;l<r.length&&!c.isPropagationStopped();l++)m=r[l][0],c.type=r[l][1],q=(f._data(m,"events")||{})[c.type]&&f._data(m,"handle"),q&&q.apply(m,d),q=o&&m[o],q&&f.acceptData(m)&&q.apply(m,d)===!1&&c.preventDefault();c.type=h,!g&&!c.isDefaultPrevented()&&(!p._default||p._default.apply(e.ownerDocument,d)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)&&o&&e[h]&&(h!=="focus"&&h!=="blur"||c.target.offsetWidth!==0)&&!f.isWindow(e)&&(n=e[o],n&&(e[o]=null),f.event.triggered=h,e[h](),f.event.triggered=b,n&&(e[o]=n));return c.result}},dispatch:function(c){c=f.event.fix(c||a.event);var d=(f._data(this,"events")||{})[c.type]||[],e=d.delegateCount,g=[].slice.call(arguments,0),h=!c.exclusive&&!c.namespace,i=[],j,k,l,m,n,o,p,q,r,s,t;g[0]=c,c.delegateTarget=this;if(e&&!c.target.disabled&&(!c.button||c.type!=="click")){m=f(this),m.context=this.ownerDocument||this;for(l=c.target;l!=this;l=l.parentNode||this){o={},q=[],m[0]=l;for(j=0;j<e;j++)r=d[j],s=r.selector,o[s]===b&&(o[s]=r.quick?H(l,r.quick):m.is(s)),o[s]&&q.push(r);q.length&&i.push({elem:l,matches:q})}}d.length>e&&i.push({elem:this,matches:d.slice(e)});for(j=0;j<i.length&&!c.isPropagationStopped();j++){p=i[j],c.currentTarget=p.elem;for(k=0;k<p.matches.length&&!c.isImmediatePropagationStopped();k++){r=p.matches[k];if(h||!c.namespace&&!r.namespace||c.namespace_re&&c.namespace_re.test(r.namespace))c.data=r.data,c.handleObj=r,n=((f.event.special[r.origType]||{}).handle||r.handler).apply(p.elem,g),n!==b&&(c.result=n,n===!1&&(c.preventDefault(),c.stopPropagation()))}}return c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode);return a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,d){var e,f,g,h=d.button,i=d.fromElement;a.pageX==null&&d.clientX!=null&&(e=a.target.ownerDocument||c,f=e.documentElement,g=e.body,a.pageX=d.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=d.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?d.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0);return a}},fix:function(a){if(a[f.expando])return a;var d,e,g=a,h=f.event.fixHooks[a.type]||{},i=h.props?this.props.concat(h.props):this.props;a=f.Event(g);for(d=i.length;d;)e=i[--d],a[e]=g[e];a.target||(a.target=g.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey===b&&(a.metaKey=a.ctrlKey);return h.filter?h.filter(a,g):a},special:{ready:{setup:f.bindReady},load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=f.extend(new f.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?f.event.trigger(e,null,b):f.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},f.event.handle=f.event.dispatch,f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!(this instanceof f.Event))return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?K:J):this.type=a,b&&f.extend(this,b),this.timeStamp=a&&a.timeStamp||f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=K;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=K;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=K,this.stopPropagation()},isDefaultPrevented:J,isPropagationStopped:J,isImmediatePropagationStopped:J},f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c=this,d=a.relatedTarget,e=a.handleObj,g=e.selector,h;if(!d||d!==c&&!f.contains(c,d))a.type=e.origType,h=e.handler.apply(this,arguments),a.type=b;return h}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(){if(f.nodeName(this,"form"))return!1;f.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=f.nodeName(c,"input")||f.nodeName(c,"button")?c.form:b;d&&!d._submit_attached&&(f.event.add(d,"submit._submit",function(a){this.parentNode&&!a.isTrigger&&f.event.simulate("submit",this.parentNode,a,!0)}),d._submit_attached=!0)})},teardown:function(){if(f.nodeName(this,"form"))return!1;f.event.remove(this,"._submit")}}),f.support.changeBubbles||(f.event.special.change={setup:function(){if(z.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")f.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),f.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1,f.event.simulate("change",this,a,!0))});return!1}f.event.add(this,"beforeactivate._change",function(a){var b=a.target;z.test(b.nodeName)&&!b._change_attached&&(f.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&f.event.simulate("change",this.parentNode,a,!0)}),b._change_attached=!0)})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){f.event.remove(this,"._change");return z.test(this.nodeName)}}),f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){var d=0,e=function(a){f.event.simulate(b,a.target,f.event.fix(a),!0)};f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.fn.extend({on:function(a,c,d,e,g){var h,i;if(typeof a=="object"){typeof c!="string"&&(d=c,c=b);for(i in a)this.on(i,c,d,a[i],g);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=J;else if(!e)return this;g===1&&(h=e,e=function(a){f().off(a);return h.apply(this,arguments)},e.guid=h.guid||(h.guid=f.guid++));return this.each(function(){f.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on.call(this,a,b,c,d,1)},off:function(a,c,d){if(a&&a.preventDefault&&a.handleObj){var e=a.handleObj;f(a.delegateTarget).off(e.namespace?e.type+"."+e.namespace:e.type,e.selector,e.handler);return this}if(typeof a=="object"){for(var g in a)this.off(g,c,a[g]);return this}if(c===!1||typeof c=="function")d=c,c=b;d===!1&&(d=J);return this.each(function(){f.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){f(this.context).on(a,this.selector,b,c);return this},die:function(a,b){f(this.context).off(a,this.selector||"**",b);return this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length==1?this.off(a,"**"):this.off(b,a,c)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f._data(this,"lastToggle"+a.guid)||0)%d;f._data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}if(j.nodeType===1){g||(j[d]=c,j.sizset=h);if(typeof b!="string"){if(j===b){k=!0;break}}else if(m.filter(b,[j]).length>0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h<i;h++){var j=e[h];if(j){var k=!1;j=j[a];while(j){if(j[d]===c){k=e[j.sizset];break}j.nodeType===1&&!g&&(j[d]=c,j.sizset=h);if(j.nodeName.toLowerCase()===b){k=j;break}j=j[a]}e[h]=k}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},m.matches=function(a,b){return m(a,null,null,b)},m.matchesSelector=function(a,b){return m(b,null,null,[a]).length>0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e<f;e++){h=o.order[e];if(g=o.leftMatch[h].exec(a)){i=g[1],g.splice(1,1);if(i.substr(i.length-1)!=="\\"){g[1]=(g[1]||"").replace(j,""),d=o.find[h](g,b,c);if(d!=null){a=a.replace(o.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},m.filter=function(a,c,d,e){var f,g,h,i,j,k,l,n,p,q=a,r=[],s=c,t=c&&c[0]&&m.isXML(c[0]);while(a&&c.length){for(h in o.filter)if((f=o.leftMatch[h].exec(a))!=null&&f[2]){k=o.filter[h],l=f[1],g=!1,f.splice(1,1);if(l.substr(l.length-1)==="\\")continue;s===r&&(r=[]);if(o.preFilter[h]){f=o.preFilter[h](f,s,d,r,e,t);if(!f)g=i=!0;else if(f===!0)continue}if(f)for(n=0;(j=s[n])!=null;n++)j&&(i=k(j,f,n,s),p=e^i,d&&i!=null?p?g=!0:s[n]=!1:p&&(r.push(j),g=!0));if(i!==b){d||(s=r),a=a.replace(o.match[h],"");if(!g)return[];break}}if(a===q)if(g==null)m.error(a);else break;q=a}return s},m.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)};var n=m.getText=function(a){var b,c,d=a.nodeType,e="";if(d){if(d===1||d===9){if(typeof a.textContent=="string")return a.textContent;if(typeof a.innerText=="string")return a.innerText.replace(k,"");for(a=a.firstChild;a;a=a.nextSibling)e+=n(a)}else if(d===3||d===4)return a.nodeValue}else for(b=0;c=a[b];b++)c.nodeType!==8&&(e+=n(c));return e},o=m.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!l.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&m.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&m.filter(b,a,!0)}},"":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("parentNode",b,f,a,d,c)},"~":function(a,b,c){var d,f=e++,g=x;typeof b=="string"&&!l.test(b)&&(b=b.toLowerCase(),d=b,g=w),g("previousSibling",b,f,a,d,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(j,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}m.error(e)},CHILD:function(a,b){var c,e,f,g,h,i,j,k=b[1],l=a;switch(k){case"only":case"first":while(l=l.previousSibling)if(l.nodeType===1)return!1;if(k==="first")return!0;l=a;case"last":while(l=l.nextSibling)if(l.nodeType===1)return!1;return!0;case"nth":c=b[2],e=b[3];if(c===1&&e===0)return!0;f=b[0],g=a.parentNode;if(g&&(g[d]!==f||!a.nodeIndex)){i=0;for(l=g.firstChild;l;l=l.nextSibling)l.nodeType===1&&(l.nodeIndex=++i);g[d]=f}j=a.nodeIndex-e;return c===0?j===0:j%c===0&&j/c>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c<e;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var u,v;c.documentElement.compareDocumentPosition?u=function(a,b){if(a===b){h=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(u=function(a,b){if(a===b){h=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,i=b.parentNode,j=g;if(g===i)return v(a,b);if(!g)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return v(e[k],f[k]);return k===c?v(a,f[k],-1):v(e[k],b,1)},v=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h<i;h++)m(a,g[h],e,c);return m.filter(f,e)};m.attr=f.attr,m.selectors.attrMap={},f.find=m,f.expr=m.selectors,f.expr[":"]=f.expr.filters,f.unique=m.uniqueSort,f.text=m.getText,f.isXMLDoc=m.isXML,f.contains=m.contains}();var L=/Until$/,M=/^(?:parents|prevUntil|prevAll)/,N=/,/,O=/^.[^:#\[\.,]*$/,P=Array.prototype.slice,Q=f.expr.match.POS,R={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(T(this,a,!1),"not",a)},filter:function(a){return this.pushStack(T(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?Q.test(a)?f(a,this.context).index(this[0])>=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d<a.length;d++)f(g).is(a[d])&&c.push({selector:a[d],elem:g,level:h});g=g.parentNode,h++}return c}var i=Q.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(i?i.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|canvas|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/<tbody/i,_=/<|&#?\w+;/,ba=/<(?:script|style)/i,bb=/<(?:script|object|embed|option|style)/i,bc=new RegExp("<(?:"+V+")","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*<!(?:\[CDATA\[|\-\-)/,bg={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function()
+{for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bd.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bi(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bp)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i,j=a[0];b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof j=="string"&&j.length<512&&i===c&&j.charAt(0)==="<"&&!bb.test(j)&&(f.support.checkClone||!bd.test(j))&&(f.support.html5Clone||!bc.test(j))&&(g=!0,h=f.fragments[j],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[j]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||!bc.test("<"+a.nodeName)?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!_.test(k))k=b.createTextNode(k);else{k=k.replace(Y,"<$1></$2>");var l=(Z.exec(k)||["",""])[1].toLowerCase(),m=bg[l]||bg._default,n=m[0],o=b.createElement("div");b===c?bh.appendChild(o):U(b).appendChild(o),o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=$.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&X.test(k)&&o.insertBefore(b.createTextNode(X.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bn(k[i]);else bn(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||be.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.event.special,g=f.support.deleteExpando;for(var h=0,i;(i=a[h])!=null;h++){if(i.nodeName&&f.noData[i.nodeName.toLowerCase()])continue;c=i[f.expando];if(c){b=d[c];if(b&&b.events){for(var j in b.events)e[j]?f.event.remove(i,j):f.removeEvent(i,j,b.handle);b.handle&&(b.handle.elem=null)}g?delete i[f.expando]:i.removeAttribute&&i.removeAttribute(f.expando),delete d[c]}}}});var bq=/alpha\([^)]*\)/i,br=/opacity=([^)]*)/,bs=/([A-Z]|^ms)/g,bt=/^-?\d+(?:px)?$/i,bu=/^-?\d/,bv=/^([\-+])=([\-+.\de]+)/,bw={position:"absolute",visibility:"hidden",display:"block"},bx=["Left","Right"],by=["Top","Bottom"],bz,bA,bB;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bz(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bv.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bz)return bz(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bC(a,b,d);f.swap(a,bw,function(){e=bC(a,b,d)});return e}},set:function(a,b){if(!bt.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return br.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bq,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bq.test(g)?g.replace(bq,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bz(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(bA=function(a,b){var c,d,e;b=b.replace(bs,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b)));return c}),c.documentElement.currentStyle&&(bB=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f===null&&g&&(e=g[b])&&(f=e),!bt.test(f)&&bu.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f||0,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),bz=bA||bB,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bD=/%20/g,bE=/\[\]$/,bF=/\r?\n/g,bG=/#.*$/,bH=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bI=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bJ=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bK=/^(?:GET|HEAD)$/,bL=/^\/\//,bM=/\?/,bN=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bO=/^(?:select|textarea)/i,bP=/\s+/,bQ=/([?&])_=[^&]*/,bR=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bS=f.fn.load,bT={},bU={},bV,bW,bX=["*/"]+["*"];try{bV=e.href}catch(bY){bV=c.createElement("a"),bV.href="",bV=bV.href}bW=bR.exec(bV.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bS)return bS.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bN,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bO.test(this.nodeName)||bI.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bF,"\r\n")}}):{name:b.name,value:c.replace(bF,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b_(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b_(a,b);return a},ajaxSettings:{url:bV,isLocal:bJ.test(bW[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bX},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bZ(bT),ajaxTransport:bZ(bU),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?cb(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cc(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bH.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bG,"").replace(bL,bW[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bP),d.crossDomain==null&&(r=bR.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bW[1]&&r[2]==bW[2]&&(r[3]||(r[1]==="http:"?80:443))==(bW[3]||(bW[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),b$(bT,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bK.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bM.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bQ,"$1_="+x);d.url=y+(y===d.url?(bM.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bX+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=b$(bU,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)ca(g,a[g],c,e);return d.join("&").replace(bD,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cd=f.now(),ce=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cd++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ce.test(b.url)||e&&ce.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ce,l),b.url===j&&(e&&(k=k.replace(ce,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cf=a.ActiveXObject?function(){for(var a in ch)ch[a](0,1)}:!1,cg=0,ch;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ci()||cj()}:ci,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cf&&delete ch[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cg,cf&&(ch||(ch={},f(a).unload(cf)),ch[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var ck={},cl,cm,cn=/^(?:toggle|show|hide)$/,co=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cp,cq=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cr;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cu("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cv(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cu("hide",3),a,b,c);var d,e,g=0,h=this.length;for(;g<h;g++)d=this[g],d.style&&(e=f.css(d,"display"),e!=="none"&&!f._data(d,"olddisplay")&&f._data(d,"olddisplay",e));for(g=0;g<h;g++)this[g].style&&(this[g].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cu("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){function g(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(!f.support.inlineBlockNeedsLayout||cv(this.nodeName)==="inline"?this.style.display="inline-block":this.style.zoom=1))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)j=new f.fx(this,b,i),h=a[i],cn.test(h)?(o=f._data(this,"toggle"+i)||(h==="toggle"?d?"show":"hide":0),o?(f._data(this,"toggle"+i,o==="show"?"hide":"show"),j[o]()):j[h]()):(k=co.exec(h),l=j.cur(),k?(m=parseFloat(k[2]),n=k[3]||(f.cssNumber[i]?"":"px"),n!=="px"&&(f.style(this,i,(m||1)+n),l=(m||1)/j.cur()*l,f.style(this,i,l+n)),k[1]&&(m=(k[1]==="-="?-1:1)*m+l),j.custom(l,m,n)):j.custom(l,h,""));return!0}var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return e.queue===!1?this.each(g):this.queue(e.queue,g)},stop:function(a,c,d){typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]);return this.each(function(){function h(a,b,c){var e=b[c];f.removeData(a,c,!0),e.stop(d)}var b,c=!1,e=f.timers,g=f._data(this);d||f._unmark(!0,this);if(a==null)for(b in g)g[b]&&g[b].stop&&b.indexOf(".run")===b.length-4&&h(this,g,b);else g[b=a+".run"]&&g[b].stop&&h(this,g,b);for(b=e.length;b--;)e[b].elem===this&&(a==null||e[b].queue===a)&&(d?e[b](!0):e[b].saveState(),c=!0,e.splice(b,1));(!d||!c)&&f.dequeue(this,a)})}}),f.each({slideDown:cu("show",1),slideUp:cu("hide",1),slideToggle:cu("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue?f.dequeue(this,d.queue):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,c,d){function h(a){return e.step(a)}var e=this,g=f.fx;this.startTime=cr||cs(),this.end=c,this.now=this.start=a,this.pos=this.state=0,this.unit=d||this.unit||(f.cssNumber[this.prop]?"":"px"),h.queue=this.options.queue,h.elem=this.elem,h.saveState=function(){e.options.hide&&f._data(e.elem,"fxshow"+e.prop)===b&&f._data(e.elem,"fxshow"+e.prop,e.start)},h()&&f.timers.push(h)&&!cp&&(cp=setInterval(g.tick,g.interval))},show:function(){var a=f._data(this.elem,"fxshow"+this.prop);this.options.orig[this.prop]=a||f.style(this.elem,this.prop),this.options.show=!0,a!==b?this.custom(this.cur(),a):this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f._data(this.elem,"fxshow"+this.prop)||f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b,c,d,e=cr||cs(),g=!0,h=this.elem,i=this.options;if(a||e>=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cp),cp=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=a.now+a.unit:a.elem[a.prop]=a.now}}}),f.each(["width","height"],function(a,b){f.fx.step[b]=function(a){f.style(a.elem,b,Math.max(0,a.now)+a.unit)}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var cw=/^t(?:able|d|h)$/i,cx=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cy(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.support.fixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.support.doesNotAddBorder&&(!f.support.doesAddBorderForTableAndCells||!cw.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.support.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.support.fixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cy(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cy(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,d,"padding")):this[d]():null},f.fn["outer"+c]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,d,a?"margin":"border")):this[d]():null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c],h=e.document.body;return e.document.compatMode==="CSS1Compat"&&g||h&&h["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var i=f.css(e,d),j=parseFloat(i);return f.isNumeric(j)?j:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window);
\ No newline at end of file
--- /dev/null
+# XSLT style for Test Case and Test Result
+
+## File structure
+
+- readme.txt
+- test_definition.xsd // The schema of test definition
+- tests.css // CSS style for showing test cases and results
+- testresult.xsl
+- testcase.xsl
+- tests.xml //example of test cases
+- result.xml //example of test result
+
+## Applying the style
+
+### Update in definition and result XML
+
+To apply this style for the definition XML of test cases, please add below statement before the root element of XML (the tag "test_definition").
+
+`<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>`
+
+... such as:
+
+```
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testcase.xsl"?>
+<test_definition>
+```
+
+To apply this style for the test-result XML, please add below statement before the root element of XML (the tag "test_definition").
+
+`<?xml-stylesheet type="text/xsl" href="./testresult.xsl"?>`
+
+... such as:
+
+```
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="./testresult.xsl"?>
+<test_definition>
+```
+
+### Deploy XSLT and CSS style
+
+Please add at least the 3 files into each test package.
+
+- tests.css
+- testresult.xsl
+- testcase.xsl
+
+... such as:
+
+```
+tct-alarm-tizen-tests/
+|-- ...
+|-- testcase.xsl
+|-- testresult.xsl
+|-- tests.css
+|-- ...
+```
+
--- /dev/null
+-- version 1.0.1-2 --
+
+ adding 2 new case types "compliance" and "user_experience"
+
+-- version 1.0.1-3 --
+
+ Add a new sub-element "spec" (type: string) under the "testcase" element.
+
+-- version 1.0.1-4 --
+
+ Add 2 new priority "P3" and "P4"
+
+-- version 1.0.1-5 --
+ Add a new root "test_definition", and the element "suite" has been move into it as children elements.
+
+-- version 1.0.1-6 --
+ A new optional attribute "launcher" is added in the element "testdefinition" for supporting identifying which kind of test suites the XML is designed for
+
+-- version 1.0.1-7 --
+The Xslt related files are merged into this repo.
+including
+
+ tests.css // CSS style for showing test cases and results
+ testresult.xsl
+ testcase.xsl
+ tests.xml //example of test cases
+ result.xml //example of test result
+ application.js //Javascript for "back to top"
+ jquery.min.js //JQuery
+ back_top.png //image for "back to top"
+
+Modification in Schema:
+
+1\ the optional attribute "launcher" is moved into suite, not in "testdefinition" element any longer.
+
+2\ "spec" element is removed. and a new "specs" structure is added as below
+
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications"
+ section="Widget" specification="Widget Packaging and XML Configuration"
+ interface="Widget" usage="true" />
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+All spec-related infomation are re-organized as XML element and attributes.
+
+In Xslt,
+
+1\ a float image "Back to top" is available on right-bottom for scrolling to top.
+
+2\ html anchor is adder for scrolling back to suite summary table, and case detail tables.
+
+-- version 1.0.1-8 --
+1\ For more flexible, rename the attribute "method_or_attribute" to "element_name".
+2\ Add a new attribute "element_type" to describe the type of the corresponding specification item
+
+related example and Xlst is also updated for above.
+
+-- version 1.0.1-9 --
+1\ add an attribute "cts_version" in the element "environment/BuildInfoType" for saving the version of CTS tool
+2\ add an attribute "file" in "measurement/simpleMeasurementType"
+3\ update the result XSLt for showing cts_version
+4\ update the result XSLt for showing ¡°Test Blocked¡± instead of "Test N/A"
+5\ add a summary table for showing all FAIL cases.
+
+
+-- version 1.0.2-1 --
+1\ add a new int optional attribute "onload_delay" with default "3"
+
+-- version 1.0.2-2 --
+1\ Add a new sub element "capabilities" under the element "testcase"
+2\ Add a new boolean attribute "check_unsupport_error" in the element "testcase"
+
+-- version 1.0.2-3 --
+1\ Move the sub element "capabilities" from the element "testcase" to the element "set"
+
+
+-- version 1.0.2-4 --
+1\ Add a unique limitation for suite name
+2\ Add a new optional attribute "launcher" in set
+
+
+-- version 1.0.2-5 --
+1\ Add a attribute "set_debug_msg" in set for recording the name of log file.
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="testresult.xsl"?>
+<test_definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" name="http://tempuri.org" type="" xsi:noNamespaceSchemaLocation="test_definition.xsd">
+ <environment device_id="generic/sdk/generic:4.0.4/MR1/302030:eng/test-keys" device_model="unknown" device_name="MR8" firmware_version="4.0.4" host="zhongqing-dev.sh.intel.com (Linux - 2.6.38.6-26.rc1.fc15.i686)" os_version="4.0.4" resolution="1280*800" screen_size="250*150" cts_version="2.3.0-3">
+ <other> Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
+ Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
+ Here is a Long String for testing ~~~~~~~~~~~~~~~~~~~
+ </other>
+ </environment>
+ <summary test_plan_name="tmp_test_1">
+ <start_at>Fri Jul 13 04:04:59 CST 2012</start_at>
+ <end_at>Fri Jul 13 05:01:53 CST 2012</end_at>
+ </summary>
+ <suite name="webapi-tizen-alarm-tests" type="">
+ <set name="Alarm1">
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative create constructor with delay
+ </step_desc>
+ <expected>AlarmRelative create succeed with constructor with
+ delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>PASS</actual_result>
+ <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="BLOCK">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method get: default check
+ </step_desc>
+ <expected>AlarmManager method get: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>BLOCK</actual_result>
+ <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute attribute when create with date
+ </step_desc>
+ <expected>AlarmAbsolute attribute return correct value when
+ create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>N/R</actual_result>
+ <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method add: add relative alarm
+ </step_desc>
+ <expected>AlarmManager method add: add relative alarm succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative attribute when create with delay
+ </step_desc>
+ <expected>AlarmRelative attribute return correct value when
+ create succeed with with delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_getAll" priority="P1" purpose="check AlarmManager method getAll: default check" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method getAll: default check
+ </step_desc>
+ <expected>AlarmManager method getAll: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_03" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="Blocked">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute attribute when create with date
+ </step_desc>
+ <expected>AlarmAbsolute attribute return correct value when
+ create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=3
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1" purpose="check AlarmAbsolute method getNextScheduledDate when create with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute method getNextScheduledDate when
+ create with date
+ </step_desc>
+ <expected>AlarmAbsolute method getNextScheduledDate return
+ correct value when create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_constructor_date" priority="P1" purpose="check AlarmAbsolute create constructor with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute create constructor with date
+ </step_desc>
+ <expected>AlarmAbsolute create succeed with constructor with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1" purpose="check AlarmRelative method getNextScheduleddelay when create with delay" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative method getNextScheduleddelay when
+ create with delay
+ </step_desc>
+ <expected>AlarmRelative method getNextScheduleddelay return
+ correct value when create succeed with with delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_01" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative attribute when create with delay
+ </step_desc>
+ <expected>AlarmRelative attribute return correct value when
+ create succeed with with delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=1
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_abs" priority="P1" purpose="check AlarmManager method add: add absolute alarm" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method add: add absolute alarm
+ </step_desc>
+ <expected>AlarmManager method add: add absolute alarm succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_02" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute attribute when create with date
+ </step_desc>
+ <expected>AlarmAbsolute attribute return correct value when
+ create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=2
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_removeAll" priority="P1" purpose="check AlarmManager method removeAll: default check" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method removeAll: default check
+ </step_desc>
+ <expected>AlarmManager method removeAll: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_remove" priority="P1" purpose="check AlarmManager method remove: default check" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method remove: default check
+ </step_desc>
+ <expected>AlarmManager method remove: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManagerObject_exist" priority="P1" purpose="check AlarmManagerObject existance" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManagerObject exist</step_desc>
+ <expected>AlarmManagerObject exist</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_01" priority="P1" purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Check AlarmManager constants:</step_desc>
+ <expected>AlarmManager constants value is correct:</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=1
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>
+ <stdout>Can't find variable: tizen</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_02" priority="P1" purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Check AlarmManager constants:</step_desc>
+ <expected>AlarmManager constants value is correct:</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=2
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>
+ <stdout>Can't find variable: tizen</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_03" priority="P1" purpose="Check AlarmManager constants:PERIOD_DAY" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Check AlarmManager constants:</step_desc>
+ <expected>AlarmManager constants value is correct:</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=3
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>
+ <stdout>Can't find variable: tizen</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_04" priority="P1" purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Check AlarmManager constants:</step_desc>
+ <expected>AlarmManager constants value is correct:</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=4
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>
+ <stdout>Can't find variable: tizen</stdout>
+ </result_info>
+ </testcase>
+ </set>
+ <set name="Alarm">
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative create constructor with delay
+ </step_desc>
+ <expected>AlarmRelative create succeed with constructor with
+ delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>PASS</actual_result>
+ <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method get: default check
+ </step_desc>
+ <expected>AlarmManager method get: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute attribute when create with date
+ </step_desc>
+ <expected>AlarmAbsolute attribute return correct value when
+ create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method add: add relative alarm
+ </step_desc>
+ <expected>AlarmManager method add: add relative alarm succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative attribute when create with delay
+ </step_desc>
+ <expected>AlarmRelative attribute return correct value when
+ create succeed with with delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ </set>
+ </suite>
+ <suite name="webapi-tizen-alarm-tests1" type="">
+ <set name="Alarm4">
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative create constructor with delay
+ </step_desc>
+ <expected>AlarmRelative create succeed with constructor with
+ delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>PASS</actual_result>
+ <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method get: default check
+ </step_desc>
+ <expected>AlarmManager method get: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute attribute when create with date
+ </step_desc>
+ <expected>AlarmAbsolute attribute return correct value when
+ create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method add: add relative alarm
+ </step_desc>
+ <expected>AlarmManager method add: add relative alarm succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative attribute when create with delay
+ </step_desc>
+ <expected>AlarmRelative attribute return correct value when
+ create succeed with with delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_getAll" priority="P1" purpose="check AlarmManager method getAll: default check" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method getAll: default check
+ </step_desc>
+ <expected>AlarmManager method getAll: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_getAll.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_03" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute attribute when create with date
+ </step_desc>
+ <expected>AlarmAbsolute attribute return correct value when
+ create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=3
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:39 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_getNextScheduledDate_date" priority="P1" purpose="check AlarmAbsolute method getNextScheduledDate when create with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute method getNextScheduledDate when
+ create with date
+ </step_desc>
+ <expected>AlarmAbsolute method getNextScheduledDate return
+ correct value when create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_getNextScheduledDate_date.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:41 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_constructor_date" priority="P1" purpose="check AlarmAbsolute create constructor with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute create constructor with date
+ </step_desc>
+ <expected>AlarmAbsolute create succeed with constructor with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_constructor_date.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:57 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_getRemainingSeconds_delay" priority="P1" purpose="check AlarmRelative method getNextScheduleddelay when create with delay" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative method getNextScheduleddelay when
+ create with delay
+ </step_desc>
+ <expected>AlarmRelative method getNextScheduleddelay return
+ correct value when create succeed with with delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_getRemainingSeconds_delay.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:13 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_01" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative attribute when create with delay
+ </step_desc>
+ <expected>AlarmRelative attribute return correct value when
+ create succeed with with delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=1
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:30 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_abs" priority="P1" purpose="check AlarmManager method add: add absolute alarm" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method add: add absolute alarm
+ </step_desc>
+ <expected>AlarmManager method add: add absolute alarm succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_abs.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:32 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_02" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute attribute when create with date
+ </step_desc>
+ <expected>AlarmAbsolute attribute return correct value when
+ create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=2
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:48 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_removeAll" priority="P1" purpose="check AlarmManager method removeAll: default check" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method removeAll: default check
+ </step_desc>
+ <expected>AlarmManager method removeAll: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_removeAll.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:45:50 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_remove" priority="P1" purpose="check AlarmManager method remove: default check" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method remove: default check
+ </step_desc>
+ <expected>AlarmManager method remove: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_remove.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:06 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManagerObject_exist" priority="P1" purpose="check AlarmManagerObject existance" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManagerObject exist</step_desc>
+ <expected>AlarmManagerObject exist</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManagerObject_exist.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:22 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_01" priority="P1" purpose="Check AlarmManager constants:PERIOD_MINUTE" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Check AlarmManager constants:</step_desc>
+ <expected>AlarmManager constants value is correct:</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=1
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:38 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</end>
+ <stdout>Can't find variable: tizen</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_02" priority="P1" purpose="Check AlarmManager constants:PERIOD_HOUR" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Check AlarmManager constants:</step_desc>
+ <expected>AlarmManager constants value is correct:</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=2
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:40 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</end>
+ <stdout>Can't find variable: tizen</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_03" priority="P1" purpose="Check AlarmManager constants:PERIOD_DAY" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Check AlarmManager constants:</step_desc>
+ <expected>AlarmManager constants value is correct:</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=3
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:42 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</end>
+ <stdout>Can't find variable: tizen</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_const_check_04" priority="P1" purpose="Check AlarmManager constants:PERIOD_WEEK" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Check AlarmManager constants:</step_desc>
+ <expected>AlarmManager constants value is correct:</expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_const_check.htm?total_num=4&locator_key=id&value=4
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:46:44 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:46:46 GMT+0900 (KST)</end>
+ <stdout>Can't find variable: tizen</stdout>
+ </result_info>
+ </testcase>
+ </set>
+ <set name="Alarm3">
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_constructor_delay" priority="P1" purpose="check AlarmRelative attribute when create with delay" status="approved" type="compliance" result="PASS">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative create constructor with delay
+ </step_desc>
+ <expected>AlarmRelative create succeed with constructor with
+ delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_constructor_delay.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>PASS</actual_result>
+ <start>Sat Jan 01 2000 13:43:44 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_get" priority="P1" purpose="check AlarmManager method removeAll: without input attribute" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method get: default check
+ </step_desc>
+ <expected>AlarmManager method get: default check succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_get.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:43:46 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmAbsolute_attri_date_01" priority="P1" purpose="check AlarmAbsolute attribute when create with date" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmAbsolute attribute when create with date
+ </step_desc>
+ <expected>AlarmAbsolute attribute return correct value when
+ create with date
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmAbsolute_attri_date.htm?total_num=3&locator_key=id&value=1
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:02 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmManager_add_rel" priority="P1" purpose="check AlarmManager method add: add relative alarm" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmManager method add: add relative alarm
+ </step_desc>
+ <expected>AlarmManager method add: add relative alarm succeed
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmManager_add_rel.htm
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:05 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</end>
+ <stdout>Test time out</stdout>
+ </result_info>
+ </testcase>
+ <testcase component="WebAPI/Tizen/Alarm" execution_type="auto" id="Alarm_AlarmRelative_attri_delay_02" priority="P1" purpose="check AlarmAbsolute attribute when create with period" status="approved" type="compliance" result="FAIL">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>check AlarmRelative attribute when create with delay
+ </step_desc>
+ <expected>AlarmRelative attribute return correct value when
+ create succeed with with delay
+ </expected>
+ </step>
+ </steps>
+ <test_script_entry test_script_expected_result="0">/opt/webapi-tizen-alarm-tests/Alarm/Alarm_AlarmRelative_attri_delay.htm?total_num=2&locator_key=id&value=2
+ </test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ <result_info>
+ <actual_result>FAIL</actual_result>
+ <start>Sat Jan 01 2000 13:44:21 GMT+0900 (KST)</start>
+ <end>Sat Jan 01 2000 13:44:23 GMT+0900 (KST)</end>
+ <stdout/>
+ </result_info>
+ </testcase>
+ </set>
+ </suite>
+</test_definition>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
+ <xs:element name="suite">
+ <xs:complexType>
+ <xs:sequence minOccurs="1" maxOccurs="unbounded">
+ <xs:element ref="set" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attributeGroup ref="set_attribute_group"/>
+ <xs:attribute name="launcher" type="xs:string"/>
+ </xs:complexType>
+ <xs:unique name="uniqueSetName">
+ <xs:selector xpath=".//set"/>
+ <xs:field xpath="@name"/>
+ </xs:unique>
+ </xs:element>
+ <xs:element name="set">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="capabilities" type="CapabilitiesType" minOccurs="0" maxOccurs="1"/>
+ <xs:sequence minOccurs="1" maxOccurs="unbounded">
+ <xs:element ref="testcase" minOccurs="0" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:sequence>
+ <xs:attributeGroup ref="set_attribute_group"/>
+ <xs:attribute name="launcher" type="xs:string"/>
+ <xs:attribute name="set_debug_msg" type="xs:string"/>
+ </xs:complexType>
+ <xs:unique name="uniqueCaseName">
+ <xs:selector xpath=".//testcase"/>
+ <xs:field xpath="@id"/>
+ </xs:unique>
+ </xs:element>
+ <xs:element name="testcase">
+ <xs:complexType>
+ <xs:sequence minOccurs="1">
+ <xs:element ref="description"/>
+ <xs:element name="categories" type="categories" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="measurement" type="measurementType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="series" type="seriesType" minOccurs="0" maxOccurs="unbounded"/>
+ <xs:element name="specs" type="specsType" minOccurs="0" maxOccurs="1"/>
+ <xs:element name="result_info" type="result_info_type" minOccurs="0"/>
+ </xs:sequence>
+ <xs:attributeGroup ref="case_attribute_group"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="steps">
+ <xs:complexType>
+ <xs:sequence minOccurs="0" maxOccurs="unbounded">
+ <xs:element ref="step"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:unique name="uniqueStepName">
+ <xs:selector xpath=".//step"/>
+ <xs:field xpath="@order"/>
+ </xs:unique>
+ </xs:element>
+ <xs:attributeGroup name="set_attribute_group">
+ <xs:attribute name="name" type="xs:anyURI" use="required"/>
+ <xs:attribute name="type" type="xs:string"/>
+ </xs:attributeGroup>
+ <xs:attributeGroup name="case_attribute_group">
+ <xs:attribute name="id" use="required">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:whiteSpace value="collapse"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
+ <xs:attribute name="priority" type="priority_simple_type" use="required"/>
+ <xs:attribute name="execution_type" type="execution_type_simple_type" use="required"/>
+ <xs:attribute name="component" type="xs:string"/>
+ <xs:attribute name="requirement_ref" type="xs:anyURI" use="optional"/>
+ <xs:attribute name="status" type="status_type" use="required"/>
+ <xs:attribute name="type" type="case_type_type" use="required"/>
+ <xs:attribute name="purpose" type="xs:string"/>
+ <xs:attribute name="result" type="xs:string"/>
+ <xs:attribute name="onload_delay" type="xs:int" use="optional" default="3"/>
+ </xs:attributeGroup>
+ <xs:simpleType name="priority_simple_type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="P0"/>
+ <xs:enumeration value="P1"/>
+ <xs:enumeration value="P2"/>
+ <xs:enumeration value="P3"/>
+ <xs:enumeration value="P4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="execution_type_simple_type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="auto"/>
+ <xs:enumeration value="manual"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="status_type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="designed"/>
+ <xs:enumeration value="ready"/>
+ <xs:enumeration value="approved"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="case_type_type">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="functional_positive"/>
+ <xs:enumeration value="functional_negative"/>
+ <xs:enumeration value="security"/>
+ <xs:enumeration value="performance"/>
+ <xs:enumeration value="reliability"/>
+ <xs:enumeration value="portability"/>
+ <xs:enumeration value="maintainability"/>
+ <xs:enumeration value="compliance"/>
+ <xs:enumeration value="user_experience"/>
+ <xs:enumeration value="undefined"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:element name="purpose" type="xs:anySimpleType"/>
+ <xs:element name="notes" type="xs:string"/>
+ <xs:element name="pre_condition" type="xs:string"/>
+ <xs:element name="post_condition" type="xs:string"/>
+ <xs:element name="description">
+ <xs:complexType>
+ <xs:sequence minOccurs="1" maxOccurs="unbounded">
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element ref="notes"/>
+ </xs:choice>
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element ref="pre_condition"/>
+ </xs:choice>
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element ref="post_condition"/>
+ </xs:choice>
+ <xs:element ref="steps" minOccurs="1" maxOccurs="1"/>
+ <xs:choice minOccurs="0" maxOccurs="1">
+ <xs:element ref="test_script_entry"/>
+ </xs:choice>
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="step">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element name="step_desc" type="xs:string"/>
+ <xs:element name="expected" type="xs:string"/>
+ </xs:sequence>
+ <xs:attribute name="order" type="xs:int"/>
+ </xs:complexType>
+ </xs:element>
+ <xs:element name="test_script_entry">
+ <xs:complexType>
+ <xs:simpleContent>
+ <xs:extension base="xs:string">
+ <xs:attribute name="test_script_expected_result" type="xs:string" default="0"/>
+ <xs:attribute name="timeout" type="xs:int" default="90"/>
+ <xs:attribute name="location" type="xs:string" default="device"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ </xs:element>
+ <xs:complexType name="result_info_type">
+ <xs:sequence minOccurs="0">
+ <xs:element name="actual_result" type="xs:string"/>
+ <xs:element name="start" type="xs:string"/>
+ <xs:element name="end" type="xs:string"/>
+ <xs:element name="stdout" type="xs:string" minOccurs="0"/>
+ <xs:element name="stderr" type="xs:string" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="measurementType">
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:attribute name="value" type="xs:string"/>
+ <xs:attribute name="unit" type="xs:string"/>
+ <xs:attribute name="target" type="xs:string"/>
+ <xs:attribute name="failure" type="xs:string"/>
+ <xs:attribute name="power" type="xs:string"/>
+ </xs:complexType>
+ <xs:complexType name="seriesType">
+ <xs:sequence>
+ <xs:element name="measurement" type="simpleMeasurementType" minOccurs="1" maxOccurs="unbounded"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string"/>
+ <xs:attribute name="group" type="xs:string"/>
+ <xs:attribute name="unit" type="xs:string"/>
+ <xs:attribute name="interval" type="xs:string"/>
+ <xs:attribute name="interval_unit" type="xs:string"/>
+ <xs:attribute name="power" type="xs:string"/>
+ </xs:complexType>
+ <xs:complexType name="simpleMeasurementType">
+ <xs:attribute name="value" type="xs:string"/>
+ <xs:attribute name="file" type="xs:string"/>
+ </xs:complexType>
+ <xs:complexType name="categories">
+ <xs:sequence>
+ <xs:element name="category" type="xs:string" maxOccurs="unbounded" minOccurs="0"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:element name="test_definition">
+ <xs:complexType>
+ <xs:sequence minOccurs="1" maxOccurs="unbounded">
+ <xs:element name="environment" type="BuildInfoType" minOccurs="0"/>
+ <xs:element name="summary" type="summaryType" minOccurs="0"/>
+ <xs:element ref="suite" minOccurs="1" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:unique name="uniqueSuiteName">
+ <xs:selector xpath=".//suite"/>
+ <xs:field xpath="@name"/>
+ </xs:unique>
+ </xs:element>
+ <xs:complexType name="BuildInfoType">
+ <xs:sequence>
+ <xs:element name="other" type="xs:string"/>
+ </xs:sequence>
+ <xs:attribute name="device_name" type="xs:string"/>
+ <xs:attribute name="device_model" type="xs:string"/>
+ <xs:attribute name="os_version" type="xs:string"/>
+ <xs:attribute name="device_id" type="xs:string"/>
+ <xs:attribute name="firmware_version" type="xs:string"/>
+ <xs:attribute name="screen_size" type="xs:string"/>
+ <xs:attribute name="resolution" type="xs:string"/>
+ <xs:attribute name="host" type="xs:string"/>
+ <xs:attribute name="cts_version" type="xs:string"/>
+ <xs:attribute name="build_id" type="xs:string"/>
+ </xs:complexType>
+ <xs:complexType name="summaryType">
+ <xs:sequence>
+ <xs:element name="start_at" type="xs:string"/>
+ <xs:element name="end_at" type="xs:string"/>
+ </xs:sequence>
+ <xs:attribute name="test_plan_name" type="xs:string"/>
+ </xs:complexType>
+ <xs:complexType name="specsType">
+ <xs:sequence>
+ <xs:element name="spec" type="specType" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="specType">
+ <xs:sequence>
+ <xs:element name="spec_assertion" type="spec_assertionType"/>
+ <xs:element name="spec_url" type="xs:string"/>
+ <xs:element name="spec_statement" type="xs:string"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="spec_assertionType">
+ <xs:attribute name="category" type="xs:string" use="required"/>
+ <xs:attribute name="section" type="xs:string" use="required"/>
+ <xs:attribute name="specification" type="xs:string" use="required"/>
+ <xs:attribute name="interface" type="xs:string" use="required"/>
+ <xs:attribute name="element_name" type="xs:string" use="optional"/>
+ <xs:attribute name="usage" type="xs:boolean" default="false"/>
+ <xs:attribute name="element_type" type="xs:string"/>
+ </xs:complexType>
+ <xs:complexType name="CapabilitiesType">
+ <xs:sequence>
+ <xs:element name="capability" type="CapabilityType" minOccurs="1" maxOccurs="unbounded"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="CapabilityType">
+ <xs:sequence minOccurs="0">
+ <xs:element name="value" type="xs:string"/>
+ </xs:sequence>
+ <xs:attribute name="name" type="xs:string" use="required"/>
+ </xs:complexType>
+</xs:schema>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="jquery.min.js"/>
+ </head>
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>Test Cases</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="suites">
+ <a name="contents"/>
+ <table>
+ <tr>
+ <th>Test Suite</th>
+ <th>Total</th>
+ <th>Auto</th>
+ <th>Manual</th>
+ </tr>
+ <tr>
+ <td>
+ Total
+ </td>
+ <td>
+ <xsl:value-of select="count(test_definition/suite/set//testcase)"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(test_definition/suite/set//testcase[@execution_type = 'auto'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(test_definition/suite/set//testcase[@execution_type != 'auto'])"/>
+ </td>
+ </tr>
+ <xsl:for-each select="test_definition/suite">
+ <tr>
+ <td>
+ <a>
+ <xsl:attribute name="href">
+ #<xsl:value-of select="@name"/>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase)"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set/testcase[@execution_type = 'auto'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set/testcase[@execution_type != 'auto'])"/>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Detailed Test Cases</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="cases">
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name"/>
+ <div id="btc">
+ <a href="#contents">Back to Contents</a>
+ </div>
+ <div id="suite_title">
+ Test Suite:
+ <xsl:value-of select="@name"/>
+ <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Type</th>
+ <th>Component</th>
+ <th>Execution Type</th>
+ <th>Description</th>
+ <th>Specification</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td colspan="7">
+ Test Set:
+ <xsl:value-of select="@name"/>
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <!-- xsl:sort select="@id" /> -->
+ <tr>
+ <td>
+ <xsl:value-of select="@id"/>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose"/>
+ </td>
+ <td>
+ <xsl:value-of select="@type"/>
+ </td>
+ <td>
+ <xsl:value-of select="@component"/>
+ </td>
+ <td>
+ <xsl:value-of select="@execution_type"/>
+ </td>
+ <td>
+ <p>
+ Pre_condition:
+ <xsl:value-of select=".//description/pre_condition"/>
+ </p>
+ <p>
+ Post_condition:
+ <xsl:value-of select=".//description/post_condition"/>
+ </p>
+ <p>
+ Test Script Entry:
+ <xsl:value-of select=".//description/test_script_entry"/>
+ </p>
+ <p>
+ Steps:
+ <p/>
+ <xsl:for-each select=".//description/steps/step"><xsl:sort select="@order"/>
+ Step
+ <xsl:value-of select="@order"/>
+ :
+ <xsl:value-of select="./step_desc"/>
+ ;
+ <p/>
+ Expected Result:
+ <xsl:value-of select="./expected"/>
+ <p/>
+ </xsl:for-each>
+ </p>
+ </td>
+ <td>
+ <xsl:for-each select=".//specs/spec"><b>[Spec_Assertion]:</b><br/>
+ [Category]:
+ <xsl:value-of select="./spec_assertion/@category"/>
+ <br/>
+ [Section]:
+ <xsl:value-of select="./spec_assertion/@section"/>
+ <br/>
+ [Specification]:
+ <xsl:value-of select="./spec_assertion/@specification"/>
+ <br/>
+ [Interface]:
+ <xsl:value-of select="./spec_assertion/@interface"/>
+ <br/>
+ <xsl:choose><xsl:when test="./spec_assertion/@element_name">
+ [<xsl:value-of select="./spec_assertion/@element_type"/>]:
+ <xsl:value-of select="./spec_assertion/@element_name"/>
+ <br/>
+ </xsl:when></xsl:choose>
+ [URL]:
+ <xsl:value-of select="./spec_url"/>
+ <br/>
+ [Statement]:
+ <xsl:value-of select="./spec_statement"/>
+ <br/>
+ </xsl:for-each>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./back_top.png"/>
+ </div>
+ <script type="text/javascript" src="application.js"/>
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+ <xsl:output method="html" version="1.0" encoding="UTF-8" indent="yes"/>
+ <xsl:template match="/">
+ <html>
+ <STYLE type="text/css">
+ @import "tests.css";
+ </STYLE>
+ <head>
+ <script type="text/javascript" src="jquery.min.js"/>
+ </head>
+ <body>
+ <div id="testcasepage">
+ <div id="title">
+ <table>
+ <tr>
+ <td>
+ <h1>Test Report</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="device">
+ <table>
+ <tr>
+ <th colspan="2">Device Information</th>
+ </tr>
+ <tr>
+ <td>Device Name</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@device_name">
+ <xsl:if test="test_definition/environment/@device_name = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@device_name"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device Model</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@device_model">
+ <xsl:if test="test_definition/environment/@device_model = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@device_model"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>OS Version</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@os_version">
+ <xsl:if test="test_definition/environment/@os_version = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@os_version"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Device ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@device_id">
+ <xsl:if test="test_definition/environment/@device_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@device_id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Firmware Version</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@firmware_version">
+ <xsl:if test="test_definition/environment/@firmware_version = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@firmware_version"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Build ID</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@build_id">
+ <xsl:if test="test_definition/environment/@build_id = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@build_id"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Screen Size</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@screen_size">
+ <xsl:if test="test_definition/environment/@screen_size = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@screen_size"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Resolution</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@resolution">
+ <xsl:if test="test_definition/environment/@resolution = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@resolution"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Host Info</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@host">
+ <xsl:if test="test_definition/environment/@host = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@host"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>CTS Version</td>
+ <td>
+ <xsl:choose>
+ <xsl:when test="test_definition/environment/@cts_version">
+ <xsl:if test="test_definition/environment/@cts_version = ''">
+ N/A
+ </xsl:if>
+ <xsl:value-of select="test_definition/environment/@cts_version"/>
+ </xsl:when>
+ <xsl:otherwise>
+ N/A
+ </xsl:otherwise>
+ </xsl:choose>
+ </td>
+ </tr>
+ <tr>
+ <td>Others</td>
+ <td>
+ <xsl:if test="test_definition/environment/other = ''">
+ N/A
+ </xsl:if>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="test_definition/environment/other"/>
+ </xsl:call-template>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="summary">
+ <table>
+ <tr>
+ <th colspan="2">Test Summary</th>
+ </tr>
+ <tr>
+ <td>Test Plan Name</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/@test_plan_name"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Tests Total</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase)"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Passed</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'PASS'])"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Failed</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'FAIL'])"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Block</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase[@result = 'BLOCK'])"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Test Not Run</td>
+ <td>
+ <xsl:value-of select="count(test_definition//suite/set/testcase) - count(test_definition//suite/set/testcase[@result = 'PASS']) - count(test_definition//suite/set/testcase[@result = 'FAIL']) - count(test_definition//suite/set/testcase[@result = 'BLOCK'])"/>
+ </td>
+ </tr>
+ <tr>
+ <td>Start time</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/start_at"/>
+ </td>
+ </tr>
+ <tr>
+ <td>End time</td>
+ <td>
+ <xsl:value-of select="test_definition/summary/end_at"/>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <div id="suite_summary">
+ <div id="title">
+ <a name="contents"/>
+ <table>
+ <tr>
+ <td class="title">
+ <h1>Test Summary by Suite</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <table>
+ <tr>
+ <th>Suite</th>
+ <th>Passed</th>
+ <th>Failed</th>
+ <th>Blocked</th>
+ <th>Not Run</th>
+ <th>Total</th>
+ </tr>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td>
+ <a>
+ <xsl:attribute name="href">
+ #<xsl:value-of select="@name"/>
+ </xsl:attribute>
+ <xsl:value-of select="@name"/>
+ </a>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'PASS'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'FAIL'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase[@result = 'BLOCK'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase) - count(set//testcase[@result = 'PASS']) - count(set//testcase[@result = 'FAIL']) - count(set//testcase[@result = 'BLOCK'])"/>
+ </td>
+ <td>
+ <xsl:value-of select="count(set//testcase)"/>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </table>
+ </div>
+ <div id="fail_cases">
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">
+ Test Failures (
+ <xsl:value-of select="count(test_definition/suite/set//testcase[@result = 'FAIL'])"/>
+ )
+ </h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name"/>
+ <div id="btc">
+ <a href="#contents">Back to Contents</a>
+ </div>
+ <div id="suite_title">
+ Test Suite:
+ <xsl:value-of select="@name"/>
+ <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td colspan="4">
+ Test Set:
+ <xsl:value-of select="@name"/>
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <xsl:sort select="@id"/>
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+ <tr>
+ <td>
+ <xsl:value-of select="@id"/>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose"/>
+ </td>
+ <td class="red_rate">
+ <xsl:value-of select="@result"/>
+ </td>
+ <td>
+ <xsl:value-of select=".//result_info/stdout"/>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:if>
+ </xsl:when>
+ </xsl:choose>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ <div id="cases">
+ <div id="title">
+ <table>
+ <tr>
+ <td class="title">
+ <h1 align="center">Detailed Test Results</h1>
+ </td>
+ </tr>
+ </table>
+ </div>
+ <xsl:for-each select="test_definition/suite">
+ <xsl:sort select="@name"/>
+ <div id="btc">
+ <a href="#contents">Back to Contents</a>
+ </div>
+ <div id="suite_title">
+ Test Suite:
+ <xsl:value-of select="@name"/>
+ <a><xsl:attribute name="name"><xsl:value-of select="@name"/></xsl:attribute></a>
+ </div>
+ <table>
+ <tr>
+ <th>Case_ID</th>
+ <th>Purpose</th>
+ <th>Result</th>
+ <th>Stdout</th>
+ </tr>
+ <xsl:for-each select=".//set">
+ <xsl:sort select="@name"/>
+ <tr>
+ <td colspan="4">
+ Test Set:
+ <xsl:value-of select="@name"/>
+ </td>
+ </tr>
+ <xsl:for-each select=".//testcase">
+ <xsl:sort select="@id"/>
+ <tr>
+ <td>
+ <xsl:value-of select="@id"/>
+ </td>
+ <td>
+ <xsl:value-of select="@purpose"/>
+ </td>
+ <xsl:choose>
+ <xsl:when test="@result">
+ <xsl:if test="@result = 'FAIL'">
+ <td class="red_rate">
+ <xsl:value-of select="@result"/>
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'PASS'">
+ <td class="green_rate">
+ <xsl:value-of select="@result"/>
+ </td>
+ </xsl:if>
+ <xsl:if test="@result = 'BLOCK' ">
+ <td>
+ BLOCK
+ </td>
+ </xsl:if>
+ <xsl:if test="@result != 'BLOCK' and @result != 'FAIL' and @result != 'PASS' ">
+ <td>
+ Not Run
+ </td>
+ </xsl:if>
+ </xsl:when>
+ <xsl:otherwise>
+ <td>
+ </td>
+ </xsl:otherwise>
+ </xsl:choose>
+ <td>
+ <xsl:value-of select=".//result_info/stdout"/>
+ <xsl:if test=".//result_info/stdout = ''">
+ N/A
+ </xsl:if>
+ </td>
+ </tr>
+ </xsl:for-each>
+ </xsl:for-each>
+ </table>
+ </xsl:for-each>
+ </div>
+ </div>
+ <div id="goTopBtn">
+ <img border="0" src="./back_top.png"/>
+ </div>
+ <script type="text/javascript" src="application.js"/>
+ <script language="javascript" type="text/javascript">
+ $(document).ready(function(){
+ goTopEx();
+ });
+ </script>
+ </body>
+ </html>
+ </xsl:template>
+ <xsl:template name="br-replace">
+ <xsl:param name="word"/>
+ <xsl:variable name="cr">
+ <xsl:text>
+ </xsl:text>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="contains($word,$cr)">
+ <xsl:value-of select="substring-before($word,$cr)"/>
+ <br/>
+ <xsl:call-template name="br-replace">
+ <xsl:with-param name="word" select="substring-after($word,$cr)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$word"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+</xsl:stylesheet>
--- /dev/null
+@charset "UTF-8";\r
+/* CSS Document */\r
+#testcasepage div,\r
+#testcasepage h1,\r
+#testcasepage p,\r
+#testcasepage table,\r
+#testcasepage tr,\r
+#testcasepage th,\r
+#testcasepage td {\r
+ margin: 0;\r
+ padding: 0;\r
+ border: 0;\r
+ font-weight: inherit;\r
+ font-style: inherit;\r
+ font-size: 0.96em;\r
+ font-family: arial;\r
+ vertical-align: baseline;\r
+}\r
+\r
+#testcasepage p {\r
+ text-align: left;\r
+}\r
+\r
+#suite_title {\r
+ text-align: left;\r
+}\r
+\r
+#btc {\r
+ text-align: right;\r
+}\r
+\r
+#testcasepage table {\r
+ border-collapse: separate;\r
+ border-spacing: 0;\r
+ margin-bottom: 1.4em;\r
+ vertical-align: middle;\r
+}\r
+\r
+#testcasepage th,\r
+#testcasepage td {\r
+ text-align: left;\r
+ font-weight: normal;\r
+ padding: 4px 10px 4px 5px;\r
+ vertical-align: middle;\r
+}\r
+\r
+#cases table {\r
+ width: 101%;\r
+}\r
+\r
+#fail_cases table {\r
+ width: 101%;\r
+}\r
+\r
+#title table {\r
+ width: 101%;\r
+}\r
+\r
+#device table {\r
+ width: 50%;\r
+}\r
+\r
+#summary table {\r
+ width: 50%;\r
+}\r
+\r
+#testcasepage th {\r
+ border-bottom: 1px solid #000;\r
+ background-color: #AAAAAA;\r
+ border-left: 1px solid #000;\r
+ border-top: 1px solid #000;\r
+ color: #000;\r
+ font-weight: bold;\r
+ vertical-align: bottom;\r
+}\r
+\r
+#testcasepage th:last-child,\r
+#testcasepage td:last-child {\r
+ border-right: 1px solid #000;\r
+}\r
+\r
+#testcasepage td {\r
+ border-left: 1px solid;\r
+ font-weight: normal;\r
+ border-bottom: 1px solid;\r
+}\r
+\r
+#testcasepage td.yellow_rate {\r
+ background-color: #ffcc00;\r
+}\r
+\r
+#testcasepage td.green_rate {\r
+ background-color: #33cc33;\r
+}\r
+\r
+#testcasepage td.dgreen_rate {\r
+ background-color: #339933;\r
+}\r
+\r
+#testcasepage td.red_rate {\r
+ background-color: #FF3333;\r
+}\r
+\r
+#title table,\r
+#title tr,\r
+#title td {\r
+ border-left: none;\r
+ border-bottom: none;\r
+ text-align: center;\r
+}\r
+\r
+#title td:last-child {\r
+ border-right: none;\r
+}\r
+\r
+#testcasepage h1 {\r
+ font-size: 2em;\r
+ font-family: Arial, sans-serif;\r
+ font-weight: bold;\r
+ line-height: 1;\r
+ color: #000;\r
+ margin-bottom: 0.75em;\r
+ padding-top: 0.25em;\r
+ font-weight: bold;\r
+}\r
+\r
+#goTopBtn {\r
+ right: 0px;\r
+ bottom: 0px;\r
+ position: fixed; +position: absolute;\r
+ top: expression(parseInt(document.body.scrollTop) + document.body.clientHeight - 40);\r
+}\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet type="text/xsl" href="testcase.xsl"?>
+<test_definition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="test_definition.xsd">
+ <suite name="webapi-w3c-widget-tests">
+ <set name="WidgetPackaging">
+ <testcase purpose="Tests the user agent's ability to process files with no file extension. " type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="auto" priority="P3" id="dm">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</step_desc>
+ <expected>To pass, the user agent start file of the widget must be index.htm</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dm</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Tizen" specification="Tizen Packaging and XML Configuration" interface="Tizen" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests the user agent's ability to process files with a file extension other than .wgt." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dn">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</step_desc>
+ <expected>To pass, the user agent start file of the widget must be index.htm</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dn.test</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" usage="true"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the ability of the UA to verify a zip archive." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="do">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</step_desc>
+ <expected>To pass, the user agent must treat this as an invalid widget (archive is spanned).</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/split.wgt.001</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the user agent's ability to get a widget over HTTP and respect the application/widget mimetype. The server from which this test is served from has been set up to label the 'test' resource as an 'application/widget'." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="z3">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</step_desc>
+ <expected>To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only because of sniffing).</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z3</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the user agent's ability to get a widget over HTTP and respect the 'application/widget' mimetype. The server from which this test is served from has been set up to label the 'test.html' resource as an 'application/widget'." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="z4">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</step_desc>
+ <expected>To pass, a user agent must correctly process this resource as a widget because of the 'application/widget' mimetype (i.e., not only via sniffing).</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/z4.html</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that an empty defaultlocale attribute is ignored (and does not cause the widget to be treated as invalid)." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore00">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</step_desc>
+ <expected>To pass, the widget must simply run..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocignore00.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that the user agent applies rule for getting a single attribute value to the defaultlocale attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore01">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</step_desc>
+ <expected> To pass, the name of the widget must be the value PASS..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-001.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that the user agent matches obscure, yet valid, language tags." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore02">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</step_desc>
+ <expected> To pass, the widgets description must be the value PASS..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-002.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that a language tag already part of the UA's locales list is ignored when it is repeated for defaultlocale attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore03">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</step_desc>
+ <expected>To pass, the specified value should not be added twice to the locales list of the UA..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-003.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that the default locale is added to the end of the user agent's locale list (and does not override the default language, which is assumed to be 'en')." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocignore04">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</step_desc>
+ <expected>To pass, the name of the widget must be PASS..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-004.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that the value of defaultlocale is also used to in folder-based localization." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocuse00">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</step_desc>
+ <expected>To pass, the index.html of the folder 'locales/esx-al/' should be loaded and say PASS..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ta-de-000.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that the value of defaultlocale works in conjunction to xml:lang on the widget element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="dlocuse01">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</step_desc>
+ <expected>To pass, the name of the widget must be PASS..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/dlocuse01.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that the UA rejects configuration documents that don't have correct widget element at the root." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aa">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</step_desc>
+ <expected> To pass, the UA must treat this as an invalid widget (the root element is not widget)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aa.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that the UA rejects configuration documents that don't have correct widget element at the root." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ab">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</step_desc>
+ <expected> To pass, the UA must treat this as an invalid widget (the namespace is wrong)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ab.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that the UA rejects configuration documents that don't have correct widget element at the root." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ac">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</step_desc>
+ <expected>To pass, the UA must treat this as an invalid widget (the namespace is missing)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ac.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly processes a author element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="af">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</step_desc>
+ <expected>To pass, the author name must be the string "PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/af.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ag">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</step_desc>
+ <expected>To pass, the widget author must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ag.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ah">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</step_desc>
+ <expected>To pass, the author name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at start/end trimmed)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ah.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ai">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</step_desc>
+ <expected>To pass, the author email must be the string "PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ai.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aj">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</step_desc>
+ <expected>To pass, the author name must be the string "PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aj.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ak">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</step_desc>
+ <expected>To pass, the author name must be the string "PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ak.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the ability of the user agent to handle an empty author element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="al">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</step_desc>
+ <expected>To pass, the author name must be an empty string..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/al.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the ability of the user agent to correctly process the author href attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="am">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</step_desc>
+ <expected>To pass, the value of author href must be "PASS:PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/am.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the ability of the user agent to correctly process the author href attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="an">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</step_desc>
+ <expected>To pass, the value of author href must be ignored..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/an.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly processes a name element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ao">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</step_desc>
+ <expected>To pass, the widget name must be the string "PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ao.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ap">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</step_desc>
+ <expected>To pass, the widget name must be the string "P A S S" (i.e., white space collapsed to single space)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ap.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aq">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</step_desc>
+ <expected>To pass, the widget name must be the string "PASS" (i.e., all white space collapsed to single space, spaces at front/back trimmed)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aq.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ar">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</step_desc>
+ <expected>To pass, the widget short name must be the string "PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ar.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="as">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</step_desc>
+ <expected>To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/as.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly applies the rule for getting a single attribute value and the Rule for Getting Text Content with Normalized White Space." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="at">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</step_desc>
+ <expected>To pass, the widget short name must be the string "PASS" and the widget name must be "PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/at.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly processes the short attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="au">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</step_desc>
+ <expected>To pass, the widget short name must be an empty string..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/au.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the ability of the user agent to handle an empty name element." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="av">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</step_desc>
+ <expected>To pass, the widget name must be an empty string..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/av.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that a user agent correctly processes a name element with xml:lang attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="oa">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</step_desc>
+ <expected>To pass, the widget name must be the string "PASS"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/oa.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that the user agent does not attempt to load a default start file when a custom start file has been declared." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="aw">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</step_desc>
+ <expected>To pass, the widget start file must point to "pass.html" and the icons list must contain a pointer to "icon.png" at the root of the widget..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/aw.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ax">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</step_desc>
+ <expected>To pass, the widget height must be either the numeric value 123 or a value greater than 0..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ax.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ay">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</step_desc>
+ <expected>To pass, the user agent must ignore the value of the height attribute (the value is composed of characters)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ay.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="az">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</step_desc>
+ <expected>To pass, the widget height must be the numeric value 100 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/az.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a1">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</step_desc>
+ <expected>To pass, the widget height must be the numeric value 123 or a value greater than 0 (resulting from rule for parsing a non-negative integer)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a1.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a2">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</step_desc>
+ <expected>To pass, the widget height must be ignored (the value is an empty string, hence it would be ignored)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a2.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a3">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</step_desc>
+ <expected>To pass, the widget height must be ignored (the value is a sequence of space characters, hence it would be ignored)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a3.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the UA's ability process the height attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a4">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</step_desc>
+ <expected>To pass, the widget height must be ignored (the value is an empty string)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a4.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that the UA skips preference elements without a name attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a5">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</step_desc>
+ <expected>To pass, widget preferences must remain an empty list (i.e., the preference is skipped)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a5.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that the UA skips preference element already defined." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a6">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</step_desc>
+ <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a6.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a7">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</step_desc>
+ <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a7.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that the UA does a case sensitive comparison on the value of the readonly attribute." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a8">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</step_desc>
+ <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "true"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a8.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that the UA sets the readonly attribute to false by default." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="a9">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</step_desc>
+ <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/a9.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test that the UA skips multiple preference element already defined." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="ba">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</step_desc>
+ <expected>To pass, widget preference must contain one preference whose name is "a" and whose value is "a" and whose readonly attr value must be "false"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/ba.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test the UA's ability store preferences whose name vary only in case." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bb">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</step_desc>
+ <expected>To pass, widget preference must contain two preferences: 1 must have a name "a" and whose value is "a" and whose readonly attr value must be "false". 2 must have a name "A" and whose value is "b" and whose readonly attribute value must be "false"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bb.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Tests that the UA applies the rule for getting a single attribute value to name, value, and readonly attributes." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bc">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</step_desc>
+ <expected>To pass, widget preference must contain one preference whose name is "PASS" and whose value is "PASS" and whose readonly attr value must be "false"..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bc.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in an arbitrary folder." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bg">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</step_desc>
+ <expected>To pass, the user agent must treat this widget as an invalid widget (config file is not at the root)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bg.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ <testcase purpose="Test to make sure that the UA only checks the root of the widget for config files, and not in a locale folder." type="compliance" status="ready" component="WebAPI/W3C_Widget/WidgetPackaging" execution_type="manual" priority="P3" id="bh">
+ <description>
+ <pre_condition/>
+ <post_condition/>
+ <steps>
+ <step order="1">
+ <step_desc>Install /opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</step_desc>
+ <expected>To pass, the user agent must treat this widget as an invalid widget (config file is not at the root, but in locale folder)..</expected>
+ </step>
+ </steps>
+ <test_script_entry>/opt/webapi-w3c-widget-tests/WidgetPackaging/w3c/bh.wgt</test_script_entry>
+ </description>
+ <specs>
+ <spec>
+ <spec_assertion category="Tizen Device API Specifications" section="Widget" specification="Widget Packaging and XML Configuration" interface="Widget" element_name="constructor" element_type="method"/>
+ <spec_url>http://www.w3.org/TR/widgets-apis/</spec_url>
+ <spec_statement>spec_statement</spec_statement>
+ </spec>
+ </specs>
+ </testcase>
+ </set>
+ </suite>
+</test_definition>
TOOL_KIT='/home/hoon/share/repository/tct-tools/tct-toolkit/tct-tools/'
# tool path
-# {repository_path}/tools/tct_5.5/
-TOOLS='/home/hoon/share/repository/tct-tools/tools/tct_5.5/'
+# {repository_path}/tools/tct_6.0/
+TOOLS='/home/hoon/share/repository/tct-tools/tools/tct_6.0/'
# tct path
-# {repository_path}/api/release/chsarp-tct_5.5_dotnet
-TCT_PATH='/home/hoon/share/repository/public/csharp/net5.5/api/release/csharp-tct_5.5_dotnet'
+# {repository_path}/api/release/chsarp-tct_6.0_dotnet
+TCT_PATH='/home/hoon/share/repository/public/csharp/net6.0/api/release/csharp-tct_6.0_dotnet'
echo "Getting latest tools in spin repository."
echo "Updating resource folder"
-rsync -avz --exclude=tct-testconfig --exclude=tct-testconfig-3.0.zip $TOOLS/resource/ $TCT_PATH/csharp-tct_5.5_dotnet/resource/
+rsync -avz --exclude=tct-testconfig --exclude=tct-testconfig-3.0.zip $TOOLS/resource/ $TCT_PATH/csharp-tct_6.0_dotnet/resource/
# remove tizen-web-ui-fw and tinyweb folder
-rm -rf $TCT_PATH/csharp-tct_5.5_dotnet/resource/tizen-web-ui-fw/
-rm -rf $TCT_PATH/csharp-tct_5.5_dotnet/resource/tinyweb/
+rm -rf $TCT_PATH/csharp-tct_6.0_dotnet/resource/tizen-web-ui-fw/
+rm -rf $TCT_PATH/csharp-tct_6.0_dotnet/resource/tinyweb/
echo "Updating tools folder"
-rsync -avz --exclude=healthcheck.ini --exclude=manager $TOOLS/tools/ $TCT_PATH/csharp-tct_5.5_dotnet/tools/
+rsync -avz --exclude=healthcheck.ini --exclude=manager $TOOLS/tools/ $TCT_PATH/csharp-tct_6.0_dotnet/tools/
echo "Updating tct-toolkit"
echo "Changing folder permission"
-sudo chmod -R 777 $TCT_PATH/csharp-tct_5.5_dotnet/
+sudo chmod -R 777 $TCT_PATH/csharp-tct_6.0_dotnet/
sudo chmod -R 777 $TCT_PATH/tct-tools_r4_rc1/
cd $TCT_PATH
cd ../../tool/script
-sudo rm -rf ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile
-sudo rm -rf ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/tv
-sudo rm -rf ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/wearable
-sudo rm -rf ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/common_iot
-sudo mkdir ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile
+sudo rm -rf ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile
+sudo rm -rf ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/tv
+sudo rm -rf ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/wearable
+sudo rm -rf ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/common_iot
+sudo mkdir ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile
########################### Auto packaging ###########################
sudo python pack.py manual Tracer
-#sudo sed -i 's/profile="mobile"/profile="common_iot"/' ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml
-#sudo sed -i 's#mobile/#common_iot/#' ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml
+#sudo sed -i 's/profile="mobile"/profile="common_iot"/' ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml
+#sudo sed -i 's#mobile/#common_iot/#' ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml
-#sudo mv ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/common_iot_pkg_info.xml
-#sudo mv ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/common_iot
+#sudo mv ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/common_iot_pkg_info.xml
+#sudo mv ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/common_iot
-sudo chmod -R 777 ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/
+sudo chmod -R 777 ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/
-#sudo rm -f ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml
-sudo rm -f ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/tv_pkg_info.xml
-sudo rm -f ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/wearable_pkg_info.xml
-sudo rm -f ../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/common_iot_pkg_info.xml
+#sudo rm -f ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml
+sudo rm -f ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/tv_pkg_info.xml
+sudo rm -f ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/wearable_pkg_info.xml
+sudo rm -f ../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/common_iot_pkg_info.xml
-daily_headed="csharp-tct_5.5_$(date +%Y%m%d)_headed"
-sudo rm -rf ../../release/$daily_headed
-sudo cp -r ../../release/csharp-tct_5.5_dotnet/ ../../release/$daily_headed
-sudo mv ../../release/$daily_headed/csharp-tct_5.5_dotnet ../../release/$daily_headed/$daily_headed
+daily_headed="csharp-tct_6.0_$(date +%Y%m%d)_headed"
+sudo rm -rf ../../release/$daily_headed
+sudo cp -r ../../release/csharp-tct_6.0_dotnet/ ../../release/$daily_headed
+sudo mv ../../release/$daily_headed/csharp-tct_6.0_dotnet ../../release/$daily_headed/$daily_headed
# copy healthcheck and inst.py files for artik profile
sudo cp -r artik_template/healthcheck.ini ../../release/$daily_headed/$daily_headed/tools/healthcheck.ini
# os.system ('git reset --hard')
# os.system ('git pull')
- remove_folder('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile')
- remove_folder('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/tv')
- remove_folder('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/wearable')
- create_folder('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile')
- remove_folder('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos')
- create_folder('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos')
+ remove_folder('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile')
+ remove_folder('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/tv')
+ remove_folder('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/wearable')
+ create_folder('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile')
+ remove_folder('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos')
+ create_folder('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos')
# pack tv package
# Copy mobile package folder to tv package.
# set tv_pkg_info.xml
- sed_inplace('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml','profile="mobile"', 'profile="tv"' )
- sed_inplace('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml','mobile/', 'tv/' )
- os.rename('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml','../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/tv_pkg_info.xml')
+ sed_inplace('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml','profile="mobile"', 'profile="tv"' )
+ sed_inplace('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml','mobile/', 'tv/' )
+ os.rename('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml','../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/tv_pkg_info.xml')
# rename mobile folder to tv folder
- os.rename('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile','../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/tv')
+ os.rename('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile','../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/tv')
# pack wearable package
# Copy mobile package folder to wearable package.
# set wearable_pkg_info.xml
- sed_inplace('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml','profile="mobile"', 'profile="wearable"' )
- sed_inplace('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml','mobile/', 'wearable/' )
- os.rename('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml','../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/wearable_pkg_info.xml')
+ sed_inplace('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml','profile="mobile"', 'profile="wearable"' )
+ sed_inplace('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml','mobile/', 'wearable/' )
+ os.rename('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml','../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/wearable_pkg_info.xml')
# rename mobile folder to wearable folder
- os.rename('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile','../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/wearable')
+ os.rename('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile','../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/wearable')
# pack mobile package
- create_folder('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile')
+ create_folder('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile')
os.system(LINUX_PERMISSION+' python pack.py '+'all')
# os.system(LINUX_PERMISSION+' python pack.py '+line)
#f.close()
- #sed_inplace('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml','profile="mobile"', 'profile="tv"' )
- #sed_inplace('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml','mobile/', 'tv/' )
- #os.rename('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml','../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/tv_pkg_info.xml')
- #os.rename('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile','../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/tv')
- #create_folder('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile')
+ #sed_inplace('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml','profile="mobile"', 'profile="tv"' )
+ #sed_inplace('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml','mobile/', 'tv/' )
+ #os.rename('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml','../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/tv_pkg_info.xml')
+ #os.rename('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile','../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/tv')
+ #create_folder('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile')
#os.system(LINUX_PERMISSION+' python pack.py '+'all')
date_time = datetime.datetime.today().strftime('%Y%m%d')
- src = '../../release/csharp-tct_5.5_dotnet/'
- dst = '../../release/csharp-tct_5.5_' + date_time
+ src = '../../release/csharp-tct_6.0_dotnet/'
+ dst = '../../release/csharp-tct_6.0_' + date_time
if os.path.exists(dst):
remove_folder(dst)
else:
else:
shutil.copy2(s, d)
- os.rename(dst + '/csharp-tct_5.5_dotnet/',dst +'/csharp-tct_5.5_'+date_time)
+ os.rename(dst + '/csharp-tct_6.0_dotnet/',dst +'/csharp-tct_6.0_'+date_time)
try:
- os.remove('../../release/csharp-tct_5.5_'+date_time+'.tar.gz')
+ os.remove('../../release/csharp-tct_6.0_'+date_time+'.tar.gz')
except OSError:
pass
try:
- os.remove('../../release/csharp-tct_5.5_'+date_time+'.tar')
+ os.remove('../../release/csharp-tct_6.0_'+date_time+'.tar')
except OSError:
pass
if platform == "linux" or platform == "linux2":
- os.system('sudo chmod -R 777 '+ '../../release/csharp-tct_5.5_' + date_time)
+ os.system('sudo chmod -R 777 '+ '../../release/csharp-tct_6.0_' + date_time)
#changing file format
for root, dirs, files in os.walk(dst):
text = open(os.path.abspath(p), 'rb').read().replace('\r\n','\n')
open(os.path.abspath(p), 'wb').write(text)
- with tarfile.open('../../release/csharp-tct_5.5_'+date_time+'.tar.gz', "w:gz") as tar:
+ with tarfile.open('../../release/csharp-tct_6.0_'+date_time+'.tar.gz', "w:gz") as tar:
tar.add(dst, arcname=os.path.basename(dst))
- remove_folder('../../release/csharp-tct_5.5_' + date_time)
+ remove_folder('../../release/csharp-tct_6.0_' + date_time)
TOOL_KIT='/home/hoon/share/repository/tct-tools/tct-toolkit/tct-tools/'
# tool path
-# {repository_path}/tools/tct_5.5/
-TOOLS='/home/hoon/share/repository/tct-tools/tools/tct_5.5/'
+# {repository_path}/tools/tct_6.0/
+TOOLS='/home/hoon/share/repository/tct-tools/tools/tct_6.0/'
# tct path
-# {repository_path}/api/release/chsarp-tct_5.5_dotnet
-TCT_PATH='/home/hoon/share/repository/public/csharp/net5.5/api/release/csharp-tct_5.5_dotnet'
+# {repository_path}/api/release/chsarp-tct_6.0_dotnet
+TCT_PATH='/home/hoon/share/repository/public/csharp/net6.0/api/release/csharp-tct_6.0_dotnet'
echo "Getting latest tools in spin repository."
echo "Updating resource folder"
-rsync -avz --exclude=tct-testconfig --exclude=tct-testconfig-3.0.zip $TOOLS/resource/ $TCT_PATH/csharp-tct_5.5_dotnet/resource/
+rsync -avz --exclude=tct-testconfig --exclude=tct-testconfig-3.0.zip $TOOLS/resource/ $TCT_PATH/csharp-tct_6.0_dotnet/resource/
# remove tizen-web-ui-fw and tinyweb folder
-rm -rf $TCT_PATH/csharp-tct_5.5_dotnet/resource/tizen-web-ui-fw/
-rm -rf $TCT_PATH/csharp-tct_5.5_dotnet/resource/tinyweb/
+rm -rf $TCT_PATH/csharp-tct_6.0_dotnet/resource/tizen-web-ui-fw/
+rm -rf $TCT_PATH/csharp-tct_6.0_dotnet/resource/tinyweb/
echo "Updating tools folder"
-rsync -avz --exclude=healthcheck.ini --exclude=manager $TOOLS/tools/ $TCT_PATH/csharp-tct_5.5_dotnet/tools/
+rsync -avz --exclude=healthcheck.ini --exclude=manager $TOOLS/tools/ $TCT_PATH/csharp-tct_6.0_dotnet/tools/
echo "Updating tct-toolkit"
echo "Changing folder permission"
-sudo chmod -R 777 $TCT_PATH/csharp-tct_5.5_dotnet/
+sudo chmod -R 777 $TCT_PATH/csharp-tct_6.0_dotnet/
sudo chmod -R 777 $TCT_PATH/tct-tools_r4_rc1/
PACKAGE_NAME = ''
TPK_PATH = ''
RELEASE_PATH = ''
-TCT='csharp-tct_5.5_dotnet'
+TCT='csharp-tct_6.0_dotnet'
SUCCESS = 0
FAILS = 0
return count
-def print_result(success , fails):
+def print_result(success , fails):
print('')
print('-------------------------------------')
print(' packaging result ')
print('')
-def pack(module , cnt):
+def pack(module , cnt):
MODULE_NAME = module
RELEASE_PATH = 'release/'
# Check the module exist or not.
- if not os.path.isdir(PROJECT_PATH+PACKAGE_NAME+'/'):
+ if not os.path.isdir(PROJECT_PATH+PACKAGE_NAME+'/'):
print(bcolors.ERROR + str(cnt+1) + " please check the module name. "+bcolors.ENDC+MODULE_NAME+bcolors.ERROR+" package does not exist in tct-suite-vs."+bcolors.ENDC)
print(" You can choose from below package list.")
module_list = folder_list(PROJECT_PATH)
- module_list.sort()
+ module_list.sort()
for module in module_list:
temp = module
if module.find(".Manual") > -1:
- temp = module.replace(".Manual" , "")
+ temp = module.replace(".Manual" , "")
temp = "manual " + temp
else :
- temp = "auto " + temp
+ temp = "auto " + temp
print(" " + temp)
- global FAILS
+ global FAILS
FAILS += 1
return
if not os.path.isfile(TPK_PATH):
print(bcolors.ERROR + str(cnt+1) + " You should build "+MODULE_NAME+" project before run this script." +bcolors.ENDC)
FAILS += 1
- return
+ return
# Create release / tclist / bin folder.
create_folder(RELEASE_PATH)
# create new test.xml file
file_list = read_all_testfiles(PROJECT_PATH+PACKAGE_NAME+'/testcase/')
- file_list.sort()
+ file_list.sort()
tc_list = []
for file_path in file_list:
if file_count(PROJECT_PATH+PACKAGE_NAME+'/res') > 0:
shutil.copytree(PROJECT_PATH+PACKAGE_NAME+'/res' , 'bin/opt/'+PACKAGE_NAME+'/res')
- # create zip
- zip('bin', RELEASE_PATH+PACKAGE_NAME+'-5.5')
- if os.path.isfile(RELEASE_PATH+PACKAGE_NAME+'-5.5.zip'):
+ # create zip
+ zip('bin', RELEASE_PATH+PACKAGE_NAME+'-6.0')
+ if os.path.isfile(RELEASE_PATH+PACKAGE_NAME+'-6.0.zip'):
print( str(cnt+1) + " Created "+bcolors.OKGREEN + MODULE_NAME + bcolors.ENDC + " Packages.")
- global SUCCESS
+ global SUCCESS
SUCCESS += 1
- # copy zip file
+ # copy zip file
create_folder('../../release/'+TCT+'/'+TCT+'/package/mobile/')
- shutil.copy(RELEASE_PATH+PACKAGE_NAME+'-5.5.zip', '../../release/'+TCT+'/'+TCT+'/package/mobile/')
+ shutil.copy(RELEASE_PATH+PACKAGE_NAME+'-6.0.zip', '../../release/'+TCT+'/'+TCT+'/package/mobile/')
# If TCT is installed , replace package
- if os.path.isdir('/opt/tct/tizen_csharp_5.5'):
- shutil.copy(RELEASE_PATH+PACKAGE_NAME+'-5.5.zip', '/opt/tct/tizen_csharp_5.5/packages/mobile')
+ if os.path.isdir('/opt/tct/tizen_csharp_6.0'):
+ shutil.copy(RELEASE_PATH+PACKAGE_NAME+'-6.0.zip', '/opt/tct/tizen_csharp_6.0/packages/mobile')
# Remove bin folder.
remove_folder('bin')
if(sys.argv[1] != 'all'):
print_error()
exit(1)
- elif len(sys.argv) < 3:
+ elif len(sys.argv) < 3:
print_error()
exit(1)
print_error()
exit(1)
- if sys.argv[1] == 'all':
+ if sys.argv[1] == 'all':
pack_list = folder_list(PROJECT_PATH)
else:
MODULE = sys.argv[2]
- if sys.argv[1] == 'manual':
+ if sys.argv[1] == 'manual':
MODULE = MODULE +'.Manual'
pack_list.append(MODULE)
pack(pack_list[i] , i)
- create_folder('../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/')
+ create_folder('../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/')
if sys.argv[1] == 'all':
pkg_info_gen = PKGInfoGenerator('all')
else :
pkg_info_gen = PKGInfoGenerator(PREFIX+MODULE+SUFFIX)
pkg_info_gen.generate_pkg_info()
- if os.path.isdir('/opt/tct/tizen_csharp_5.5'):
- shutil.copy('../../release/'+TCT+'/'+TCT+'/package/pkg_infos/mobile_pkg_info.xml', '/opt/tct/tizen_csharp_5.5/packages/pkg_infos')
+ if os.path.isdir('/opt/tct/tizen_csharp_6.0'):
+ shutil.copy('../../release/'+TCT+'/'+TCT+'/package/pkg_infos/mobile_pkg_info.xml', '/opt/tct/tizen_csharp_6.0/packages/pkg_infos')
-
# pkg_info_gen = PKGInfoGenerator()
# pkg_info_gen.generate_pkg_info()
import shutil
import platform
-FILE_PATH = '../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/pkg_infos/mobile_pkg_info.xml'
+FILE_PATH = '../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/pkg_infos/mobile_pkg_info.xml'
OKGREEN = '\033[92m'
ENDC = '\033[0m'
class PKGInfoGenerator:
# If option is 'all', all package generate.
- module = ''
+ module = ''
def __init__(self , module):
self.module = module
with zipfile.ZipFile(source_file, 'r') as zf:
zf.extractall(path=dest_path)
zf.close()
-
+
def add_testsuite_tag(self):
- path = '../../release/csharp-tct_5.5_dotnet/csharp-tct_5.5_dotnet/package/mobile/'
+ path = '../../release/csharp-tct_6.0_dotnet/csharp-tct_6.0_dotnet/package/mobile/'
for root, dirs, files in os.walk(path):
rootpath = os.path.abspath(root)
files.sort()
splitwords = filepath.split(split_type)
index = len(splitwords)
project_name = splitwords[index-1]
- project_name = project_name.replace("-5.5.zip","")
- dest = filepath.replace("-5.5.zip","")
+ project_name = project_name.replace("-6.0.zip","")
+ dest = filepath.replace("-6.0.zip","")
#unzip
self.unzip( filepath , dest )
xml_path = dest +'/opt/'+ project_name+'/tests.xml'
splitwords = output.split("\n")
tc_number = splitwords[0]
# Check whether project is auto or manual from project name
- if "Manual" not in project_name:
+ if "Manual" not in project_name:
auto_manual = "auto"
else:
- auto_manual = "manual"
+ auto_manual = "manual"
self.set_testsuite_tag(project_name, tc_number, auto_manual)
# Remove Unzip folder
shutil.rmtree(dest)
-
def set_testsuite_tag(self, project_name, tc_number, auto_manual):
if self.module == 'all' :
self.write_file(' <auto_tcn>0</auto_tcn>\n')
self.write_file(' <manual_tcn>' + tc_number + '</manual_tcn>\n')
self.write_file(' <total_tcn>' + tc_number + '</total_tcn>\n')
- self.write_file(' <pkg_name>mobile/' + project_name + '-5.5.zip</pkg_name>\n')
+ self.write_file(' <pkg_name>mobile/' + project_name + '-6.0.zip</pkg_name>\n')
self.write_file(' </suite>\n')
def add_ending_tag(self):