This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
dongxiaoyan-tsg-autotest/log.html

2126 lines
459 KiB
HTML
Raw Normal View History

2020-04-01 12:42:05 +08:00
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="Expires" content="-1">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta content="Robot Framework 3.1.2 (Python 3.6.8 on win32)" name="Generator">
<link rel="icon" type="image/x-icon" href="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKcAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAAqAAAAAAAAAAAAAAAAAAAALIAAAD/AAAA4AAAANwAAADcAAAA3AAAANwAAADcAAAA3AAAANwAAADcAAAA4AAAAP8AAACxAAAAAAAAAKYAAAD/AAAAuwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC/AAAA/wAAAKkAAAD6AAAAzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN8AAAD/AAAA+gAAAMMAAAAAAAAAAgAAAGsAAABrAAAAawAAAGsAAABrAAAAawAAAGsAAABrAAAADAAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAAIsAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAANEAAAAAAAAA2gAAAP8AAAD6AAAAwwAAAAAAAAAAAAAAMgAAADIAAAAyAAAAMgAAADIAAAAyAAAAMgAAADIAAAAFAAAAAAAAANoAAAD/AAAA+gAAAMMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAADwAAAB8AAAAAAAAAGAAAABcAAAAAAAAAH8AAABKAAAAAAAAAAAAAAAAAAAA2gAAAP8AAAD6AAAAwwAAAAAAAADCAAAA/wAAACkAAADqAAAA4QAAAAAAAAD7AAAA/wAAALAAAAAGAAAAAAAAANoAAAD/AAAA+gAAAMMAAAAAAAAAIwAAAP4AAAD/AAAA/wAAAGAAAAAAAAAAAAAAAMkAAAD/AAAAigAAAAAAAADaAAAA/wAAAPoAAADDAAAAAAAAAAAAAAAIAAAAcAAAABkAAAAAAAAAAAAAAAAAAAAAAAAAEgAAAAAAAAAAAAAA2gAAAP8AAAD7AAAAywAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAN4AAAD/AAAAqwAAAP8AAACvAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALIAAAD/AAAAsgAAAAAAAAC5AAAA/wAAAMoAAADAAAAAwAAAAMAAAADAAAAAwAAAAMAAAADAAAAAwAAAAMkAAAD/AAAAvAAAAAAAAAAAAAAAAAAAAKwAAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAA/wAAAP8AAAD/AAAArQAAAAAAAAAAwAMAAIABAAAf+AAAP/wAAD/8AAAgBAAAP/wAAD/8AAA//AAAJIwAADHEAAA//AAAP/wAAB/4AACAAQAAwAMAAA==">
<style media="all" type="text/css">
/* Generic and misc styles */
body {
font-family: Helvetica, sans-serif;
font-size: 0.8em;
color: black;
padding: 6px;
background: white;
}
table {
table-layout: fixed;
word-wrap: break-word;
empty-cells: show;
font-size: 1em;
}
th, td {
vertical-align: top;
}
br {
mso-data-placement: same-cell; /* maintain line breaks in Excel */
}
hr {
background: #ccc;
height: 1px;
border: 0;
}
a, a:link, a:visited {
text-decoration: none;
color: #15c;
}
a > img {
border: 1px solid #15c !important;
}
a:hover, a:active {
text-decoration: underline;
color: #61c;
}
.parent-name {
font-size: 0.7em;
letter-spacing: -0.07em;
}
.message {
white-space: pre-wrap;
}
/* Headers */
#header {
width: 65em;
height: 3em;
margin: 6px 0;
}
h1 {
float: left;
margin: 0 0 0.5em 0;
width: 75%;
}
h2 {
clear: left;
}
#generated {
float: right;
text-align: right;
font-size: 0.9em;
white-space: nowrap;
}
/* Documentation headers */
.doc > h2 {
font-size: 1.2em;
}
.doc > h3 {
font-size: 1.1em;
}
.doc > h4 {
font-size: 1.0em;
}
/* Status text colors -- !important allows using them in links */
.fail {
color: #f33 !important;
font-weight: bold;
}
.pass {
color: #393 !important;
}
.label {
padding: 2px 5px;
font-size: 0.75em;
letter-spacing: 1px;
white-space: nowrap;
color: black;
background-color: #ddd;
border-radius: 3px;
}
.label.debug, .label.trace, .label.error, .label.keyword {
letter-spacing: 0;
}
.label.error, .label.fail, .label.pass, .label.warn {
color: #fff !important;
font-weight: bold;
}
.label.error, .label.fail {
background-color: #d9534f;
}
.label.pass {
background-color: #5cb85c;
}
.label.warn {
background-color: #ec971f;
}
/* Top right header */
#top-right-header {
position: fixed;
top: 0;
right: 0;
z-index: 1000;
width: 12em;
text-align: center;
}
#report-or-log-link a {
display: block;
background: black;
color: white;
text-decoration: none;
font-weight: bold;
letter-spacing: 0.1em;
padding: 0.3em 0;
border-bottom-left-radius: 4px;
}
#report-or-log-link a:hover {
color: #ddd;
}
#log-level-selector {
padding: 0.3em 0;
font-size: 0.9em;
border-bottom-left-radius: 4px;
background: #ddd;
}
/* Statistics table */
.statistics {
width: 65em;
border-collapse: collapse;
empty-cells: show;
margin-bottom: 1em;
}
.statistics tr:hover {
background: #f4f4f4;
cursor: pointer;
}
.statistics th, .statistics td {
border: 1px solid #ccc;
padding: 0.1em 0.3em;
}
.statistics th {
background-color: #ddd;
padding: 0.2em 0.3em;
}
.statistics td {
vertical-align: middle;
}
.stats-col-stat {
width: 4.5em;
text-align: center;
}
.stats-col-elapsed {
width: 5.5em;
text-align: center;
}
.stats-col-graph {
width: 9em;
}
th.stats-col-graph:hover {
cursor: default;
}
.stat-name {
float: left;
}
.stat-name a, .stat-name span {
font-weight: bold;
}
.tag-links {
font-size: 0.9em;
float: right;
margin-top: 0.05em;
}
.tag-links span {
margin-left: 0.2em;
}
/* Statistics graph */
.graph, .empty-graph {
border: 1px solid #ccc;
width: auto;
height: 7px;
padding: 0;
background: #f33;
}
.empty-graph {
background: #eee;
}
.pass-bar, .fail-bar {
float: left;
height: 100%;
}
.pass-bar {
background: #1d4;
}
/* Tablesorter - adapted from provided Blue Skin */
.tablesorter-header {
background-image: url(data:image/gif;base64,R0lGODlhCwAJAIAAAH9/fwAAACH5BAEAAAEALAAAAAALAAkAAAIRjAOnBr3cnIr0WUjTrC9e9BQAOw==);
background-repeat: no-repeat;
background-position: center right;
cursor: pointer;
}
.tablesorter-header:hover {
background-color: #ccc;
}
.tablesorter-headerAsc {
background-image: url(data:image/gif;base64,R0lGODlhCwAJAKEAAAAAAH9/fwAAAAAAACH5BAEAAAIALAAAAAALAAkAAAIUlBWnFr3cnIr0WQOyBmvzp13CpxQAOw==);
background-color: #ccc !important;
}
.tablesorter-headerDesc {
background-image: url(data:image/gif;base64,R0lGODlhCwAJAKEAAAAAAH9/fwAAAAAAACH5BAEAAAIALAAAAAALAAkAAAIUlAWnBr3cnIr0WROyDmvzp13CpxQAOw==);
background-color: #ccc !important;
}
.sorter-false {
background-image: none;
cursor: default;
}
.sorter-false:hover {
background-color: #ddd;
}
</style>
<style media="all" type="text/css">
/* Icons are from Open Iconic <https://useiconic.com/open/>.
Licensed under the MIT License. */
/* Containers */
.suite, .test, #errors {
border: 1px solid #ccc;
padding: 0.3em 0.2em;
margin: 0.2em 0;
}
.test {
border-style: dashed;
}
#errors, .messages, .metadata {
width: 100%;
border-spacing: 0;
}
.children {
display: none;
margin-left: 1.4em;
}
.suite, .test, .keyword {
margin-left: -0.2em;
}
#s1, .suite > .children > .keyword {
margin-left: 0;
}
/* Suite, test and kw headers */
.element-header {
border: 1px solid transparent;
border-radius: 2px;
position: relative;
}
.element-header:hover {
cursor: pointer;
background-color: #eee;
border-color: #ccc;
}
.element-header-toggle {
position: absolute;
left: 3px;
top: 5px;
background-repeat: no-repeat;
background-position: center;
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAQAAABKxSfDAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfeCR0JChSkZz20AAAAGklEQVQI12NgQAKMDKzInP8IDhOqMk4G7AAANQwBE427PYUAAAAASUVORK5CYII=);
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCA4IDgiPgogIDxwYXRoIGQ9Ik0wIDB2Mmg4di0yaC04eiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAzKSIgLz4KPC9zdmc+), none;
height: 10px;
width: 10px;
background-size: 6px 6px;
border: 1px solid #ccc;
border-radius: 2px;
}
.closed > .element-header-toggle {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAQAAABKxSfDAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfeCR0JCDHdVYtxAAAAM0lEQVQI103MMQqAMBQFwVHyITaB3P+W1sKzSBC3mW6hRFw0pUB5DvF1bu9FN0RM3X/wAk98CUnvFTakAAAAAElFTkSuQmCC);
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCA4IDgiPgogIDxwYXRoIGQ9Ik0zIDB2M2gtM3YyaDN2M2gydi0zaDN2LTJoLTN2LTNoLTJ6IiAvPgo8L3N2Zz4=), none;
}
.element-header:hover > .element-header-toggle {
background-color: #ccc;
}
.element-header-right:hover ~ .element-header-toggle {
background-color: transparent;
}
.element-header-left {
padding: 3px 80px 3px 20px;
}
.element-header-right {
position: absolute;
right: 0;
top: 0;
padding: 3px;
cursor: default;
}
.name {
font-weight: bold;
}
.elapsed {
float: right;
color: #999;
padding-left: 1em;
}
.link {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAHlJREFUGJVtzrEJwmAQBtCn6ASuIKTIBhY2gmghBiJYB1udwk10B8FJbKMBcQFbtbkfJHrVwfu+4/idJR64Y9H7E3higj5O3S8Y44ApLnjhnXCNGhV2yNGggDJwiC02gavUbpDFvscRo4QdXOMKDHBufz3HLYKzNn4AbSkV3fncGQYAAAAASUVORK5CYII=);
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCA4IDgiPgogIDxwYXRoIGQ9Ik01Ljg4LjAzYy0uMTguMDEtLjM2LjAzLS41My4wOS0uMjcuMS0uNTMuMjUtLjc1LjQ3YS41LjUgMCAxIDAgLjY5LjY5Yy4xMS0uMTEuMjQtLjE3LjM4LS4yMi4zNS0uMTIuNzgtLjA3IDEuMDYuMjIuMzkuMzkuMzkgMS4wNCAwIDEuNDRsLTEuNSAxLjVjLS40NC40NC0uOC40OC0xLjA2LjQ3LS4yNi0uMDEtLjQxLS4xMy0uNDEtLjEzYS41LjUgMCAxIDAtLjUuODhzLjM0LjIyLjg0LjI1Yy41LjAzIDEuMi0uMTYgMS44MS0uNzhsMS41LTEuNWMuNzgtLjc4Ljc4LTIuMDQgMC0yLjgxLS4yOC0uMjgtLjYxLS40NS0uOTctLjUzLS4xOC0uMDQtLjM4LS4wNC0uNTYtLjAzem0tMiAyLjMxYy0uNS0uMDItMS4xOS4xNS0xLjc4Ljc1bC0xLjUgMS41Yy0uNzguNzgtLjc4IDIuMDQgMCAyLjgxLjU2LjU2IDEuMzYuNzIgMi4wNi40Ny4yNy0uMS41My0uMjUuNzUtLjQ3YS41LjUgMCAxIDAtLjY5LS42OWMtLjExLjExLS4yNC4xNy0uMzguMjItLjM1LjEyLS43OC4wNy0xLjA2LS4yMi0uMzktLjM5LS4zOS0xLjA0IDAtMS40NGwxLjUtMS41Yy40LS40Ljc1LS40NSAxLjAzLS40NC4yOC4wMS40Ny4wOS40Ny4wOWEuNS41IDAgMSAwIC40NC0uODhzLS4zNC0uMi0uODQtLjIyeiIKICAvPgo8L3N2Zz4=), none;
}
.expand {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAADtJREFUGJVjYCACKDAwMByA0ljFDjAwMPxnYGB4ABVQgLL/Q+VQBB6gseGmIivCkERXhFUSWRFOSawAAEl7E3uv1iMcAAAAAElFTkSuQmCC);
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCA4IDgiPgogIDxwYXRoIGQ9Ik0xLjUgMGwtMS41IDEuNSA0IDQgNC00LTEuNS0xLjUtMi41IDIuNS0yLjUtMi41eiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAxKSIgLz4KPC9zdmc+), none;
}
.collapse {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAAC5JREFUGJVjYCARNEAxTsn/UIyhCFkSQxG6ThQ+C5IpjWhG1yNb4YDFTdjEMAEACi8Q++9Y9TAAAAAASUVORK5CYII=);
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCA4IDgiPgogIDxwYXRoIGQ9Ik00IDBsLTQgNCAxLjUgMS41IDIuNS0yLjUgMi41IDIuNSAxLjUtMS41LTQtNHoiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDAgMSkiIC8+Cjwvc3ZnPg==), none;
}
.expand, .collapse, .link {
float: left;
display: block;
visibility: hidden;
margin: 0 4px;
height: 14px;
width: 14px;
background-size: 8px 8px;
background-repeat: no-repeat;
background-position: center;
border: 1px solid #ccc;
border-radius: 2px;
}
.link {
background-size: 10px 10px;
}
.element-header:hover a {
visibility: visible;
}
.expand:hover, .collapse:hover, .link:hover {
background-color: #ccc;
}
/* Messages and errors */
.messages .time, .messages .message {
font-family: monospace;
font-size: 1.1em;
}
#errors .message {
font-family: monospace;
font-size: 1.2em;
}
.message-row {
height: 20px;
}
.time {
width: 7.5em;
}
.error-time {
width: 11em;
font-size: 0.9em;
white-space: nowrap;
}
.level {
width: 5em;
text-align: center;
}
.select-message {
width: 24px;
}
.select-message > div {
float: right;
margin-right: 2px;
height: 16px;
width: 16px;
background-size: 12px 12px;
background-repeat: no-repeat;
background-position: center;
}
.message-row:hover .select-message div {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAQAAAD8fJRsAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAACxMAAAsTAQCanBgAAAAHdElNRQfeCR0MOzhWKZQOAAAASUlEQVQY032PsRHAIAwDX9BkicD+W8UMEqegAQJWKZ/+3sLZJhFGQEZzNaIa4ibh66En867VNaIeoP5WppNuIGoAlOm3g5VC1AdYeQv1BZPRSgAAAABJRU5ErkJggg==);
background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSI4IiBoZWlnaHQ9IjgiIHZpZXdCb3g9IjAgMCA4IDgiPgogIDxwYXRoIGQ9Ik0wIDB2MWg4di0xaC04em0wIDJ2MWg2di0xaC02em0wIDJ2MWg4di0xaC04em0wIDJ2MWg2di0xaC02eiIgLz4KPC9zdmc+), none;
border: 1px solid #ccc;
border-radius: 2px;
}
.select-message:hover div {
background-color: #ccc;
cursor: pointer;
}
/* Message tables - these MUST NOT be combined together because otherwise
dynamically altering them based on visible log level is not possible. */
.trace-message {
display: table;
}
.debug-message {
display: table;
}
/* Metadata */
.metadata th {
width: 12.5em;
text-align: left;
white-space: nowrap;
padding: 0;
}
.metadata td {
padding: 0.2em;
}
.keyword-metadata {
font-size: 0.9em;
}
/* Custom styles for statistics */
#total-stats tr:hover, #tag-stats tr:hover {
cursor: default;
}
</style>
<style media="print" type="text/css">
body {
background: white !important;
padding: 0;
font-size: 8pt;
}
a:link, a:visited {
color: black;
}
#header {
width: auto;
}
.details, .statistics {
width: 100%;
}
#generated-ago, #top-right-header, #normal-selector, #search-buttons,
.folding-button, .expand, .hidden, .details-col-toggle {
display: none;
}
.element-header-text, .children {
margin: 0;
}
#test-details {
border-collapse: collapse;
table-layout: auto;
}
#test-details th, #test-details td {
border: 1px solid black;
}
.details-col-header {
padding: 0;
}
#print-selector {
display: table-cell;
}
.tablesorter-header {
background-image: none;
background: #ddd !important;
}
</style>
<style media="all" type="text/css">
#javascript-disabled {
width: 600px;
margin: 100px auto 0 auto;
padding: 20px;
color: black;
border: 1px solid #ccc;
background: #eee;
}
#javascript-disabled h1 {
width: 100%;
float: none;
}
#javascript-disabled ul {
font-size: 1.2em;
}
#javascript-disabled li {
margin: 0.5em 0;
}
#javascript-disabled b {
font-style: italic;
}
</style>
<style media="all" type="text/css">
.doc > * {
margin: 0.7em 1em 0.1em 1em;
padding: 0;
}
.doc > p, .doc > h1, .doc > h2, .doc > h3, .doc > h4 {
margin: 0.7em 0 0.1em 0;
}
.doc > *:first-child {
margin-top: 0.1em;
}
.doc table {
border: 1px solid #ccc;
background: transparent;
border-collapse: collapse;
empty-cells: show;
font-size: 0.9em;
}
.doc table th, .doc table td {
border: 1px solid #ccc;
background: transparent;
padding: 0.1em 0.3em;
height: 1.2em;
}
.doc table th {
text-align: center;
letter-spacing: 0.1em;
}
.doc pre {
font-size: 1.1em;
letter-spacing: 0.05em;
background: #f4f4f4;
}
.doc code {
padding: 0 0.2em;
letter-spacing: 0.05em;
background: #eee;
}
.doc li {
list-style-position: inside;
list-style-type: square;
}
.doc img {
border: 1px solid #ccc;
}
.doc hr {
background: #ccc;
height: 1px;
border: 0;
}
</style>
<script type="text/javascript">
var LEVELS = {TRACE: 0, DEBUG: 1, INFO: 2, WARN: 3, FAIL: 4, NONE: 5};
function toggleSuite(suiteId) {
toggleElement(suiteId, ['keyword', 'suite', 'test']);
}
function toggleTest(testId) {
toggleElement(testId, ['keyword']);
}
function toggleKeyword(kwId) {
toggleElement(kwId, ['keyword', 'message']);
}
function toggleElement(elementId, childrenNames) {
var element = $('#' + elementId);
var children = element.children('.children');
children.toggle(100, '', function () {
element.children('.element-header').toggleClass('closed');
});
populateChildren(elementId, children, childrenNames);
}
function populateChildren(elementId, childElement, childrenNames) {
if (!childElement.hasClass('populated')) {
var element = window.testdata.findLoaded(elementId);
var callback = drawCallback(element, childElement, childrenNames);
element.callWhenChildrenReady(callback);
childElement.addClass('populated');
}
}
function drawCallback(element, childElement, childrenNames) {
return function () {
util.map(childrenNames, function (childName) {
var children = element[childName + 's']();
var template = childName + 'Template';
util.map(children, function (child) {
$.tmpl(template, child).appendTo(childElement);
});
});
}
}
function expandSuite(suite) {
if (suite.status == "PASS")
expandElement(suite);
else
expandCriticalFailed(suite);
}
function expandElement(item) {
var element = $('#' + item.id);
var children = element.children('.children');
// .css is faster than .show and .show w/ callback is terribly slow
children.css({'display': 'block'});
populateChildren(item.id, children, item.childrenNames);
element.children('.element-header').removeClass('closed');
}
function expandElementWithId(elementid) {
expandElement(window.testdata.findLoaded(elementid));
}
function expandCriticalFailed(element) {
if (element.status == "FAIL") {
window.elementsToExpand = [element];
window.expandDecider = function (e) {
return e.status == "FAIL" && (e.isCritical === undefined || e.isCritical);
};
expandRecursively();
}
}
function expandAll(elementId) {
window.elementsToExpand = [window.testdata.findLoaded(elementId)];
window.expandDecider = function () { return true; };
expandRecursively();
}
function expandRecursively() {
if (!window.elementsToExpand.length)
return;
var element = window.elementsToExpand.pop();
if (!element || elementHiddenByUser(element.id)) {
window.elementsToExpand = [];
return;
}
expandElement(element);
element.callWhenChildrenReady(function () {
var children = element.children();
for (var i = children.length-1; i >= 0; i--) {
if (window.expandDecider(children[i]))
window.elementsToExpand.push(children[i]);
}
if (window.elementsToExpand.length)
setTimeout(expandRecursively, 0);
});
}
function elementHiddenByUser(id) {
var element = $('#' + id);
return !element.is(":visible");
}
function collapseAll(id) {
var element = $('#' + id);
element.find('.children').css({'display': 'none'});
element.find('.element-header').addClass('closed');
}
function logLevelSelected(level) {
var anchors = getViewAnchorElements();
setMessageVisibility(level);
scrollToShortestVisibleAnchorElement(anchors);
}
function getViewAnchorElements() {
var elem1 = $(document.elementFromPoint(100, 0));
var elem2 = $(document.elementFromPoint(100, 20));
return [elem1, elem2];
}
function scrollToShortestVisibleAnchorElement(anchors) {
anchors = util.map(anchors, closestVisibleParent);
var shortest = anchors[0];
for (var i = 1; i < anchors.length; i++)
if (shortest.height() > anchors[i].height())
shortest = anchors[i];
shortest.get()[0].scrollIntoView(true);
}
function setMessageVisibility(level) {
level = parseInt(level);
changeClassDisplay(".trace-message", level <= LEVELS.TRACE);
changeClassDisplay(".debug-message", level <= LEVELS.DEBUG);
changeClassDisplay(".info-message", level <= LEVELS.INFO);
}
function closestVisibleParent(elem) {
while (!elem.is(":visible"))
elem = elem.parent();
return elem;
}
function changeClassDisplay(clazz, visible) {
var styles = document.styleSheets;
for (var i = 0; i < styles.length; i++) {
var rules = getRules(styles[i]);
if (rules === null)
continue;
for (var j = 0; j < rules.length; j++)
if (rules[j].selectorText === clazz)
rules[j].style.display = visible ? "table" : "none";
}
}
function getRules(style) {
// With Chrome external CSS files seem to have only null roles and with
// Firefox accessing rules can result to security error.
// Neither of these are a problem on with generated logs.
try {
return style.cssRules || style.rules;
} catch (e) {
return null;
}
}
function selectMessage(parentId) {
var element = $('#' + parentId).find('.message').get(0);
selectText(element);
}
function selectText(element) {
// Based on http://stackoverflow.com/questions/985272
var range, selection;
if (document.body.createTextRange) { // IE 8
range = document.body.createTextRange();
range.moveToElementText(element);
range.select();
} else if (window.getSelection) { // Others
selection = window.getSelection();
range = document.createRange();
range.selectNodeContents(element);
selection.removeAllRanges();
selection.addRange(range);
}
}
function LogLevelController(minLevel, defaultLevel) {
minLevel = LEVELS[minLevel];
defaultLevel = LEVELS[defaultLevel];
function showLogLevelSelector() {
return minLevel < LEVELS.INFO;
}
function defaultLogLevel() {
if (minLevel > defaultLevel)
return minLevel;
return defaultLevel;
}
function showTrace() {
return minLevel == LEVELS.TRACE;
}
return {
showLogLevelSelector: showLogLevelSelector,
defaultLogLevel: defaultLogLevel,
showTrace: showTrace
};
}
</script>
<script type="text/javascript">
/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */
!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(e,t){"use strict";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return"function"==typeof t&&"number"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement("script");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[c.call(e)]||"object":typeof e}var b="3.3.1",w=function(e,t){return new w.fn.init(e,t)},T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;w.fn=w.prototype={jquery:"3.3.1",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:"jQuery"+("3.3.1"+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==c.call(e))&&(!(t=i(e))||"function"==typeof(n=f.call(t,"constructor")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,"string"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),"function"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function C(e){var t=!!e&&"length"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&("array"===n||0===t||"number"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b="sizzle"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-
</script>
<script type="text/javascript">
/*
* jQuery Templates Plugin 1.0.0pre
* http://github.com/jquery/jquery-tmpl
* Requires jQuery 1.4.2
*
* Copyright Software Freedom Conservancy, Inc.
* Dual licensed under the MIT or GPL Version 2 licenses.
* http://jquery.org/license
*/
(function(a){var r=a.fn.domManip,d="_tmplitem",q=/^[^<]*(<[\w\W]+>)[^>]*$|\{\{\! /,b={},f={},e,p={key:0,data:{}},i=0,c=0,l=[];function g(g,d,h,e){var c={data:e||(e===0||e===false)?e:d?d.data:{},_wrap:d?d._wrap:null,tmpl:null,parent:d||null,nodes:[],calls:u,nest:w,wrap:x,html:v,update:t};g&&a.extend(c,g,{nodes:[],parent:d});if(h){c.tmpl=h;c._ctnt=c._ctnt||c.tmpl(a,c);c.key=++i;(l.length?f:b)[i]=c}return c}a.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(f,d){a.fn[f]=function(n){var g=[],i=a(n),k,h,m,l,j=this.length===1&&this[0].parentNode;e=b||{};if(j&&j.nodeType===11&&j.childNodes.length===1&&i.length===1){i[d](this[0]);g=this}else{for(h=0,m=i.length;h<m;h++){c=h;k=(h>0?this.clone(true):this).get();a(i[h])[d](k);g=g.concat(k)}c=0;g=this.pushStack(g,f,i.selector)}l=e;e=null;a.tmpl.complete(l);return g}});a.fn.extend({tmpl:function(d,c,b){return a.tmpl(this[0],d,c,b)},tmplItem:function(){return a.tmplItem(this[0])},template:function(b){return a.template(b,this[0])},domManip:function(d,m,k){if(d[0]&&a.isArray(d[0])){var g=a.makeArray(arguments),h=d[0],j=h.length,i=0,f;while(i<j&&!(f=a.data(h[i++],"tmplItem")));if(f&&c)g[2]=function(b){a.tmpl.afterManip(this,b,k)};r.apply(this,g)}else r.apply(this,arguments);c=0;!e&&a.tmpl.complete(b);return this}});a.extend({tmpl:function(d,h,e,c){var i,k=!c;if(k){c=p;d=a.template[d]||a.template(null,d);f={}}else if(!d){d=c.tmpl;b[c.key]=c;c.nodes=[];c.wrapped&&n(c,c.wrapped);return a(j(c,null,c.tmpl(a,c)))}if(!d)return[];if(typeof h==="function")h=h.call(c||{});e&&e.wrapped&&n(e,e.wrapped);i=a.isArray(h)?a.map(h,function(a){return a?g(e,c,d,a):null}):[g(e,c,d,h)];return k?a(j(c,null,i)):i},tmplItem:function(b){var c;if(b instanceof a)b=b[0];while(b&&b.nodeType===1&&!(c=a.data(b,"tmplItem"))&&(b=b.parentNode));return c||p},template:function(c,b){if(b){if(typeof b==="string")b=o(b);else if(b instanceof a)b=b[0]||{};if(b.nodeType)b=a.data(b,"tmpl")||a.data(b,"tmpl",o(b.innerHTML));return typeof c==="string"?(a.template[c]=b):b}return c?typeof c!=="string"?a.template(null,c):a.template[c]||a.template(null,q.test(c)?c:a(c)):null},encode:function(a){return(""+a).split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;").split('"').join("&#34;").split("'").join("&#39;")}});a.extend(a.tmpl,{tag:{tmpl:{_default:{$2:"null"},open:"if($notnull_1){__=__.concat($item.nest($1,$2));}"},wrap:{_default:{$2:"null"},open:"$item.calls(__,$1,$2);__=[];",close:"call=$item.calls();__=call._.concat($item.wrap(call,__));"},each:{_default:{$2:"$index, $value"},open:"if($notnull_1){$.each($1a,function($2){with(this){",close:"}});}"},"if":{open:"if(($notnull_1) && $1a){",close:"}"},"else":{_default:{$1:"true"},open:"}else if(($notnull_1) && $1a){"},html:{open:"if($notnull_1){__.push($1a);}"},"=":{_default:{$1:"$data"},open:"if($notnull_1){__.push($.encode($1a));}"},"!":{open:""}},complete:function(){b={}},afterManip:function(f,b,d){var e=b.nodeType===11?a.makeArray(b.childNodes):b.nodeType===1?[b]:[];d.call(f,b);m(e);c++}});function j(e,g,f){var b,c=f?a.map(f,function(a){return typeof a==="string"?e.key?a.replace(/(<\w+)(?=[\s>])(?![^>]*_tmplitem)([^>]*)/g,"$1 "+d+'="'+e.key+'" $2'):a:j(a,e,a._ctnt)}):e;if(g)return c;c=c.join("");c.replace(/^\s*([^<\s][^<]*)?(<[\w\W]+>)([^>]*[^>\s])?\s*$/,function(f,c,e,d){b=a(e).get();m(b);if(c)b=k(c).concat(b);if(d)b=b.concat(k(d))});return b?b:k(c)}function k(c){var b=document.createElement("div");b.innerHTML=c;return a.makeArray(b.childNodes)}function o(b){return new Function("jQuery","$item","var $=jQuery,call,__=[],$data=$item.data;with($data){__.push('"+a.trim(b).replace(/([\\'])/g,"\\$1").replace(/[\r\t\n]/g," ").replace(/\$\{([^\}]*)\}/g,"{{= $1}}").replace(/\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g,function(m,l,k,g,b,c,d){var j=a.tmpl.tag[k],i,e,f;if(!j)throw"Unknown template tag: "+k;i=j._default||[];if(c&&!/\w$/.test(b)){b+=c;c=""}if(b){b=h(b);d=d?","+h(d)+")":c?")":"";e=c?b.indexOf(".")>-1?b+h(c):"("+b+").call($item"+d:b;f=c?e
</script>
<script type="text/javascript">
!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&"object"==typeof module.exports?module.exports=e(require("jquery")):e(jQuery)}(function(e){return function(e){"use strict";var t=e.tablesorter={version:"2.30.5",parsers:[],widgets:[],defaults:{theme:"default",widthFixed:!1,showProcessing:!1,headerTemplate:"{content}",onRenderTemplate:null,onRenderHeader:null,cancelSelection:!0,tabIndex:!0,dateFormat:"mmddyyyy",sortMultiSortKey:"shiftKey",sortResetKey:"ctrlKey",usNumberFormat:!0,delayInit:!1,serverSideSorting:!1,resort:!0,headers:{},ignoreCase:!0,sortForce:null,sortList:[],sortAppend:null,sortStable:!1,sortInitialOrder:"asc",sortLocaleCompare:!1,sortReset:!1,sortRestart:!1,emptyTo:"bottom",stringTo:"max",duplicateSpan:!0,textExtraction:"basic",textAttribute:"data-text",textSorter:null,numberSorter:null,initWidgets:!0,widgetClass:"widget-{name}",widgets:[],widgetOptions:{zebra:["even","odd"]},initialized:null,tableClass:"",cssAsc:"",cssDesc:"",cssNone:"",cssHeader:"",cssHeaderRow:"",cssProcessing:"",cssChildRow:"tablesorter-childRow",cssInfoBlock:"tablesorter-infoOnly",cssNoSort:"tablesorter-noSort",cssIgnoreRow:"tablesorter-ignoreRow",cssIcon:"tablesorter-icon",cssIconNone:"",cssIconAsc:"",cssIconDesc:"",cssIconDisabled:"",pointerClick:"click",pointerDown:"mousedown",pointerUp:"mouseup",selectorHeaders:"> thead th, > thead td",selectorSort:"th, td",selectorRemove:".remove-me",debug:!1,headerList:[],empties:{},strings:{},parsers:[],globalize:0,imgAttr:0},css:{table:"tablesorter",cssHasChild:"tablesorter-hasChildRow",childRow:"tablesorter-childRow",colgroup:"tablesorter-colgroup",header:"tablesorter-header",headerRow:"tablesorter-headerRow",headerIn:"tablesorter-header-inner",icon:"tablesorter-icon",processing:"tablesorter-processing",sortAsc:"tablesorter-headerAsc",sortDesc:"tablesorter-headerDesc",sortNone:"tablesorter-headerUnSorted"},language:{sortAsc:"Ascending sort applied, ",sortDesc:"Descending sort applied, ",sortNone:"No sort applied, ",sortDisabled:"sorting is disabled",nextAsc:"activate to apply an ascending sort",nextDesc:"activate to apply a descending sort",nextNone:"activate to remove the sort"},regex:{templateContent:/\{content\}/g,templateIcon:/\{icon\}/g,templateName:/\{name\}/i,spaces:/\s+/g,nonWord:/\W/g,formElements:/(input|select|button|textarea)/i,chunk:/(^([+\-]?(?:\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)?$|^0x[0-9a-f]+$|\d+)/gi,chunks:/(^\\0|\\0$)/,hex:/^0x[0-9a-f]+$/i,comma:/,/g,digitNonUS:/[\s|\.]/g,digitNegativeTest:/^\s*\([.\d]+\)/,digitNegativeReplace:/^\s*\(([.\d]+)\)/,digitTest:/^[\-+(]?\d+[)]?$/,digitReplace:/[,.'"\s]/g},string:{max:1,min:-1,emptymin:1,emptymax:-1,zero:0,none:0,"null":0,top:!0,bottom:!1},keyCodes:{enter:13},dates:{},instanceMethods:{},setup:function(r,o){if(r&&r.tHead&&0!==r.tBodies.length&&!0!==r.hasInitialized){var s="",a=e(r),n=e.metadata;r.hasInitialized=!1,r.isProcessing=!0,r.config=o,e.data(r,"tablesorter",o),t.debug(o,"core")&&(console[console.group?"group":"log"]("Initializing tablesorter v"+t.version),e.data(r,"startoveralltimer",new Date)),o.supportsDataObject=function(e){return e[0]=parseInt(e[0],10),e[0]>1||1===e[0]&&parseInt(e[1],10)>=4}(e.fn.jquery.split(".")),o.emptyTo=o.emptyTo.toLowerCase(),o.stringTo=o.stringTo.toLowerCase(),o.last={sortList:[],clickedIndex:-1},/tablesorter\-/.test(a.attr("class"))||(s=""!==o.theme?" tablesorter-"+o.theme:""),o.namespace?o.namespace="."+o.namespace.replace(t.regex.nonWord,""):o.namespace=".tablesorter"+Math.random().toString(16).slice(2),o.table=r,o.$table=a.addClass(t.css.table+" "+o.tableClass+s+" "+o.namespace.slice(1)).attr("role","grid"),o.$headers=a.find(o.selectorHeaders),o.$table.children().children("tr").attr("role","row"),o.$tbodies=a.children("tbody:not(."+o.cssInfoBlock+")").attr({"aria-live":"polite","aria-relevant":"all"}),o.$table.children("caption").length&&((s=o.$table.children("caption")[0]).id||(s.id=o.namespace.slice(1)+"caption"),o.$table.attr("aria-labelledby",s.id)),o.widgetInit={},o.textExtraction=o.$table.attr("data-text-extraction")||o.textExtraction||"basic
</script>
<script type="text/javascript">
/*
Copyright 2008-2013
Matthias Ehmann,
Michael Gerhaeuser,
Carsten Miller,
Bianca Valentin,
Alfred Wassermann,
Peter Wilfahrt
Dual licensed under the Apache License Version 2.0, or LGPL Version 3 licenses.
You should have received a copy of the GNU Lesser General Public License
along with JSXCompressor. If not, see <http://www.gnu.org/licenses/>.
You should have received a copy of the Apache License along with JSXCompressor.
If not, see <http://www.apache.org/licenses/>.
*/
(function(){var e,r,n;(function(t){function o(e,r){return C.call(e,r)}function i(e,r){var n,t,o,i,a,u,c,f,s,l,p=r&&r.split("/"),h=k.map,d=h&&h["*"]||{};if(e&&"."===e.charAt(0))if(r){for(p=p.slice(0,p.length-1),e=p.concat(e.split("/")),f=0;e.length>f;f+=1)if(l=e[f],"."===l)e.splice(f,1),f-=1;else if(".."===l){if(1===f&&(".."===e[2]||".."===e[0]))break;f>0&&(e.splice(f-1,2),f-=2)}e=e.join("/")}else 0===e.indexOf("./")&&(e=e.substring(2));if((p||d)&&h){for(n=e.split("/"),f=n.length;f>0;f-=1){if(t=n.slice(0,f).join("/"),p)for(s=p.length;s>0;s-=1)if(o=h[p.slice(0,s).join("/")],o&&(o=o[t])){i=o,a=f;break}if(i)break;!u&&d&&d[t]&&(u=d[t],c=f)}!i&&u&&(i=u,a=c),i&&(n.splice(0,a,i),e=n.join("/"))}return e}function a(e,r){return function(){return h.apply(t,v.call(arguments,0).concat([e,r]))}}function u(e){return function(r){return i(r,e)}}function c(e){return function(r){b[e]=r}}function f(e){if(o(m,e)){var r=m[e];delete m[e],y[e]=!0,p.apply(t,r)}if(!o(b,e)&&!o(y,e))throw Error("No "+e);return b[e]}function s(e){var r,n=e?e.indexOf("!"):-1;return n>-1&&(r=e.substring(0,n),e=e.substring(n+1,e.length)),[r,e]}function l(e){return function(){return k&&k.config&&k.config[e]||{}}}var p,h,d,g,b={},m={},k={},y={},C=Object.prototype.hasOwnProperty,v=[].slice;d=function(e,r){var n,t=s(e),o=t[0];return e=t[1],o&&(o=i(o,r),n=f(o)),o?e=n&&n.normalize?n.normalize(e,u(r)):i(e,r):(e=i(e,r),t=s(e),o=t[0],e=t[1],o&&(n=f(o))),{f:o?o+"!"+e:e,n:e,pr:o,p:n}},g={require:function(e){return a(e)},exports:function(e){var r=b[e];return r!==void 0?r:b[e]={}},module:function(e){return{id:e,uri:"",exports:b[e],config:l(e)}}},p=function(e,r,n,i){var u,s,l,p,h,k,C=[];if(i=i||e,"function"==typeof n){for(r=!r.length&&n.length?["require","exports","module"]:r,h=0;r.length>h;h+=1)if(p=d(r[h],i),s=p.f,"require"===s)C[h]=g.require(e);else if("exports"===s)C[h]=g.exports(e),k=!0;else if("module"===s)u=C[h]=g.module(e);else if(o(b,s)||o(m,s)||o(y,s))C[h]=f(s);else{if(!p.p)throw Error(e+" missing "+s);p.p.load(p.n,a(i,!0),c(s),{}),C[h]=b[s]}l=n.apply(b[e],C),e&&(u&&u.exports!==t&&u.exports!==b[e]?b[e]=u.exports:l===t&&k||(b[e]=l))}else e&&(b[e]=n)},e=r=h=function(e,r,n,o,i){return"string"==typeof e?g[e]?g[e](r):f(d(e,r).f):(e.splice||(k=e,r.splice?(e=r,r=n,n=null):e=t),r=r||function(){},"function"==typeof n&&(n=o,o=i),o?p(t,e,r,n):setTimeout(function(){p(t,e,r,n)},4),h)},h.config=function(e){return k=e,k.deps&&h(k.deps,k.callback),h},n=function(e,r,n){r.splice||(n=r,r=[]),o(b,e)||o(m,e)||(m[e]=[e,r,n])},n.amd={jQuery:!0}})(),n("../node_modules/almond/almond",function(){}),n("jxg",[],function(){var e={};return"object"!=typeof JXG||JXG.extend||(e=JXG),e.extend=function(e,r,n,t){var o,i;n=n||!1,t=t||!1;for(o in r)(!n||n&&r.hasOwnProperty(o))&&(i=t?o.toLowerCase():o,e[i]=r[o])},e.extend(e,{boards:{},readers:{},elements:{},registerElement:function(e,r){e=e.toLowerCase(),this.elements[e]=r},registerReader:function(e,r){var n,t;for(n=0;r.length>n;n++)t=r[n].toLowerCase(),"function"!=typeof this.readers[t]&&(this.readers[t]=e)},shortcut:function(e,r){return function(){return e[r].apply(this,arguments)}},getRef:function(e,r){return e.select(r)},getReference:function(e,r){return e.select(r)},debugInt:function(){var e,r;for(e=0;arguments.length>e;e++)r=arguments[e],"object"==typeof window&&window.console&&console.log?console.log(r):"object"==typeof document&&document.getElementById("debug")&&(document.getElementById("debug").innerHTML+=r+"<br/>")},debugWST:function(){var r=Error();e.debugInt.apply(this,arguments),r&&r.stack&&(e.debugInt("stacktrace"),e.debugInt(r.stack.split("\n").slice(1).join("\n")))},debugLine:function(){var r=Error();e.debugInt.apply(this,arguments),r&&r.stack&&e.debugInt("Called from",r.stack.split("\n").slice(2,3).join("\n"))},debug:function(){e.debugInt.apply(this,arguments)}}),e}),n("utils/zip",["jxg"],function(e){var r=[0,128,64,192,32,160,96,224,16,144,80,208,48,176,112,240,8,136,72,200,40,168,104,232,24,152,88,216,56,184,120,248,4,132,68,196,36,164,100,228,20,148,84,212,52,180,116,244,12,140,76,204,44,172,108,236,28,156,92,220,60,188,124,252,2,130,66,194,
</script>
<script type="text/javascript">
window.fileLoading = (function () {
var fileLoadingCallbacks = {};
var timestamp = new Date().getTime();
function loadKeywordsFile(filename, callback) {
fileLoadingCallbacks[filename] = callback;
var script = document.createElement('script');
script.type = 'text/javascript';
// timestamp as an argument to prevent browsers from caching scripts
// see: http://stackoverflow.com/questions/866619/how-to-force-ie-to-reload-javascript
script.src = filename+'?time='+timestamp;
document.getElementsByTagName("head")[0].appendChild(script);
}
function getCallbackHandlerForKeywords(parent) {
var callableList = [];
return function (callable) {
if (!parent.isChildrenLoaded) {
callableList.push(callable);
if (callableList.length == 1) {
loadKeywordsFile(parent.childFileName, function () {
parent.isChildrenLoaded = true;
for (var i = 0; i < callableList.length; i++) {
callableList[i]();
}
});
}
} else {
callable();
}
}
}
function notifyFileLoaded(filename) {
fileLoadingCallbacks[filename]();
}
return {
getCallbackHandlerForKeywords: getCallbackHandlerForKeywords,
notify: notifyFileLoaded
}
}());
</script>
<script type="text/javascript">
window.model = (function () {
function Suite(data) {
var suite = createModelObject(data);
suite.source = data.source;
suite.relativeSource = data.relativeSource;
suite.fullName = data.parent ? data.parent.fullName + '.' + data.name : data.name;
setStats(suite, data.statistics);
suite.metadata = data.metadata;
suite.populateKeywords = createIterablePopulator('Keyword');
suite.populateTests = createIterablePopulator('Test');
suite.populateSuites = createIterablePopulator('Suite');
suite.childrenNames = ['keyword', 'suite', 'test'];
suite.callWhenChildrenReady = function (callable) { callable(); };
suite.message = data.message;
suite.children = function () {
return suite.keywords().concat(suite.tests()).concat(suite.suites());
};
suite.searchTests = function (predicate) {
var tests = [];
var suites = this.suites();
for (var i in suites)
tests = tests.concat(suites[i].searchTests(predicate));
return tests.concat(util.filter(this.tests(), predicate));
};
suite.searchTestsInSuite = function (pattern, matcher) {
if (!matcher)
matcher = util.Matcher(pattern);
if (matcher.matchesAny([suite.fullName, suite.name]))
return suite.allTests();
var tests = [];
var suites = this.suites();
for (var i in suites)
tests = tests.concat(suites[i].searchTestsInSuite(pattern, matcher));
return tests;
};
suite.searchTestsByTag = function (tag) {
return suite.searchTests(function (test) {
if (tag.info == "critical" || tag.info == "non-critical")
return containsTagPattern(test.tags, tag.label);
if (tag.combined)
return containsTagPattern(test.tags, tag.combined);
return containsTag(test.tags, tag.label);
});
};
suite.findSuiteByName = function (name) {
return findSuiteByName(suite, name);
};
suite.allTests = function () {
return suite.searchTests(function (test) {
return true;
});
};
suite.criticalTests = function () {
return suite.searchTests(function (test) {
return test.isCritical;
});
};
return suite;
}
function containsTag(testTags, tagname) {
testTags = util.map(testTags, util.normalize);
return util.contains(testTags, util.normalize(tagname));
}
function containsTagPattern(testTags, pattern) {
var patterns;
if (pattern.indexOf('NOT') != -1) {
patterns = pattern.split('NOT');
if (!util.normalize(patterns[0]))
return util.all(util.map(patterns.slice(1), function (p) {
return !containsTagPattern(testTags, p);
}));
return containsTagPattern(testTags, patterns[0]) &&
util.all(util.map(patterns.slice(1), function (p) {
return !containsTagPattern(testTags, p);
}));
}
if (pattern.indexOf('OR') != -1) {
patterns = pattern.split('OR');
return util.any(util.map(patterns, function (p) {
return containsTagPattern(testTags, p);
}));
}
if (pattern.indexOf('AND') != -1) {
patterns = pattern.split('AND');
return util.all(util.map(patterns, function (p) {
return containsTagPattern(testTags, p);
}));
}
return util.Matcher(pattern).matchesAny(testTags);
}
function findSuiteByName(suite, name) {
if (suite.fullName == name)
return suite;
var subSuites = suite.suites();
for (var i in subSuites) {
var match = findSuiteByName(subSuites[i], name);
if (match)
return match;
}
return null;
}
function setStats(suite, stats) {
for (var name in stats) {
suite[name] = stats[name];
}
}
function createModelObject(data) {
return {
name: data.name,
doc: data.doc,
status: data.status,
times: data.times,
id: data.parent ? data.parent.id + '-' + data.id : data.id
};
}
function Test(data) {
var test = createModelObject(data);
test.fullName = data.parent.fullName + '.' + test.name;
test.formatParentName = function () { return util.formatParentName(test); };
test.timeout = data.timeout;
test.populateKeywords = createIterablePopulator('Keyword');
test.childrenNames = ['keyword'];
test.isChildrenLoaded = data.isChildrenLoaded;
test.callWhenChildrenReady = window.fileLoading.getCallbackHandlerForKeywords(test);
test.children = function () {
if (test.isChildrenLoaded)
return test.keywords();
};
test.isCritical = data.isCritical;
test.tags = data.tags;
test.message = data.message;
test.matchesTagPattern = function (pattern) {
return containsTagPattern(test.tags, pattern);
};
test.matchesNamePattern = function (pattern) {
return util.Matcher(pattern).matchesAny([test.name, test.fullName]);
};
return test;
}
function Keyword(data) {
var kw = createModelObject(data);
kw.libname = data.libname;
kw.type = data.type;
kw.arguments = data.args;
kw.assign = data.assign + (data.assign ? ' =' : '');
kw.tags = data.tags;
kw.timeout = data.timeout;
kw.populateMessages = createIterablePopulator('Message');
kw.populateKeywords = createIterablePopulator('Keyword');
kw.childrenNames = ['keyword', 'message'];
kw.isChildrenLoaded = data.isChildrenLoaded;
kw.callWhenChildrenReady = window.fileLoading.getCallbackHandlerForKeywords(kw);
kw.children = function () {
if (kw.isChildrenLoaded)
return kw.keywords();
};
return kw;
}
function Message(level, date, text, link) {
return {
level: level,
time: util.timeFromDate(date),
date: util.dateFromDate(date),
text: text,
link: link
};
}
function Times(timedata) {
var start = timedata[0];
var end = timedata[1];
var elapsed = timedata[2];
return {
elapsedMillis: elapsed,
elapsedTime: util.formatElapsed(elapsed),
startTime: util.dateTimeFromDate(start),
endTime: util.dateTimeFromDate(end)
};
}
function createIterablePopulator(name) {
return function (populator) {
populateIterable(this, name, populator);
};
}
function populateIterable(obj, name, populator) {
name = name.toLowerCase() + 's';
obj[name] = createGetAllFunction(populator.numberOfItems, populator.creator);
}
function createGetAllFunction(numberOfElements, creator) {
var cached = null;
return function () {
if (cached === null) {
cached = [];
for (var i = 0; i < numberOfElements(); i++) {
cached.push(creator(i));
}
}
return cached;
};
}
return {
Suite: Suite,
Test: Test,
Keyword: Keyword,
Message: Message,
Times: Times,
containsTag: containsTag, // Exposed for tests
containsTagPattern: containsTagPattern // Exposed for tests
};
}());
window.stats = (function () {
function Statistics(totalElems, tagElems, suiteElems) {
return {total: util.map(totalElems, totalStatElem),
tag: util.map(tagElems, tagStatElem),
suite: util.map(suiteElems, suiteStatElem)};
}
function statElem(stat) {
stat.total = stat.pass + stat.fail;
var percents = calculatePercents(stat.total, stat.pass, stat.fail);
stat.passPercent = percents[0];
stat.failPercent = percents[1];
var widths = calculateWidths(stat.passPercent, stat.failPercent);
stat.passWidth = widths[0];
stat.failWidth = widths[1];
return stat;
}
function totalStatElem(data) {
var stat = statElem(data);
stat.type = stat.label == 'Critical Tests' ? 'critical' : 'all';
return stat;
}
function tagStatElem(data) {
var stat = statElem(data);
stat.links = parseLinks(stat.links);
return stat;
}
function suiteStatElem(data) {
var stat = statElem(data);
stat.fullName = stat.label;
stat.formatParentName = function () { return util.formatParentName(stat); };
return stat;
}
function parseLinks(linksData) {
if (!linksData)
return [];
return util.map(linksData.split(':::'), function (link) {
var index = link.indexOf(':');
return {title: link.slice(0, index), url: link.slice(index+1)};
});
}
function calculatePercents(total, passed, failed) {
if (total == 0)
return [0.0, 0.0];
var pass = 100.0 * passed / total;
var fail = 100.0 * failed / total;
if (pass > 0 && pass < 0.1)
return [0.1, 99.9];
if (fail > 0 && fail < 0.1)
return [99.9, 0.1];
return [Math.round(pass*10)/10, Math.round(fail*10)/10];
}
function calculateWidths(num1, num2) {
if (num1 + num2 == 0)
return [0.0, 0.0];
// Make small percentages better visible
if (num1 > 0 && num1 < 1)
return [1.0, 99.0];
if (num2 > 0 && num2 < 1)
return [99.0, 1.0];
// Handle situation where both are rounded up
while (num1 + num2 > 100) {
if (num1 > num2)
num1 -= 0.1;
if (num2 > num1)
num2 -= 0.1;
}
return [num1, num2];
}
return {
Statistics: Statistics
};
}());
</script>
<script type="text/javascript">
window.util = function () {
function map(elems, func) {
var ret = [];
for (var i = 0, len = elems.length; i < len; i++) {
ret[i] = func(elems[i]);
}
return ret;
}
function filter(elems, predicate) {
var ret = [];
for (var i = 0, len = elems.length; i < len; i++) {
if (predicate(elems[i]))
ret.push(elems[i]);
}
return ret;
}
function all(elems) {
for (var i = 0, len = elems.length; i < len; i++) {
if (!elems[i])
return false;
}
return true;
}
function any(elems) {
for (var i = 0, len = elems.length; i < len; i++) {
if (elems[i])
return elems[i];
}
return false;
}
function contains(elems, e) {
for (var i = 0, len = elems.length; i < len; i++) {
if (elems[i] == e)
return true;
}
return false;
}
function last(items) {
return items[items.length-1];
}
function unescape(string) {
return string.replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&amp;/g, '&');
}
function escape(string) {
return string.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
}
function normalize(string) {
return string.toLowerCase().replace(/ /g, '').replace(/_/g, '');
}
function regexpEscape(string) {
return string.replace(/[-[\]{}()+?*.,\\^$|#]/g, "\\$&");
}
function Matcher(pattern) {
pattern = regexpEscape(normalize(pattern));
var rePattern = '^' + pattern.replace(/\\\?/g, '.').replace(/\\\*/g, '[\\s\\S]*') + '$';
var regexp = new RegExp(rePattern);
function matches(string) {
return regexp.test(normalize(string));
}
return {
matches: matches,
matchesAny: function (strings) {
for (var i = 0, len = strings.length; i < len; i++)
if (matches(strings[i]))
return true;
return false;
}
};
}
function formatParentName(item) {
var parentName = item.fullName.slice(0, item.fullName.length - item.name.length);
return parentName.replace(/\./g, ' . ');
}
function timeFromDate(date) {
if (!date)
return 'N/A';
return formatTime(date.getHours(), date.getMinutes(),
date.getSeconds(), date.getMilliseconds());
}
function dateFromDate(date) {
if (!date)
return 'N/A';
return padTo(date.getFullYear(), 4) +
padTo(date.getMonth() + 1, 2) +
padTo(date.getDate(), 2);
}
function dateTimeFromDate(date) {
if (!date)
return 'N/A';
return dateFromDate(date) + ' ' + timeFromDate(date);
}
function formatTime(hours, minutes, seconds, milliseconds) {
return padTo(hours, 2) + ':' +
padTo(minutes, 2) + ':' +
padTo(seconds, 2) + '.' +
padTo(milliseconds, 3);
}
function formatElapsed(elapsed) {
var millis = elapsed;
var hours = Math.floor(millis / (60 * 60 * 1000));
millis -= hours * 60 * 60 * 1000;
var minutes = Math.floor(millis / (60 * 1000));
millis -= minutes * 60 * 1000;
var seconds = Math.floor(millis / 1000);
millis -= seconds * 1000;
return formatTime(hours, minutes, seconds, millis);
}
function padTo(number, len) {
var numString = number + "";
while (numString.length < len) numString = "0" + numString;
return numString;
}
function timestamp(millis) {
// used also by tools that do not set window.output.baseMillis
var base = window.output ? window.output.baseMillis : 0;
return new Date(base + millis);
}
function createGeneratedString(timestamp) {
var date = new Date(timestamp);
var dt = dateTimeFromDate(date).slice(0, 17); // drop millis
var offset = date.getTimezoneOffset();
var sign = offset > 0 ? '-' : '+';
var hh = Math.floor(Math.abs(offset) / 60);
var mm = Math.abs(offset) % 60;
return dt + ' UTC' + sign + padTo(hh, 2) + ':' + padTo(mm, 2);
}
function createGeneratedAgoString(timestamp) {
function timeString(time, shortUnit) {
var unit = {y: 'year', d: 'day', h: 'hour', m: 'minute',
s: 'second'}[shortUnit];
var end = time == 1 ? ' ' : 's ';
return time + ' ' + unit + end;
}
function compensateLeapYears(days, years) {
// Not a perfect algorithm but ought to be enough
return days - Math.floor(years / 4);
}
var generated = Math.round(timestamp / 1000);
var current = Math.round(new Date().getTime() / 1000);
var elapsed = current - generated;
var prefix = '';
if (elapsed < 0) {
prefix = '- ';
elapsed = Math.abs(elapsed);
}
var secs = elapsed % 60;
var mins = Math.floor(elapsed / 60) % 60;
var hours = Math.floor(elapsed / (60*60)) % 24;
var days = Math.floor(elapsed / (60*60*24)) % 365;
var years = Math.floor(elapsed / (60*60*24*365));
if (years) {
days = compensateLeapYears(days, years);
return prefix + timeString(years, 'y') + timeString(days, 'd');
} else if (days) {
return prefix + timeString(days, 'd') + timeString(hours, 'h');
} else if (hours) {
return prefix + timeString(hours, 'h') + timeString(mins, 'm');
} else if (mins) {
return prefix + timeString(mins, 'm') + timeString(secs, 's');
} else {
return prefix + timeString(secs, 's');
}
}
function parseQueryString(query) {
var result = {};
if (!query)
return result;
var params = query.split('&');
var parts;
function decode(item) {
return decodeURIComponent(item.replace('+', ' '));
}
for (var i = 0, len = params.length; i < len; i++) {
parts = params[i].split('=');
result[decode(parts.shift())] = decode(parts.join('='));
}
return result;
}
return {
map: map,
filter: filter,
all: all,
any: any,
contains: contains,
last: last,
escape: escape,
unescape: unescape,
normalize: normalize,
regexpEscape: regexpEscape,
Matcher: Matcher,
formatParentName: formatParentName,
timeFromDate: timeFromDate,
dateFromDate: dateFromDate,
dateTimeFromDate: dateTimeFromDate,
formatElapsed: formatElapsed,
timestamp: timestamp,
createGeneratedString: createGeneratedString,
createGeneratedAgoString: createGeneratedAgoString,
parseQueryString: parseQueryString
};
}();
</script>
<script type="text/javascript">
window.testdata = function () {
var elementsById = {};
var idCounter = 0;
var _statistics = null;
var LEVELS = ['TRACE', 'DEBUG', 'INFO', 'WARN', 'ERROR', 'FAIL'];
var STATUSES = ['FAIL', 'PASS', 'NOT_RUN'];
var KEYWORDS = ['KEYWORD', 'SETUP', 'TEARDOWN', 'FOR', 'VAR'];
function addElement(elem) {
if (!elem.id)
elem.id = uniqueId();
elementsById[elem.id] = elem;
return elem;
}
function uniqueId() {
idCounter++;
return 'element-id-' + idCounter;
}
function times(stats) {
var startMillis = stats[1];
var elapsed = stats[2];
if (startMillis === null)
return [null, null, elapsed];
return [util.timestamp(startMillis),
util.timestamp(startMillis + elapsed),
elapsed];
}
function message(element, strings) {
return addElement(model.Message(LEVELS[element[1]],
util.timestamp(element[0]),
strings.get(element[2]),
strings.get(element[3])));
}
function parseStatus(stats) {
return STATUSES[stats[0]];
}
function childCreator(parent, childType) {
return function (elem, strings, index) {
return addElement(childType(parent, elem, strings, index));
};
}
function createKeyword(parent, element, strings, index) {
var kw = model.Keyword({
parent: parent,
type: KEYWORDS[element[0]],
id: 'k' + (index + 1),
name: strings.get(element[1]),
libname: strings.get(element[2]),
timeout: strings.get(element[3]),
args: strings.get(element[5]),
assign: strings.get(element[6]),
tags: strings.get(element[7]),
doc: function () {
var doc = strings.get(element[4]);
this.doc = function () { return doc; };
return doc;
},
status: parseStatus(element[8], strings),
times: model.Times(times(element[8])),
isChildrenLoaded: typeof(element[9]) !== 'number'
});
lazyPopulateKeywordsFromFile(kw, element[9], strings);
kw.populateMessages(Populator(element[10], strings, message));
return kw;
}
function lazyPopulateKeywordsFromFile(parent, modelOrIndex, strings) {
var model, index, populator;
var creator = childCreator(parent, createKeyword);
if (parent.isChildrenLoaded) {
model = modelOrIndex;
populator = Populator(model, strings, creator);
} else {
index = modelOrIndex;
parent.childFileName = window.settings['splitLogBase'] + '-' + index + '.js';
populator = SplitLogPopulator(index, creator);
}
parent.populateKeywords(populator);
}
function tags(taglist, strings) {
return util.map(taglist, strings.get);
}
function createTest(parent, element, strings, index) {
var statusElement = element[5];
var test = model.Test({
parent: parent,
id: 't' + (index + 1),
name: strings.get(element[0]),
doc: function () {
var doc = strings.get(element[3]);
this.doc = function () { return doc; };
return doc;
},
timeout: strings.get(element[1]),
isCritical: element[2],
status: parseStatus(statusElement),
message: function () {
var msg = createMessage(statusElement, strings);
this.message = function () { return msg; };
return msg;
},
times: model.Times(times(statusElement)),
tags: tags(element[4], strings),
isChildrenLoaded: typeof(element[6]) !== 'number'
});
lazyPopulateKeywordsFromFile(test, element[6], strings);
return test;
}
function createMessage(statusElement, strings) {
return statusElement.length == 4 ? strings.get(statusElement[3]) : '';
}
function createSuite(parent, element, strings, index) {
var statusElement = element[5];
var suite = model.Suite({
parent: parent,
id: 's' + ((index || 0) + 1),
name: strings.get(element[0]),
source: strings.get(element[1]),
relativeSource: strings.get(element[2]),
doc: function () {
var doc = strings.get(element[3]);
this.doc = function () { return doc; };
return doc;
},
status: parseStatus(statusElement),
message: function () {
var msg = createMessage(statusElement, strings);
this.message = function () { return msg; };
return msg;
},
times: model.Times(times(statusElement)),
statistics: suiteStats(util.last(element)),
metadata: parseMetadata(element[4], strings)
});
suite.populateKeywords(Populator(element[8], strings, childCreator(suite, createKeyword)));
suite.populateTests(Populator(element[7], strings, childCreator(suite, createTest)));
suite.populateSuites(Populator(element[6], strings, childCreator(suite, createSuite)));
return suite;
}
function parseMetadata(data, strings) {
var metadata = [];
for (var i=0; i<data.length; i+=2) {
metadata.push([strings.get(data[i]), strings.get(data[i+1])]);
}
return metadata;
}
function suiteStats(stats) {
return {
total: stats[0],
totalPassed: stats[1],
totalFailed: stats[0] - stats[1],
critical: stats[2],
criticalPassed: stats[3],
criticalFailed: stats[2] - stats[3]
};
}
function Populator(items, strings, creator) {
return {
numberOfItems: function () {
return items.length;
},
creator: function (index) {
return creator(items[index], strings, index);
}
};
}
function SplitLogPopulator(structureIndex, creator) {
return {
numberOfItems: function () {
return window['keywords'+structureIndex].length;
},
creator: function (index) {
return creator(window['keywords'+structureIndex][index],
StringStore(window['strings'+structureIndex]),
index);
}
};
}
function suite() {
var elem = window.output.suite;
if (elementsById[elem.id])
return elem;
var root = addElement(createSuite(null, elem, StringStore(window.output.strings)));
window.output.suite = root;
return root;
}
function findLoaded(id) {
return elementsById[id];
}
function ensureLoaded(id, callback) {
var ids = id.split('-');
var root = suite();
ids.shift();
loadItems(ids, root, [root.id], callback);
}
function loadItems(ids, current, result, callback) {
if (!ids.length) {
callback(result);
return;
}
current.callWhenChildrenReady(function () {
var id = ids.shift();
var type = id[0];
var index = parseInt(id.substring(1)) - 1;
var item = selectFrom(current, type, index);
if (item)
result.push(item.id);
else // Invalid id. Should this be reported somewhere?
ids = [];
loadItems(ids, item, result, callback);
});
}
function selectFrom(element, type, index) {
if (type === 'k') {
return element.keywords()[index];
} else if (type === 't') {
return element.tests()[index];
} else {
return element.suites()[index];
}
}
function errorIterator() {
return {
next: function () {
return message(window.output.errors.shift(),
StringStore(window.output.strings));
},
hasNext: function () {
return window.output.errors.length > 0;
}
};
}
function statistics() {
if (!_statistics) {
var statData = window.output.stats;
_statistics = stats.Statistics(statData[0], statData[1], statData[2]);
}
return _statistics;
}
function StringStore(strings) {
function getText(id) {
var text = strings[id];
if (!text)
return '';
if (text[0] == '*')
return text.substring(1);
var extracted = extract(text);
strings[id] = '*' + extracted;
return extracted;
}
function extract(text) {
var decoded = JXG.Util.Base64.decodeAsArray(text);
var extracted = (new JXG.Util.Unzip(decoded)).unzip()[0][0];
return JXG.Util.UTF8.decode(extracted);
}
function get(id) {
if (id === null) return null;
return getText(id);
}
return {get: get};
}
return {
suite: suite,
errorIterator: errorIterator,
findLoaded: findLoaded,
ensureLoaded: ensureLoaded,
statistics: statistics,
StringStore: StringStore, // exposed for tests
LEVELS: LEVELS
};
}();
</script>
<script type="text/javascript">
function removeJavaScriptDisabledWarning() {
// Not using jQuery here for maximum speed
document.getElementById('javascript-disabled').style.display = 'none';
}
function addJavaScriptDisabledWarning(error) {
if (window.console)
console.error('Opening failed: ' + error.name + ': ' + error.message);
document.getElementById('javascript-disabled').style.display = 'block';
}
function initLayout(suiteName, type) {
parseTemplates();
setTitle(suiteName, type);
addHeader();
addReportOrLogLink(type);
}
function parseTemplates() {
$('script[type="text/x-jquery-tmpl"]').map(function (idx, elem) {
$.template(elem.id, elem.text);
});
}
function testOrTask(text) {
return text.replace(/{(.*)}/, function (match, group, offset, string) {
if (!window.settings.rpa)
return group;
return {'TEST': 'TASK', 'Test': 'Task', 'test': 'task'}[group];
});
}
function setTitle(suiteName, type) {
var givenTitle = window.settings.title;
var title = givenTitle ? givenTitle : suiteName + " " + type;
document.title = util.unescape(title);
}
function addHeader() {
var generated = util.timestamp(window.output.generated);
$.tmpl('<h1>${title}</h1>' +
'<div id="generated">' +
'<span>Generated<br>${generated}</span><br>' +
'<span id="generated-ago">${ago} ago</span>' +
'</div>' +
'<div id="top-right-header">' +
'<div id="report-or-log-link"><a href="#"></a></div>' +
'</div>', {
generated: util.createGeneratedString(generated),
ago: util.createGeneratedAgoString(generated),
title: document.title
}).appendTo($('#header'));
}
function addReportOrLogLink(myType) {
var url;
var text;
var container = $('#report-or-log-link');
if (myType == 'Report') {
url = window.settings.logURL;
text = 'LOG';
} else {
url = window.settings.reportURL;
text = 'REPORT';
}
if (url) {
container.find('a').attr('href', url);
container.find('a').text(text);
} else {
container.remove();
}
}
function addStatistics() {
var statHeaders =
'<th class="stats-col-stat">Total</th>' +
'<th class="stats-col-stat">Pass</th>' +
'<th class="stats-col-stat">Fail</th>' +
'<th class="stats-col-elapsed">Elapsed</th>' +
'<th class="stats-col-graph">Pass / Fail</th>';
var statTable =
'<h2>{Test} Statistics</h2>' +
'<table class="statistics" id="total-stats"><thead><tr>' +
'<th class="stats-col-name">Total Statistics</th>' + statHeaders +
'</tr></thead></table>' +
'<table class="statistics" id="tag-stats"><thead><tr>' +
'<th class="stats-col-name">Statistics by Tag</th>' + statHeaders +
'</tr></thead></table>' +
'<table class="statistics" id="suite-stats"><thead><tr>' +
'<th class="stats-col-name">Statistics by Suite</th>' + statHeaders +
'</tr></thead></table>';
$(testOrTask(statTable)).appendTo('#statistics-container');
util.map(['total', 'tag', 'suite'], addStatTable);
addTooltipsToElapsedTimes();
enableStatisticsSorter();
}
function addTooltipsToElapsedTimes() {
$('.stats-col-elapsed').attr('title',
testOrTask('Total execution time of these {test}s. ') +
'Excludes suite setups and teardowns.');
$('#suite-stats').find('.stats-col-elapsed').attr('title',
'Total execution time of this suite.');
}
function enableStatisticsSorter() {
$.tablesorter.addParser({
id: 'statName',
type: 'numeric',
is: function(s) {
return false; // do not auto-detect
},
format: function(string, table, cell, cellIndex) {
// Rows have class in format 'row-<index>'.
var index = $(cell).parent().attr('class').substring(4);
return parseInt(index);
}
});
$(".statistics").tablesorter({
sortInitialOrder: 'desc',
headers: {0: {sorter:'statName', sortInitialOrder: 'asc'},
5: {sorter: false}}
});
}
function addStatTable(tableName) {
var stats = window.testdata.statistics()[tableName];
if (tableName == 'tag' && stats.length == 0) {
renderNoTagStatTable();
} else {
renderStatTable(tableName, stats);
}
}
function renderNoTagStatTable() {
$('<tbody><tr class="row-0">' +
'<td class="stats-col-name">No Tags</td>' +
'<td class="stats-col-stat"></td>' +
'<td class="stats-col-stat"></td>' +
'<td class="stats-col-stat"></td>' +
'<td class="stats-col-elapsed"></td>' +
'<td class="stats-col-graph">' +
'<div class="empty-graph"></div>' +
'</td>' +
'</tr></tbody>').appendTo('#tag-stats');
}
function renderStatTable(tableName, stats) {
var template = tableName + 'StatisticsRowTemplate';
var tbody = $('<tbody></tbody>');
for (var i = 0, len = stats.length; i < len; i++) {
$.tmpl(template, stats[i], {index: i}).appendTo(tbody);
}
tbody.appendTo('#' + tableName + '-stats');
}
$.template('statColumnsTemplate',
'<td class="stats-col-stat">${total}</td>' +
'<td class="stats-col-stat">${pass}</td>' +
'<td class="stats-col-stat">${fail}</td>' +
'<td class="stats-col-elapsed">${elapsed}</td>' +
'<td class="stats-col-graph">' +
'{{if total}}' +
'<div class="graph">' +
'<div class="pass-bar" style="width: ${passWidth}%" title="${passPercent}%"></div>' +
'<div class="fail-bar" style="width: ${failWidth}%" title="${failPercent}%"></div>' +
'</div>' +
'{{else}}' +
'<div class="empty-graph"></div>' +
'{{/if}}' +
'</td>'
);
$.template('suiteStatusMessageTemplate',
'${critical} critical {{= testOrTask("{test}")}}, ' +
'${criticalPassed} passed, ' +
'<span class="{{if criticalFailed}}fail{{else}}pass{{/if}}">${criticalFailed} failed</span><br>' +
'${total} {{= testOrTask("{test}")}} total, ' +
'${totalPassed} passed, ' +
'<span class="{{if totalFailed}}fail{{else}}pass{{/if}}">${totalFailed} failed</span>'
);
// For complete cross-browser experience..
// http://www.quirksmode.org/js/events_order.html
function stopPropagation(event) {
var event = event || window.event;
event.cancelBubble = true;
if (event.stopPropagation)
event.stopPropagation();
}
</script>
<script type="text/javascript">
window.output = {};
</script>
<script type="text/javascript">
window.output["suite"] = [1,2,3,0,[],[0,0,231480],[[4,5,4,0,[],[0,1229,230086],[[6,7,8,0,[],[0,1232,230081],[[9,10,11,0,[],[0,1235,230076],[[12,13,14,0,[],[0,1238,230070],[],[[15,0,1,0,[16,17,18,19,20,21,22],[1,1275,75147],[[0,23,24,0,0,25,26,0,[1,1276,175],[[0,27,28,0,0,29,30,0,[1,1276,173],[[0,31,32,0,33,34,0,35,[1,1277,0],[],[]],[0,36,32,0,37,38,39,40,[1,1278,165],[],[[1443,2,41]]],[0,42,32,0,43,44,0,45,[1,1444,1],[],[[1444,2,46]]],[0,47,32,0,48,44,0,49,[1,1445,2],[],[]],[0,50,51,0,52,53,30,0,[1,1447,1],[],[[1448,2,54]]]],[[1448,2,54]]],[0,50,51,0,52,55,56,0,[1,1449,0],[],[[1449,2,57]]],[0,50,51,0,52,58,59,0,[1,1450,0],[],[[1450,2,60]]]],[[1450,2,61],[1450,2,62]]],[0,63,51,0,64,65,0,0,[1,1451,0],[],[[1451,2,66]]],[0,50,51,0,52,65,67,0,[1,1451,1],[],[[1452,2,68]]],[0,50,51,0,52,69,70,0,[1,1452,1],[],[[1453,2,71]]],[0,72,51,0,73,74,70,0,[1,1453,1],[[0,50,51,0,52,75,0,0,[1,1453,1],[],[]]],[[1454,2,71]]],[0,63,51,0,64,70,0,0,[1,1454,1],[],[[1454,2,76]]],[0,77,24,0,0,70,78,0,[1,1455,254],[[0,27,28,0,0,79,30,0,[1,1455,251],[[0,31,32,0,33,34,0,35,[1,1456,0],[],[]],[0,36,32,0,37,38,39,40,[1,1456,234],[],[[1690,2,80]]],[0,42,32,0,43,44,0,45,[1,1692,5],[],[[1693,2,81]]],[0,47,32,0,48,44,0,49,[1,1698,4],[],[]],[0,50,51,0,52,53,30,0,[1,1703,2],[],[[1704,2,82]]]],[[1705,2,82]]],[0,50,51,0,52,83,84,0,[1,1706,1],[],[[1707,2,85]]],[0,50,51,0,52,58,86,0,[1,1707,1],[],[[1708,2,87]]]],[[1709,2,87],[1709,2,88]]],[0,63,51,0,64,89,0,0,[1,1710,1],[],[[1710,2,90]]],[0,50,51,0,52,91,92,0,[1,1711,1],[],[[1712,2,93]]],[0,50,51,0,52,94,70,0,[1,1712,1],[],[[1713,2,95]]],[0,72,51,0,73,96,70,0,[1,1713,2],[[0,50,51,0,52,97,0,0,[1,1714,0],[],[]]],[[1715,2,95]]],[0,77,24,0,0,70,98,0,[1,1715,261],[[0,27,28,0,0,79,30,0,[1,1716,258],[[0,31,32,0,33,34,0,35,[1,1717,1],[],[]],[0,36,32,0,37,38,39,40,[1,1718,251],[],[[1969,2,99]]],[0,42,32,0,43,44,0,45,[1,1969,2],[],[[1970,2,100]]],[0,47,32,0,48,44,0,49,[1,1971,2],[],[]],[0,50,51,0,52,53,30,0,[1,1973,1],[],[[1973,2,101]]]],[[1974,2,101]]],[0,50,51,0,52,83,84,0,[1,1974,1],[],[[1975,2,102]]],[0,50,51,0,52,58,86,0,[1,1975,1],[],[[1976,2,87]]]],[[1976,2,87],[1976,2,103]]],[0,63,51,0,64,104,0,0,[1,1976,1],[],[[1977,2,105]]],[0,50,51,0,52,106,107,0,[1,1977,1],[],[[1977,2,108]]],[0,50,51,0,52,91,109,0,[1,1978,0],[],[[1978,2,110]]],[0,111,51,0,112,113,92,0,[1,1978,1],[],[[1979,2,114]]],[0,115,51,0,116,0,117,0,[1,1979,1],[],[[1979,2,118]]],[0,119,51,0,120,121,0,0,[1,1980,20001],[],[[21981,2,122]]],[0,123,124,0,125,126,127,0,[1,21982,3055],[],[[23526,2,128],[25036,2,129]]],[0,130,51,0,131,132,0,0,[1,25037,1],[],[]],[0,119,51,0,120,133,0,0,[1,25038,50002],[],[[75040,2,134]]],[0,115,51,0,116,0,135,0,[1,75041,1],[],[[75042,2,136]]],[0,137,51,0,138,104,139,0,[1,75043,0],[],[[75043,2,140]]],[0,141,142,0,0,143,0,0,[1,75044,514],[[0,144,145,0,0,146,147,0,[1,75045,391],[[0,31,32,0,33,148,0,35,[1,75045,1],[],[]],[0,149,32,0,150,151,152,40,[1,75046,214],[],[[75260,2,153]]],[0,63,51,0,64,154,0,0,[1,75260,1],[],[[75261,2,155]]],[0,156,32,0,157,44,0,45,[1,75261,114],[],[[75270,2,158]]],[0,47,32,0,48,44,0,49,[1,75375,29],[],[]],[0,63,51,0,64,159,0,0,[1,75404,3],[],[[75406,2,160]]],[0,161,51,0,162,163,164,0,[1,75407,21],[],[[75428,2,165]]],[0,63,51,0,64,164,0,0,[1,75429,1],[],[[75429,2,166]]],[0,50,51,0,52,167,168,0,[1,75430,1],[],[[75431,2,169]]],[0,50,51,0,52,170,171,0,[1,75431,1],[],[[75432,2,172]]],[0,50,51,0,52,173,174,0,[1,75432,1],[],[[75432,2,175]]],[0,50,51,0,52,176,147,0,[1,75433,1],[],[[75433,2,177]]],[0,63,51,0,64,178,0,0,[1,75434,1],[],[[75435,2,179]]]],[[75436,2,177]]],[0,63,51,0,64,147,0,0,[1,75436,1],[],[[75437,2,180]]],[0,181,145,0,0,182,183,0,[1,75438,107],[[0,184,51,0,185,186,187,0,[1,75438,1],[],[[75439,2,188]]],[0,189,190,0,191,192,0,0,[1,75439,1],[],[[75440,2,193]]],[0,194,190,0,195,196,197,0,[1,75440,105],[],[[75442,2,198],[75545,2,199]]]],[[75545,2,200]]],[0,201,51,0,202,203,0,0,[1,75546,0],[],[[75546,2,204]]],[0,205,190,0,206,207,208,0,[1,75547,0],[],[[75547,2,209],[75547,2,210],[75547,2,211]]],[0,212,213,0,214,215,216,0,[1,75548,0],[],[[75548,2,217]]],[0,63,51,0,64,216,0,0,[1,75548,1],[],[[75549,2,218]]],[0
</script>
<script type="text/javascript">
window.output["strings"] = [];
</script>
<script type="text/javascript">
window.output["strings"] = window.output["strings"].concat(["*","*Tsg Autotest","*E:\\auto_git\\tsg_autotest","*.","*01-TestCase","*E:\\auto_git\\tsg_autotest\\01-TestCase","*Tsg Adc","*E:\\auto_git\\tsg_autotest\\01-TestCase\\tsg_adc","*01-TestCase/tsg_adc","*Api Security","*E:\\auto_git\\tsg_autotest\\01-TestCase\\tsg_adc\\api_security","*01-TestCase/tsg_adc/api_security","*AllowHttpTests","*E:\\auto_git\\tsg_autotest\\01-TestCase\\tsg_adc\\api_security\\AllowHttpTests.robot","*01-TestCase/tsg_adc/api_security/AllowHttpTests.robot","*SecurityPolicy-Allow-Http-00001","*Allow","*DENY","*FQDN","*HTTP","*IP","*tsg_adc","*tsg_security","*AddObject","*PolicyObject","*{\"opAction\":\"add\",\"returnData\":1,\"objectList\":{\"objectType\":\"fqdn\",\"objectSubType\":\"\",\"isValid\":1,\"isInitialize\":0,\"isExclusion\":0,\"objectName\":\"SecurityPolicy-Allow-Http-00001_FQDN_icbc\",\"objectDesc\":\"\",\"subObjectIds\":[],\"addItemList\":[{\"keywordArray\":[\"$www.icbc.com.cn\"],\"itemId\":\"\",\"isHexbin\":0}],\"updateItemList\":[],\"deleteItemIds\":[]}}","*${rescodeip}, ${object_FQDN_Id}","*BasePostRequest","*Common","*/v1/policy/object, body=${body}","*${response}","*Set Headers","*REST","*<p><b>Sets new request headers or updates the existing.\x3c/b>\x3c/p>","*{\"Authorization\":\"${token}\",\"Content-Type\":\"application/json\"}","*settings","*Post","*<p><b>Sends a POST request to the endpoint.\x3c/b>\x3c/p>","*${apistr}, ${body}","*&amp;{httpResponse}","*http","*&amp;{httpResponse} = { seconds=0.16222999999999999 | status=200 | body={'code': 200, 'data': {'objectList': [{'addItemList': [{'itemId': '', 'keywordArray': ['$www.icbc.com.cn'], 'isHexbin': 0}], 'deleteItemIds': [], 'isE...","*Output","*<p><b>Outputs JSON to terminal or a file.\x3c/b>\x3c/p>","*response body","*I/O","eNqNk11LwzAUhu/7K0rwci1pnai9G0xZQaay6Y2M0SZHibZNbRK6OvrfTT8sCskwd3nPc/KenJM4R8fVCxFOAUVuiPFsEGgiEy0M4V7h6TsQeceE1PrLpHfr+GfX0wmlsYTciNvTpnSmc2OqMxGa2akPaGpe0UVVJY3VZaLP6rr2GUmJT3jukwJZ8d0JTyZWcEhZof2wkWqdfxyHKGQgIe6vKbraTRATNweSKcF4b2ck4oJJlmTsC6zIsw53vQwM0WGqSxDE0uyR6Icxv7QfsU7yrgK0AaIqJpsHnjHSeIss47W3krL0sF7B/vZxud53U7B7bVS6bUo4XdAP8fpJCyNVbtlQUYhD7OG5hwM3CKMQR+cX5oQnAZVOuL4y3VKo9H7shHVeqtTfBn6/+51jfhqD3o6fLRdvfesUISDEWJx2HLaRKysFTvsNRPjGeg==","*Object","*<p><b>Asserts the field as JSON object.\x3c/b>\x3c/p>","*assertions","*Set Variable","*BuiltIn","*<p>Returns the given values which can then be assigned to a variables.\x3c/p>","*${httpResponse.body}","*${response} = {'code': 200, 'data': {'objectList': [{'addItemList': [{'itemId': '', 'keywordArray': ['$www.icbc.com.cn'], 'isHexbin': 0}], 'deleteItemIds': [], 'isExclusion': 0, 'isInitialize': 0, 'isValid': 1, 'ob...","*${response['data']['objectList'][0]['objectId']}","*${objectId}","*${objectId} = 471","*${response['code']}","*${rescodeReturn}","*${rescodeReturn} = 200","*${rescodeip} = 200","*${object_FQDN_Id} = 471","*Log","*<p>Logs the given message with the given level.\x3c/p>","*${object_FQDN_Id}","*471","*${objectids}","*${objectids} = 471","eNpNUMFuwjAM/ReLI0iwI7dOHaMSogyqXVAVZYlbsoUmStJNVdV/n9OWaTn5+eW9Z7sHYxMRlGlgC1xKWILD0Lom5YHDdrMEa7QS3UH5ANt+Rpmk3/DgjvyOhC8oWqdCdxqbq0Rr87Pah2BXa3oblmLT/WmKzkZN8DXzs444/phETn9bj67gtafOop9BJv1AlDTPmosvPc61jvhg6n8Dp+jFNCRWFZLvN555U2NcIvCYGsj2ei3LYco5Yz1m047OBCOMJvm+KE5kccdwM3Fn6YyFId6oQoeNwPzjk8zJqAczlvE0i36q2e4tPbJMkuDhuVOoZQyG4vLKdtnLIWUxhO3zSwHlUC5B+XeulRx38eKGstUYXa/EcWvzOSZxjnfUfSqH4Repk5m8","*${addPolicyStr}","*${addPolicyStr} = {\"opAction\":\"add\",\"returnData\":1,\"policyList\":{\"policyId\":\"\",\"policyName\":\"SecurityPolicy-Allow-Http-00001_Deny\",\"policyType\":\"tsg_security\",\"action\":\"deny\",\"userTags\":\"\",\"doBlacklist\":0,\"doLog\":1,\"po...","*Run Keyword If","*<p>Runs the given keyword with the given arguments, if <code>condition\x3c/code> is true.\x3c/p>","eNp1kU1rwkAQhv+KLIKXCLVHwYM1pgZEbRILRWRZs2NMu2bD7sQSQv57Z+MH7aE57Xw9886bQb8RUiZgcaagwHATKJG1g8lkMBp4PQvYuwiTi4MCr9cwXU5TzHXBxoymmMcMYGUKX6Bg45HHSq3ytF7mFtm4uUWhpG52r63EGSiOIa1MjvWmSw6nSunv4QKxHD7RN+I+FPVjJqlLN4M24/Y2RzVxVyKvvZUFk4jMUqbf3IJQ2pZKUr8okX6pTteTi5c6+yXYB5u6kyrUSE7
</script>
<script type="text/javascript">
window.output["stats"] = [[{"elapsed":"00:03:50","fail":1,"label":"Critical Tests","pass":2},{"elapsed":"00:03:50","fail":1,"label":"All Tests","pass":2}],[{"elapsed":"00:03:50","fail":1,"label":"Allow","pass":2},{"elapsed":"00:01:14","fail":1,"label":"Category","pass":0},{"elapsed":"00:03:50","fail":1,"label":"DENY","pass":2},{"elapsed":"00:02:36","fail":0,"label":"FQDN","pass":2},{"elapsed":"00:03:50","fail":1,"label":"HTTP","pass":2},{"elapsed":"00:02:36","fail":0,"label":"IP","pass":2},{"elapsed":"00:01:14","fail":1,"label":"SubID","pass":0},{"elapsed":"00:03:50","fail":1,"label":"tsg_adc","pass":2},{"elapsed":"00:03:50","fail":1,"label":"tsg_security","pass":2}],[{"elapsed":"00:03:51","fail":1,"id":"s1","label":"Tsg Autotest","name":"Tsg Autotest","pass":2},{"elapsed":"00:03:50","fail":1,"id":"s1-s1","label":"Tsg Autotest.01-TestCase","name":"01-TestCase","pass":2},{"elapsed":"00:03:50","fail":1,"id":"s1-s1-s1","label":"Tsg Autotest.01-TestCase.Tsg Adc","name":"Tsg Adc","pass":2},{"elapsed":"00:03:50","fail":1,"id":"s1-s1-s1-s1","label":"Tsg Autotest.01-TestCase.Tsg Adc.Api Security","name":"Api Security","pass":2},{"elapsed":"00:03:50","fail":1,"id":"s1-s1-s1-s1-s1","label":"Tsg Autotest.01-TestCase.Tsg Adc.Api Security.AllowHttpTests","name":"AllowHttpTests","pass":2}]];
</script>
<script type="text/javascript">
window.output["errors"] = [];
</script>
<script type="text/javascript">
window.output["baseMillis"] = 1585714835673;
</script>
<script type="text/javascript">
window.output["generated"] = 231647;
</script>
<script type="text/javascript">
window.settings = {"defaultLevel":"INFO","minLevel":"INFO","reportURL":"report.html","rpa":false,"splitLogBase":"log","title":""};
</script>
<title></title>
</head>
<body>
<div id="javascript-disabled">
<h1>Opening Robot Framework log failed</h1>
<ul>
<li>Verify that you have <b>JavaScript enabled</b> in your browser.</li>
<li>Make sure you are using a <b>modern enough browser</b>. If using Internet Explorer, version 8 or newer is required.</li>
<li>Check are there messages in your browser's <b>JavaScript error log</b>. Please report the problem if you suspect you have encountered a bug.</li>
</ul>
</div>
<script type="text/javascript">removeJavaScriptDisabledWarning();</script>
<div id="header"></div>
<div id="statistics-container"></div>
<script type="text/javascript">
$(document).ready(function() {
try {
var topsuite = window.testdata.suite();
} catch (error) {
addJavaScriptDisabledWarning(error);
return;
}
initLayout(topsuite.name, 'Log');
addStatistics();
addErrors();
addExecutionLog(topsuite);
addLogLevelSelector(window.settings['minLevel'], window.settings['defaultLevel']);
if (window.location.hash) {
makeElementVisible(window.location.hash.substring(1));
} else {
expandSuite(topsuite);
}
});
function addLogLevelSelector(minLevel, defaultLevel) {
var controller = LogLevelController(minLevel, defaultLevel);
if (controller.showLogLevelSelector()) {
var selector = $.tmpl('logLevelSelectorTemplate', controller);
selector.find('select').val(controller.defaultLogLevel());
selector.appendTo($('#top-right-header'));
$('#report-or-log-link').find('a').css({'border-bottom-left-radius': '0'});
setMessageVisibility(controller.defaultLogLevel());
}
}
function addErrors() {
var errors = window.testdata.errorIterator();
if (errors.hasNext()) {
$.tmpl('errorHeaderTemplate').appendTo($('body'));
drawErrorsRecursively(errors, $('#errors'));
}
}
function drawErrorsRecursively(errors, target) {
var elements = popFromIterator(errors, 10);
$.tmpl('errorTemplate', elements).appendTo(target);
if (errors.hasNext())
setTimeout(function () { drawErrorsRecursively(errors, target); }, 0);
else {
// Errors may have moved scroll position. Resetting location re-scrolls.
if (window.location.hash)
window.location.replace(window.location.hash);
highlightLinkTarget();
}
}
function highlightLinkTarget() {
if (window.location.hash) {
var target = $(window.location.hash);
highlight(target);
}
}
function highlight(element, color) {
if (color === undefined)
color = 242;
if (color < 255) {
element.css({'background-color': 'rgb('+color+','+color+','+color+')'});
setTimeout(function () { highlight(element, color+1); }, 300);
} else {
element.css({'background-color': ''});
}
}
function popFromIterator(iterator, upTo) {
var result = [];
while (iterator.hasNext() > 0 && result.length < upTo)
result.push(iterator.next());
return result;
}
function makeElementVisible(id) {
window.testdata.ensureLoaded(id, function (ids) {
util.map(ids, expandElementWithId);
if (ids.length) {
expandCriticalFailed(window.testdata.findLoaded(util.last(ids)));
window.location.hash = '';
window.location.hash = id;
highlightLinkTarget();
}
});
}
function addExecutionLog(main) {
$('body').append($(testOrTask('<h2>{Test} Execution Log</h2>')),
$.tmpl('suiteTemplate', main));
}
</script>
<script type="text/x-jquery-tmpl" id="totalStatisticsRowTemplate">
<tr class="row-${$item.index}">
<td class="stats-col-name">
<div class="stat-name">
<span>{{html label}}</span>
</div>
</td>
{{tmpl($data) 'statColumnsTemplate'}}
</tr>
</script>
<script type="text/x-jquery-tmpl" id="tagStatisticsRowTemplate">
<tr class="row-${$item.index}">
<td class="stats-col-name" title="{{html doc}}">
<div class="stat-name">
<span>{{html label}}</span>
{{if info}}(${info}){{/if}}
</div>
<div class="tag-links">
{{each links}}
<span>[<a href="{{html $value.url}}" title="{{html $value.url}}">{{html $value.title}}</a>]</span>
{{/each}}
</div>
</td>
{{tmpl($data) 'statColumnsTemplate'}}
</tr>
</script>
<script type="text/x-jquery-tmpl" id="suiteStatisticsRowTemplate">
<tr onclick="makeElementVisible('${id}')" class="row-${$item.index}">
<td class="stats-col-name" title="{{html label}}">
<div class="stat-name">
<a href="#${id}"><span class="parent-name">{{html formatParentName}}</span>{{html name}}</a>
</div>
</td>
{{tmpl($data) 'statColumnsTemplate'}}
</tr>
</script>
<script type="text/x-jquery-tmpl" id="errorHeaderTemplate">
<h2>{{= testOrTask('{Test}')}} Execution Errors</h2>
<table id="errors"></table>
</script>
<script type="text/x-jquery-tmpl" id="errorTemplate">
<tr id="${id}" class="message-row">
<td class="error-time">
{{if link}}
<a onclick="makeElementVisible('${link}')" href="#${link}" title="Link to details">${date} ${time}</a>
{{else}}
${date} ${time}
{{/if}}
</td>
<td class="${level.toLowerCase()} level"><span class="label ${level.toLowerCase()}">${level}</span></td>
<td class="message">{{html text}}</td>
<td class="select-message" onclick="javascript:selectMessage('${id}')" title="Select message text">
<div></div>
</td>
</tr>
</script>
<script type="text/x-jquery-tmpl" id="suiteTemplate">
<div id="${id}" class="suite">
<div class="element-header closed" onclick="toggleSuite('${id}')">
<div class="element-header-left" title="{{html fullName}}">
<span class="elapsed" title="Elapsed time">${times.elapsedTime}</span>
<span class="label ${status.toLowerCase()}">SUITE</span>
<span class="name">{{html name}}</span>
</div>
<div class="element-header-right" onclick="stopPropagation(event)" title="">
<a class="expand" title="Expand all" href="javascript:expandAll('${id}')"></a>
<a class="collapse" title="Collapse all" href="javascript:collapseAll('${id}')"></a>
<a class="link" title="Link to this suite" href="#${id}" onclick="makeElementVisible('${id}')"></a>
</div>
<div class="element-header-toggle" title="Toggle visibility"></div>
</div>
<div class="children">
<table class="metadata">
<tr>
<th>Full Name:</th>
<td>{{html fullName}}</td>
</tr>
{{if doc()}}
<tr>
<th>Documentation:</th>
<td class="doc">{{html doc()}}</td>
</tr>
{{/if}}
{{each metadata}}
<tr>
<th>{{html $value[0]}}:</th>
<td class="doc">{{html $value[1]}}</td>
</tr>
{{/each}}
{{if source}}
<tr>
<th>Source:</th>
{{if relativeSource}}
<td><a href="${relativeSource}">{{html source}}</a></td>
{{else}}
<td>{{html source}}</td>
{{/if}}
</tr>
{{/if}}
<tr>
<th>Start / End / Elapsed:</th>
<td>${times.startTime} / ${times.endTime} / ${times.elapsedTime}</td>
</tr>
<tr>
<th>Status:</th>
<td>{{tmpl($data) 'suiteStatusMessageTemplate'}}</td>
</tr>
{{if message()}}
<tr>
<th>Message:</th>
<td class="message">{{html message()}}</td>
</tr>
{{/if}}
</table>
</div>
</div>
</script>
<script type="text/x-jquery-tmpl" id="testTemplate">
<div id="${id}" class="test">
<div class="element-header closed" onclick="toggleTest('${id}')">
<div class="element-header-left" title="{{html fullName}}">
<span class="elapsed" title="Elapsed time">${times.elapsedTime}</span>
<span class="label ${status.toLowerCase()}">{{= testOrTask('{TEST}')}}</span>
<span class="name">{{html name}}</span>
{{if !isCritical}}(non-critical){{/if}}
</div>
<div class="element-header-right" onclick="stopPropagation(event)" title="">
<a class="expand" title="Expand all" href="javascript:expandAll('${id}')"></a>
<a class="collapse" title="Collapse all" href="javascript:collapseAll('${id}')"></a>
<a class="link" title="Link to this {{= testOrTask('{test}')}}" href="#${id}" onclick="makeElementVisible('${id}')"></a>
</div>
<div class="element-header-toggle" title="Toggle visibility"></div>
</div>
<div class="children">
<table class="metadata">
<tr>
<th>Full Name:</th>
<td>{{html fullName}}</td>
</tr>
{{if doc()}}
<tr>
<th>Documentation:</th>
<td class="doc">{{html doc()}}</td>
</tr>
{{/if}}
{{if tags.length}}
<tr>
<th>Tags:</th>
<td>{{html tags.join(', ')}}</td>
</tr>
{{/if}}
{{if timeout}}
<tr>
<th>Timeout:</th>
<td>{{html timeout}}</td>
</tr>
{{/if}}
<tr>
<th>Start / End / Elapsed:</th>
<td>${times.startTime} / ${times.endTime} / ${times.elapsedTime}</td>
</tr>
<tr>
<th>Status:</th>
<td><span class="label ${status.toLowerCase()}">${status}</span> ({{if isCritical}}critical{{else}}non-critical{{/if}})</td>
</tr>
{{if message()}}
<tr>
<th>Message:</th>
<td class="message">{{html message()}}</td>
</tr>
{{/if}}
</table>
</div>
</div>
</script>
<script type="text/x-jquery-tmpl" id="keywordTemplate">
<div id="${id}" class="keyword">
<div class="element-header closed" onclick="toggleKeyword('${id}')">
<div class="element-header-left" title="{{html name}}">
<span class="elapsed" title="Elapsed time">${times.elapsedTime}</span>
<span class="label keyword ${status.toLowerCase()}">${type}</span>
<span>{{html assign}}</span>
<span class="name"><span class="parent-name">{{html libname}}{{if libname}} . {{/if}}</span>{{html name}}</span>
<span class="arg">{{html arguments}}</span>
</div>
<div class="element-header-right" onclick="stopPropagation(event)">
<a class="expand" title="Expand all" href="javascript:expandAll('${id}')"></a>
<a class="collapse" title="Collapse all" href="javascript:collapseAll('${id}')"></a>
<a class="link" title="Link to this keyword" href="#${id}" onclick="makeElementVisible('${id}')"></a>
</div>
<div class="element-header-toggle" title="Toggle visibility"></div>
</div>
<div class="children">
<table class="metadata keyword-metadata">
{{if doc()}}
<tr>
<th>Documentation:</th>
<td class="doc">{{html doc()}}</td>
</tr>
{{/if}}
{{if tags}}
<tr>
<th>Tags:</th>
<td>{{html tags}}</td>
</tr>
{{/if}}
{{if timeout}}
<tr>
<th>Timeout:</th>
<td>{{html timeout}}</td>
</tr>
{{/if}}
<tr>
<th>Start / End / Elapsed:</th>
<td>${times.startTime} / ${times.endTime} / ${times.elapsedTime}</td>
</tr>
</table>
</div>
</div>
</script>
<script type="text/x-jquery-tmpl" id="messageTemplate">
<table id="${id}" class="messages ${level.toLowerCase()}-message">
<tr class="message-row">
<td class="time">${time}</td>
<td class="${level.toLowerCase()} level"><span class="label ${level.toLowerCase()}">${level}</span></td>
<td class="message">{{html text}}</td>
<td class="select-message" onclick="javascript:selectMessage('${id}')" title="Select message text">
<div></div>
</td>
</tr>
</table>
</script>
<script type="text/x-jquery-tmpl" id="logLevelSelectorTemplate">
<div id="log-level-selector">
Log level:
<select onchange="logLevelSelected(this.options[selectedIndex].value)">
<option value="2">INFO</option>
<option value="1">DEBUG</option>
{{if showTrace()}}<option value="0">TRACE</option>{{/if}}
</select>
</div>
</script>
</body>
</html>