summaryrefslogtreecommitdiffstats
path: root/Tools/RebaselineQueueServer/templates
diff options
context:
space:
mode:
Diffstat (limited to 'Tools/RebaselineQueueServer/templates')
-rw-r--r--Tools/RebaselineQueueServer/templates/builder-picker.html74
-rw-r--r--Tools/RebaselineQueueServer/templates/builder-queue-edit.html176
-rw-r--r--Tools/RebaselineQueueServer/templates/builder-queue-list.html23
-rw-r--r--Tools/RebaselineQueueServer/templates/home.html28
4 files changed, 301 insertions, 0 deletions
diff --git a/Tools/RebaselineQueueServer/templates/builder-picker.html b/Tools/RebaselineQueueServer/templates/builder-picker.html
new file mode 100644
index 0000000..1068c04
--- /dev/null
+++ b/Tools/RebaselineQueueServer/templates/builder-picker.html
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html id="builder-picker">
+<head>
+ <title>Rebaseline Queue: Builders</title>
+ <script src="http://test-results.appspot.com/dashboards/builders.js"></script>
+ <link rel="stylesheet" href="/static/styles.css" type="text/css">
+</head>
+<body>
+
+<div id="builder-picker-controls">
+ <label for="builder-group">Group:</label>
+ <select id="builder-group">
+ <option disabled></option>
+ </select>
+
+ <label for="builder">Builder:</label>
+ <select id="builder">
+ <option disabled></option>
+ </select>
+</div>
+
+<iframe src="/static/builder-frame-empty.html" id="builder-frame"></iframe>
+
+<script>
+function init()
+{
+ var builderGroupMenu = document.getElementById('builder-group');
+ builderGroupMenu.addEventListener(
+ 'change', handleBuilderGroupSelected, false);
+
+ var builderMenu = document.getElementById('builder');
+ builderMenu.addEventListener(
+ 'change', handleBuilderSelected, false);
+
+ for (var builderGroupName in LAYOUT_TESTS_BUILDER_GROUPS) {
+ var builderGroupOption = document.createElement('option');
+ builderGroupOption.textContent = builderGroupOption.value =
+ builderGroupName;
+ builderGroupMenu.appendChild(builderGroupOption);
+ }
+}
+
+function handleBuilderGroupSelected()
+{
+ var builderGroupMenu = document.getElementById('builder-group');
+ var builderGroupName =
+ builderGroupMenu.options[builderGroupMenu.selectedIndex].value;
+ var builderGroup = LAYOUT_TESTS_BUILDER_GROUPS[builderGroupName];
+
+ var builderMenu = document.getElementById('builder');
+ while (builderMenu.options[1]) {
+ builderMenu.removeChild(builderMenu.options[1]);
+ }
+
+ for (var builderName in builderGroup.builders) {
+ var builderOption = document.createElement('option');
+ builderOption.textContent = builderOption.value = builderName;
+ builderMenu.appendChild(builderOption);
+ }
+}
+
+function handleBuilderSelected()
+{
+ var builderMenu = document.getElementById('builder');
+ var builderName = builderMenu.options[builderMenu.selectedIndex].value;
+ document.getElementById('builder-frame').src =
+ '/builder/' + builderName + '/queue/edit';
+}
+
+init();
+</script>
+
+</body>
+</html>
diff --git a/Tools/RebaselineQueueServer/templates/builder-queue-edit.html b/Tools/RebaselineQueueServer/templates/builder-queue-edit.html
new file mode 100644
index 0000000..21a0f02
--- /dev/null
+++ b/Tools/RebaselineQueueServer/templates/builder-queue-edit.html
@@ -0,0 +1,176 @@
+<!DOCTYPE html>
+<html id="add-form">
+<head>
+ <title>Rebaseline Queue: Edit</title>
+ <script src="http://test-results.appspot.com/dashboards/builders.js"></script>
+ <link rel="stylesheet" href="/static/styles.css" type="text/css">
+</head>
+<body">
+
+<div id="loading-indicator" class="status">Loading...</div>
+
+<form method="POST" id="form-template" style="display: none">
+ <table class="test-table">
+ <caption></caption>
+ <thead>
+ <th>Test</th>
+ <th>Expected</th>
+ <th>Actual</th>
+ <th>Results</th>
+ </thead>
+ <tbody></tbody>
+ <tbody>
+ <tr>
+ <td colspan="4" class="submit-row">
+ <input type="submit" value="">
+ </td>
+ </tr>
+ </tbody>
+ </table>
+</form>
+
+<script>
+var TEST_RESULTS_SERVER = 'http://test-results.appspot.com/';
+var BUILDER_TO_GROUP = {};
+for (var builderGroupName in LAYOUT_TESTS_BUILDER_GROUPS) {
+ for (var builderName in LAYOUT_TESTS_BUILDER_GROUPS[builderGroupName]) {
+ BUILDER_TO_GROUP[builderName] = builderGroupName;
+ }
+}
+
+// Extract template parameters
+var builderName = '{{ builder_name|escapejs }}';
+var queuedTestNames = {{ queued_test_names|safe }};
+
+function init()
+{
+ var builderMaster = BUILDER_TO_MASTER[builderName];
+ var resultsUrl = TEST_RESULTS_SERVER + 'testfile?builder=' + builderName +
+ '&master=' + builderMaster.name +
+ '&testtype=layout-tests&name=full_results.json';
+
+ var script = document.createElement('script');
+ script.src = resultsUrl;
+ document.getElementsByTagName('head')[0].appendChild(script);
+}
+
+function ADD_RESULTS(results)
+{
+ var builderGroupName = BUILDER_TO_GROUP[builderName];
+
+ var tests = results.tests;
+ var failingTests = [];
+ var queuedTests = [];
+ for (var test in tests) {
+ var testResults = tests[test];
+ if (testResults.actual == testResults.expected ||
+ testResults.expected.split(' ').indexOf(testResults.actual) != -1 ||
+ testResults.actual == 'SKIP' ||
+ testResults.actual.indexOf('PASS') != -1 ||
+ (testResults.actual != 'PASS' && testResults.expected.indexOf('FAIL') != -1)) {
+ continue;
+ }
+
+ testResults.name = test;
+
+ if (queuedTestNames.indexOf(test) != -1) {
+ queuedTests.push(testResults);
+ queuedTestNames.splice(queuedTestNames.indexOf(test), 1);
+ } else {
+ failingTests.push(testResults);
+ }
+ }
+
+ // If we have remaining queued tests that are currently not failing,
+ // synthesize results for them.
+ queuedTestNames.forEach(function(queuedTestName) {
+ queuedTests.push({
+ name: queuedTestName,
+ actual: 'UNKNOWN',
+ expected: 'UNKNOWN'
+ });
+ });
+
+ document.getElementById('loading-indicator').style.display = 'none';
+
+ renderTestResults(
+ failingTests,
+ 'add',
+ 'Failing tests',
+ 'Add to rebaseline queue',
+ 'No failing tests.');
+ renderTestResults(
+ queuedTests,
+ 'remove',
+ 'Queued tests',
+ 'Remove from rebaseline queue',
+ 'No queued tests.');
+}
+
+function renderTestResults(testResults, formAction, title, submitLabel, emptyMessage)
+{
+ if (testResults.length == 0) {
+ var emptyNode = document.createElement('div');
+ emptyNode.className = 'status';
+ emptyNode.textContent = emptyMessage;
+ document.body.appendChild(emptyNode);
+ return;
+ }
+
+ var form = document.getElementById('form-template').cloneNode(true);
+ form.action = '/builder/' + builderName + '/queue/' + formAction;
+ form.style.display = '';
+ document.body.appendChild(form);
+
+ var testsTable = form.querySelector('.test-table');
+ testsTable.querySelector('caption').textContent = title;
+ testsTable.querySelector('input[type=submit]').value = submitLabel;
+
+ testResults.sort(function(a, b) {
+ return a.name < b.name ? -1 : (a.name > b.name ? 1 : 0);
+ });
+
+ testResults.forEach(function(result) {
+ var testRow = document.createElement('tr');
+
+ var testCell = document.createElement('td');
+ testRow.appendChild(testCell);
+ var testCheckbox = document.createElement('input');
+ testCheckbox.type = 'checkbox';
+ testCheckbox.name = 'test';
+ testCheckbox.value = result.name;
+ testCheckbox.id = result.name;
+ testCell.appendChild(testCheckbox);
+
+ var testName = document.createElement('label');
+ testName.textContent = result.name;
+ testName.setAttribute('for', result.name);
+ testCell.appendChild(testName);
+
+ var expectedCell = document.createElement('td');
+ testRow.appendChild(expectedCell);
+ expectedCell.textContent = result.expected;
+
+ var actualCell = document.createElement('td');
+ testRow.appendChild(actualCell);
+ actualCell.textContent = result.actual;
+
+ var resultsCell = document.createElement('td');
+ testRow.appendChild(resultsCell);
+ var resultsLink = document.createElement('a');
+ resultsLink.target = '_blank';
+ resultsLink.href = TEST_RESULTS_SERVER +
+ 'dashboards/flakiness_dashboard.html#tests=' + result.name +
+ '&group=' + builderGroupName;
+ resultsLink.textContent = 'Flakiness dashboard';
+ resultsCell.appendChild(resultsLink);
+
+ testsTable.tBodies[0].appendChild(testRow);
+ });
+}
+
+init();
+</script>
+
+</body>
+</html>
diff --git a/Tools/RebaselineQueueServer/templates/builder-queue-list.html b/Tools/RebaselineQueueServer/templates/builder-queue-list.html
new file mode 100644
index 0000000..79fa02a
--- /dev/null
+++ b/Tools/RebaselineQueueServer/templates/builder-queue-list.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>{{ builder_name|escape }} Queue</title>
+ <link rel="stylesheet" href="/static/styles.css" type="text/css">
+</head>
+<body>
+
+<h1>Queue: {{ builder_name|escape }}</h1>
+
+<ol>
+{% for entry in entries %}
+ <li>
+ {{ entry.test|escape }}
+ </li>
+{% empty %}
+ No tests found in queue.
+{% endfor %}
+</ol>
+
+<a href="/builder/{{ builder_name|escape }}/queue/edit">Edit queue</a>
+</body>
+</html>
diff --git a/Tools/RebaselineQueueServer/templates/home.html b/Tools/RebaselineQueueServer/templates/home.html
new file mode 100644
index 0000000..c6a16ff
--- /dev/null
+++ b/Tools/RebaselineQueueServer/templates/home.html
@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Rebaseline Queue</title>
+ <link rel="stylesheet" href="/static/styles.css" type="text/css">
+</head>
+<body>
+
+<h1>Rebaseline Queue</h1>
+
+<ul>
+ <li><a href="/builder/picker">Browse and enqueue failing tests on builders</a></li>
+ <li>
+ Builders with enqueued tests:
+ <ul>
+{% for builder_name in builder_names %}
+ <li>
+ <a href="/builder/{{ builder_name|escape }}/queue">{{ builder_name|escape }}</a>
+ </li>
+{% empty %}
+ None
+{% endfor %}
+ </ul>
+ </li>
+</ul>
+
+</body>
+</html>