Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(448)

Side by Side Diff: Tools/TestResultServer/static-dashboards/flakiness_dashboard.js

Issue 359533004: Group flakiness results by blink revision (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Revert local app.yaml change Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | Tools/TestResultServer/static-dashboards/flakiness_dashboard_tests.css » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (C) 2012 Google Inc. All rights reserved. 1 // Copyright (C) 2012 Google Inc. All rights reserved.
2 // 2 //
3 // Redistribution and use in source and binary forms, with or without 3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are 4 // modification, are permitted provided that the following conditions are
5 // met: 5 // met:
6 // 6 //
7 // * Redistributions of source code must retain the above copyright 7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer. 8 // notice, this list of conditions and the following disclaimer.
9 // * Redistributions in binary form must reproduce the above 9 // * Redistributions in binary form must reproduce the above
10 // copyright notice, this list of conditions and the following disclaimer 10 // copyright notice, this list of conditions and the following disclaimer
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
535 535
536 html += '</ul>'; 536 html += '</ul>';
537 ui.popup.show(e.target, html); 537 ui.popup.show(e.target, html);
538 } 538 }
539 539
540 function classNameForFailureString(failure) 540 function classNameForFailureString(failure)
541 { 541 {
542 return failure.replace(/(\+|\ )/, ''); 542 return failure.replace(/(\+|\ )/, '');
543 } 543 }
544 544
545 function htmlForTestResults(test) 545 function htmlForTestResults(test, blinkRevisions)
546 { 546 {
547 var html = ''; 547 var html = '';
548 var testResults = test.rawResults.concat(); 548 var testResults = test.rawResults.concat();
549 var times = test.rawTimes.concat(); 549 var times = test.rawTimes.concat();
550 var builder = test.builder; 550 var builder = test.builder;
551 var master = builders.master(builder); 551 var master = builders.master(builder);
552 var buildNumbers = g_resultsByBuilder[builder].buildNumbers; 552 var buildNumbers = g_resultsByBuilder[builder].buildNumbers;
553 553
554 var cells = [];
555 for (var idx = 0; idx < blinkRevisions.length; idx++)
ojan 2014/06/29 03:38:49 nit: s/idx/index
pdr. 2014/06/29 20:51:34 Done.
556 cells.push({revision: blinkRevisions[idx]});
557
554 var indexToReplaceCurrentResult = -1; 558 var indexToReplaceCurrentResult = -1;
555 var indexToReplaceCurrentTime = -1; 559 var indexToReplaceCurrentTime = -1;
556 for (var i = 0; i < buildNumbers.length; i++) { 560 for (var i = 0; i < buildNumbers.length; i++) {
557 var currentResultArray, currentTimeArray, innerHTML, resultString; 561 var currentResultArray, currentTimeArray, innerHTML, resultString;
558 562
559 if (i > indexToReplaceCurrentResult) { 563 if (i > indexToReplaceCurrentResult) {
560 currentResultArray = testResults.shift(); 564 currentResultArray = testResults.shift();
561 if (currentResultArray) { 565 if (currentResultArray) {
562 resultString = g_resultsByBuilder[builder][results.FAILURE_MAP][ currentResultArray[results.RLE.VALUE]]; 566 resultString = g_resultsByBuilder[builder][results.FAILURE_MAP][ currentResultArray[results.RLE.VALUE]];
563 indexToReplaceCurrentResult += currentResultArray[results.RLE.LE NGTH]; 567 indexToReplaceCurrentResult += currentResultArray[results.RLE.LE NGTH];
564 } else { 568 } else {
565 resultString = results.NO_DATA; 569 resultString = results.NO_DATA;
566 indexToReplaceCurrentResult += buildNumbers.length; 570 indexToReplaceCurrentResult += buildNumbers.length;
567 } 571 }
568 } 572 }
569 573
570 if (i > indexToReplaceCurrentTime) { 574 if (i > indexToReplaceCurrentTime) {
571 currentTimeArray = times.shift(); 575 currentTimeArray = times.shift();
572 var currentTime = 0; 576 var currentTime = 0;
573 if (currentResultArray) { 577 if (currentResultArray) {
574 currentTime = currentTimeArray[results.RLE.VALUE]; 578 currentTime = currentTimeArray[results.RLE.VALUE];
575 indexToReplaceCurrentTime += currentTimeArray[results.RLE.LENGTH]; 579 indexToReplaceCurrentTime += currentTimeArray[results.RLE.LENGTH];
576 } else 580 } else
577 indexToReplaceCurrentTime += buildNumbers.length; 581 indexToReplaceCurrentTime += buildNumbers.length;
578 582
579 innerHTML = currentTime || '&nbsp;'; 583 innerHTML = currentTime || '&nbsp;';
580 } 584 }
581 585
582 html += '<td title="' + resultString + '. Click for more info." class="r esults ' + classNameForFailureString(resultString) + 586 var blink = parseInt(g_resultsByBuilder[builder][results.BLINK_REVISIONS ][i], 10);
ojan 2014/06/29 03:38:48 nit: s/blink/blinkRevision
pdr. 2014/06/29 20:51:34 Done.
587
588 // Locate the empty cell corresponding to this blink revision.
589 var cellIndex = -1;
590 for (var idx = 0; idx < cells.length && cellIndex == -1; idx++) {
ojan 2014/06/29 03:38:49 I think this would read more straightforward if yo
pdr. 2014/06/29 20:51:34 Done.
591 if (cells[idx].revision == blink && !cells[idx].html)
592 cellIndex = idx;
593 }
594
595 cells[cellIndex].className = classNameForFailureString(resultString);
596 cells[cellIndex].html = '<td title="' + resultString + '. Click for more info." class="results ' + cells[cellIndex].className +
583 '" onclick=\'showPopupForBuild(event, "' + builder + '",' + i + ',"' + test.test + '")\'>' + innerHTML; 597 '" onclick=\'showPopupForBuild(event, "' + builder + '",' + i + ',"' + test.test + '")\'>' + innerHTML;
584 } 598 }
599
600 // Set nextClassName on all cells.
ojan 2014/06/29 03:38:49 Nit: unhelpful comment.
pdr. 2014/06/29 20:51:34 Done.
601 for (var idx = 1; idx < cells.length; idx++)
602 cells[idx].nextClassName = cells[idx - 1].className || cells[idx - 1].ne xtClassName;
603
604 // Set prevClassName on all cells.
ojan 2014/06/29 03:38:49 Nit: unhelpful comment.
pdr. 2014/06/29 20:51:34 Done.
605 for (var idx = cells.length - 2; idx >= 0; --idx)
606 cells[idx].prevClassName = cells[idx + 1].className || cells[idx + 1].pr evClassName;
607
608 var numResultsToShow = buildNumbers.length;
609 for (var idx = cells.length - 1; idx >= (cells.length - numResultsToShow); - -idx) {
610 if (cells[idx].html) {
611 html += cells[idx].html;
612 } else {
613 if (cells[idx].nextClassName == cells[idx].prevClassName)
614 html += '<td class="interpolatedResults results ' + cells[idx].n extClassName + '">&nbsp;</td>';
ojan 2014/06/29 03:38:49 Should put a title on these so people can understa
pdr. 2014/06/29 20:51:34 Done.
615 else
616 html += '<td>&nbsp;</td>';
617 }
618 }
585 return html; 619 return html;
586 } 620 }
587 621
588 function shouldShowTest(testResult) 622 function shouldShowTest(testResult)
589 { 623 {
590 if (!g_history.isLayoutTestResults()) 624 if (!g_history.isLayoutTestResults())
591 return true; 625 return true;
592 626
593 if (testResult.expectations == 'WONTFIX') 627 if (testResult.expectations == 'WONTFIX')
594 return g_history.dashboardSpecificState.showWontFix; 628 return g_history.dashboardSpecificState.showWontFix;
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
642 var bugHtml; 676 var bugHtml;
643 if (string.startsWith(bug, 'Bug(')) 677 if (string.startsWith(bug, 'Bug('))
644 bugHtml = bug; 678 bugHtml = bug;
645 else 679 else
646 bugHtml = '<a href="http://' + bug + '">' + bug + '</a>'; 680 bugHtml = '<a href="http://' + bug + '">' + bug + '</a>';
647 html += '<div>' + bugHtml + '</div>' 681 html += '<div>' + bugHtml + '</div>'
648 }); 682 });
649 return html; 683 return html;
650 } 684 }
651 685
652 function htmlForSingleTestRow(test, showBuilderNames) 686 function htmlForSingleTestRow(test, showBuilderNames, revisions)
653 { 687 {
654 var headers = tableHeaders(); 688 var headers = tableHeaders();
655 var html = ''; 689 var html = '';
656 for (var i = 0; i < headers.length; i++) { 690 for (var i = 0; i < headers.length; i++) {
657 var header = headers[i]; 691 var header = headers[i];
658 if (string.startsWith(header, 'test') || string.startsWith(header, 'buil der')) { 692 if (string.startsWith(header, 'test') || string.startsWith(header, 'buil der')) {
659 var testCellClassName = 'test-link' + (showBuilderNames ? ' builder- name' : ''); 693 var testCellClassName = 'test-link' + (showBuilderNames ? ' builder- name' : '');
660 var testCellHTML = showBuilderNames ? test.builder : '<span class="l ink" onclick="g_history.setQueryParameter(\'tests\',\'' + test.test +'\');">' + test.test + '</span>'; 694 var testCellHTML = showBuilderNames ? test.builder : '<span class="l ink" onclick="g_history.setQueryParameter(\'tests\',\'' + test.test +'\');">' + test.test + '</span>';
661 html += '<tr><td class="' + testCellClassName + '">' + testCellHTML; 695 html += '<tr><td class="' + testCellClassName + '">' + testCellHTML;
662 } else if (string.startsWith(header, 'bugs')) 696 } else if (string.startsWith(header, 'bugs'))
663 // FIXME: linkify bugs. 697 // FIXME: linkify bugs.
664 html += '<td class=options-container>' + (linkifyBugs(test.bugs) || createBugHTML(test)); 698 html += '<td class=options-container>' + (linkifyBugs(test.bugs) || createBugHTML(test));
665 else if (string.startsWith(header, 'expectations')) 699 else if (string.startsWith(header, 'expectations'))
666 html += '<td class=options-container>' + test.expectations; 700 html += '<td class=options-container>' + test.expectations;
667 else if (string.startsWith(header, 'slowest')) 701 else if (string.startsWith(header, 'slowest'))
668 html += '<td>' + (test.slowestTime ? test.slowestTime + 's' : ''); 702 html += '<td>' + (test.slowestTime ? test.slowestTime + 's' : '');
669 else if (string.startsWith(header, 'flakiness')) 703 else if (string.startsWith(header, 'flakiness'))
670 html += htmlForTestResults(test); 704 html += htmlForTestResults(test, revisions);
671 } 705 }
672 return html; 706 return html;
673 } 707 }
674 708
675 function sortColumnFromTableHeader(headerText) 709 function sortColumnFromTableHeader(headerText)
676 { 710 {
677 return headerText.split(' ', 1)[0]; 711 return headerText.split(' ', 1)[0];
678 } 712 }
679 713
680 function htmlForTableColumnHeader(headerName, opt_fillColSpan) 714 function htmlForTableColumnHeader(headerName, opt_fillColSpan)
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
776 sortFunctionGetter = numericSort; 810 sortFunctionGetter = numericSort;
777 resultsProperty = 'slowestTime'; 811 resultsProperty = 'slowestTime';
778 } else { 812 } else {
779 sortFunctionGetter = alphanumericCompare; 813 sortFunctionGetter = alphanumericCompare;
780 resultsProperty = column; 814 resultsProperty = column;
781 } 815 }
782 816
783 tests.sort(sortFunctionGetter(resultsProperty, order == BACKWARD)); 817 tests.sort(sortFunctionGetter(resultsProperty, order == BACKWARD));
784 } 818 }
785 819
820 // Return an array of unique blink build revisions across all builders.
821 // The array contains blink revisions but note that these revisions may not be
822 // unique: builds of blink@r123,chrome@r567 and blink@r123,chrome@r568 will
823 // result in two entries of 123 in the returned array.
824 function blinkBuildRevisions(testResults)
825 {
826 var revisionsCountedSet = {};
827 for (var j = 0; j < testResults.length; j++) {
828 var builder = testResults[j].builder;
829 var build = g_resultsByBuilder[builder];
830 var buildNumbers = build.buildNumbers;
831 var builderRevisionsCountedSet = {};
832 for (var i = 0; i < buildNumbers.length; i++) {
833 var blinkRevision = build[results.BLINK_REVISIONS][i];
834 builderRevisionsCountedSet[blinkRevision] = (builderRevisionsCounted Set[blinkRevision] || 0) + 1;
835 }
836
837 // Join the builder's revisions with the total revisions for all builder s.
838 for (var revision in builderRevisionsCountedSet)
839 revisionsCountedSet[revision] = Math.max(revisionsCountedSet[revisio n] || 0, builderRevisionsCountedSet[revision]);
840 }
841
842 var revisionsArray = [];
843 for (var revision in revisionsCountedSet) {
844 for (var i = revisionsCountedSet[revision] - 1; i >= 0; --i)
845 revisionsArray.push(revision);
846 }
847
848 revisionsArray.sort(function(a, b) {
849 return (a - b);
850 });
851 return revisionsArray;
852 }
853
786 function htmlForIndividualTestOnAllBuilders(test) 854 function htmlForIndividualTestOnAllBuilders(test)
787 { 855 {
788 processTestRunsForAllBuilders(); 856 processTestRunsForAllBuilders();
789 857
790 var testResults = g_testToResultsMap[test]; 858 var testResults = g_testToResultsMap[test];
791 if (!testResults) 859 if (!testResults)
792 return '<div class="not-found">Test not found. Either it does not exist, is skipped or passes on all recorded runs.</div>'; 860 return '<div class="not-found">Test not found. Either it does not exist, is skipped or passes on all recorded runs.</div>';
793 861
794 var html = ''; 862 var html = '';
795 var shownBuilders = []; 863 var shownBuilders = [];
864 var blinkRevisions = blinkBuildRevisions(testResults);
796 for (var j = 0; j < testResults.length; j++) { 865 for (var j = 0; j < testResults.length; j++) {
797 shownBuilders.push(testResults[j].builder); 866 shownBuilders.push(testResults[j].builder);
798 var showBuilderNames = true; 867 var showBuilderNames = true;
799 html += htmlForSingleTestRow(testResults[j], showBuilderNames); 868 html += htmlForSingleTestRow(testResults[j], showBuilderNames, blinkRevi sions);
800 } 869 }
801 870
802 var skippedBuilders = [] 871 var skippedBuilders = []
803 for (builder in currentBuilders()) { 872 for (builder in currentBuilders()) {
804 if (shownBuilders.indexOf(builder) == -1) 873 if (shownBuilders.indexOf(builder) == -1)
805 skippedBuilders.push(builder); 874 skippedBuilders.push(builder);
806 } 875 }
807 876
808 var skippedBuildersHtml = ''; 877 var skippedBuildersHtml = '';
809 if (skippedBuilders.length) { 878 if (skippedBuilders.length) {
(...skipping 444 matching lines...) Expand 10 before | Expand all | Expand 10 after
1254 { 1323 {
1255 processTestRunsForBuilder(builderName); 1324 processTestRunsForBuilder(builderName);
1256 1325
1257 var filteredResults = g_perBuilderFailures[builderName].filter(shouldShowTes t); 1326 var filteredResults = g_perBuilderFailures[builderName].filter(shouldShowTes t);
1258 sortTests(filteredResults, g_history.dashboardSpecificState.sortColumn, g_hi story.dashboardSpecificState.sortOrder); 1327 sortTests(filteredResults, g_history.dashboardSpecificState.sortColumn, g_hi story.dashboardSpecificState.sortOrder);
1259 1328
1260 var testsHTML = ''; 1329 var testsHTML = '';
1261 if (filteredResults.length) { 1330 if (filteredResults.length) {
1262 var tableRowsHTML = ''; 1331 var tableRowsHTML = '';
1263 var showBuilderNames = false; 1332 var showBuilderNames = false;
1333 var blinkRevisions = blinkBuildRevisions(testResults);
1264 for (var i = 0; i < filteredResults.length; i++) 1334 for (var i = 0; i < filteredResults.length; i++)
1265 tableRowsHTML += htmlForSingleTestRow(filteredResults[i], showBuilde rNames) 1335 tableRowsHTML += htmlForSingleTestRow(filteredResults[i], showBuilde rNames, blinkRevisions)
1266 testsHTML = htmlForTestTable(tableRowsHTML); 1336 testsHTML = htmlForTestTable(tableRowsHTML);
1267 } else { 1337 } else {
1268 if (g_history.isLayoutTestResults()) 1338 if (g_history.isLayoutTestResults())
1269 testsHTML += '<div>Fill in one of the text inputs or checkboxes abov e to show failures.</div>'; 1339 testsHTML += '<div>Fill in one of the text inputs or checkboxes abov e to show failures.</div>';
1270 else 1340 else
1271 testsHTML += '<div>No tests have failed!</div>'; 1341 testsHTML += '<div>No tests have failed!</div>';
1272 } 1342 }
1273 1343
1274 var html = htmlForNavBar(); 1344 var html = htmlForNavBar();
1275 1345
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
1380 // escape key 1450 // escape key
1381 hideLegend(); 1451 hideLegend();
1382 ui.popup.hide(); 1452 ui.popup.hide();
1383 } 1453 }
1384 }, false); 1454 }, false);
1385 1455
1386 window.addEventListener('load', function() { 1456 window.addEventListener('load', function() {
1387 resourceLoader = new loader.Loader(); 1457 resourceLoader = new loader.Loader();
1388 resourceLoader.load(); 1458 resourceLoader.load();
1389 }, false); 1459 }, false);
OLDNEW
« no previous file with comments | « no previous file | Tools/TestResultServer/static-dashboards/flakiness_dashboard_tests.css » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698