| OLD | NEW |
| 1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
| 2 <head> | 2 <head> |
| 3 <meta charset="UTF-8"> | 3 <meta charset="UTF-8"> |
| 4 <title> Find Regression Range for Flaky Test</title> | 4 <title> Find Regression Range for Flaky Test</title> |
| 5 <style type="text/css"> | 5 <style type="text/css"> |
| 6 .container { | 6 .container { |
| 7 box-sizing: border-box; | 7 box-sizing: border-box; |
| 8 width: 600px; | 8 width: 600px; |
| 9 height: 300px; | 9 height: 300px; |
| 10 padding: 20px 20px 20px 20px; | 10 padding: 20px 20px 20px 20px; |
| 11 border: 1px solid #ddd; | 11 border: 1px solid #ddd; |
| 12 background: #fff; | 12 background: #fff; |
| 13 background: linear-gradient(#f6f6f6 0, #fff 50px); | 13 background: linear-gradient(#f6f6f6 0, #fff 50px); |
| 14 background: -o-linear-gradient(#f6f6f6 0, #fff 50px); | 14 background: -o-linear-gradient(#f6f6f6 0, #fff 50px); |
| 15 background: -ms-linear-gradient(#f6f6f6 0, #fff 50px); | 15 background: -ms-linear-gradient(#f6f6f6 0, #fff 50px); |
| 16 background: -moz-linear-gradient(#f6f6f6 0, #fff 50px); | 16 background: -moz-linear-gradient(#f6f6f6 0, #fff 50px); |
| 17 background: -webkit-linear-gradient(#f6f6f6 0, #fff 50px); | 17 background: -webkit-linear-gradient(#f6f6f6 0, #fff 50px); |
| 18 box-shadow: 0 3px 10px rgba(0,0,0,0.15); | 18 box-shadow: 0 3px 10px rgba(0,0,0,0.15); |
| 19 -o-box-shadow: 0 3px 10px rgba(0,0,0,0.1); | 19 -o-box-shadow: 0 3px 10px rgba(0,0,0,0.1); |
| 20 -ms-box-shadow: 0 3px 10px rgba(0,0,0,0.1); | 20 -ms-box-shadow: 0 3px 10px rgba(0,0,0,0.1); |
| 21 -moz-box-shadow: 0 3px 10px rgba(0,0,0,0.1); | 21 -moz-box-shadow: 0 3px 10px rgba(0,0,0,0.1); |
| 22 -webkit-box-shadow: 0 3px 10px rgba(0,0,0,0.1); | 22 -webkit-box-shadow: 0 3px 10px rgba(0,0,0,0.1); |
| 23 } | 23 } |
| 24 .flake-trend { | 24 .flake-trend { |
| 25 width: 100%; | 25 width: 100%; |
| 26 height: 100%; | 26 height: 100%; |
| 27 font-size: 16px; | 27 font-size: 16px; |
| 28 line-height: 1.2em; | 28 line-height: 1.2em; |
| 29 } | 29 } |
| 30 .triage-table, .triage-header, .triage-cell { |
| 31 border: 1px solid; |
| 32 border-collapse: collapse; |
| 33 } |
| 34 .triage-header, .triage-cell { |
| 35 padding: 5px; |
| 36 } |
| 37 .triage-header { |
| 38 text-align: center; |
| 39 } |
| 40 .triage-cell { |
| 41 text-align: left; |
| 42 } |
| 30 </style> | 43 </style> |
| 31 <link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/
libs/jqueryui/1.11.1/themes/smoothness/jquery-ui.css"> | 44 <link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/
libs/jqueryui/1.11.1/themes/smoothness/jquery-ui.css"> |
| 32 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
"></script> | 45 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js
"></script> |
| 33 <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.m
in.js"></script> | 46 <script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.m
in.js"></script> |
| 34 <script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.min
.js"></script> | 47 <script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.min
.js"></script> |
| 35 <script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.res
ize.js"></script> | 48 <script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.res
ize.js"></script> |
| 36 <script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.sym
bol.js"></script> | 49 <script src="https://cdnjs.cloudflare.com/ajax/libs/flot/0.8.3/jquery.flot.sym
bol.js"></script> |
| 37 <script type="text/javascript"> | 50 <script type="text/javascript"> |
| 38 var findit = {}; | 51 var findit = {}; |
| 39 findit.masterName = "{{ master_name }}"; | 52 findit.masterName = "{{ master_name }}"; |
| 40 findit.builderName = "{{ builder_name }}"; | 53 findit.builderName = "{{ builder_name }}"; |
| 41 findit.regressedBuildNumber = {{ suspected_flake_build_number or -1 }}; | 54 findit.regressedBuildNumber = {{ suspected_flake.build_number or -1 }}; |
| 42 findit.passRates = {{ pass_rates | tojson | safe }}; | 55 findit.passRates = {{ pass_rates | tojson | safe }}; |
| 43 | 56 |
| 44 function DrawFlakeTrend() { | 57 function DrawFlakeTrend() { |
| 45 if (findit.passRates.length == 0) { | 58 if (findit.passRates.length == 0) { |
| 46 $('#flake-data').html('No data available yet.'); | 59 $('#flake-data').html('No data available yet.'); |
| 47 return; | 60 return; |
| 48 } | 61 } |
| 49 | 62 |
| 50 var not_run_data = []; | 63 var not_run_data = []; |
| 51 var run_data = []; | 64 var run_data = []; |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 dataPointSelected = false; // Unselect the data point. | 167 dataPointSelected = false; // Unselect the data point. |
| 155 $("#tooltip").hide(); | 168 $("#tooltip").hide(); |
| 156 } | 169 } |
| 157 }); | 170 }); |
| 158 | 171 |
| 159 $.each(run_data, function(index, value) { | 172 $.each(run_data, function(index, value) { |
| 160 if (value[0] == findit.regressedBuildNumber) | 173 if (value[0] == findit.regressedBuildNumber) |
| 161 plot.highlight(run_data_sery_index, index); | 174 plot.highlight(run_data_sery_index, index); |
| 162 }); | 175 }); |
| 163 } | 176 } |
| 177 |
| 178 function triageSuspectedFlake(e) { |
| 179 $.getJSON('/waterfall/triage-flake-analysis?flake_info=' + e.name + '&tria
ge_result=' + e.value, function(data) { |
| 180 if (! data['success']) { |
| 181 alert('Failed to update datastore. Please refresh and try again.'); |
| 182 } else { |
| 183 $('#flake_result_triaged').html('Result has been recorded. Thank you.'
) |
| 184 } |
| 185 }).error(function(xhr) { |
| 186 // Replace the whole page with errors from server side. |
| 187 document.body.outerHTML = xhr.responseText; |
| 188 }); |
| 189 } |
| 190 |
| 164 $(document).ready(DrawFlakeTrend); | 191 $(document).ready(DrawFlakeTrend); |
| 165 </script> | 192 </script> |
| 166 </head> | 193 </head> |
| 167 | |
| 168 <body> | 194 <body> |
| 169 <div> | 195 <div> |
| 170 <b>Flaky Test:</b><br> | 196 <b>Flaky Test:</b><br> |
| 171 Master: {{ master_name }} <br> | 197 Master: {{ master_name }} <br> |
| 172 Builder: {{ builder_name }} <br> | 198 Builder: {{ builder_name }} <br> |
| 173 Step: {{ step_name }} <br> | 199 Step: {{ step_name }} <br> |
| 174 Test: {{ test_name }} <br> | 200 Test: {{ test_name }} <br> |
| 175 </div> | 201 </div> |
| 176 <br> | 202 <br> |
| 177 <div> | 203 <div> |
| (...skipping 21 matching lines...) Expand all Loading... |
| 199 Request time: {{ request_time }}<br> | 225 Request time: {{ request_time }}<br> |
| 200 {% endif %} | 226 {% endif %} |
| 201 {% if pending_time %} | 227 {% if pending_time %} |
| 202 Pending time: {{ pending_time }}<br> | 228 Pending time: {{ pending_time }}<br> |
| 203 {% endif %} | 229 {% endif %} |
| 204 {% if duration %} | 230 {% if duration %} |
| 205 Duration: {{ duration }}<br> | 231 Duration: {{ duration }}<br> |
| 206 {% endif %} | 232 {% endif %} |
| 207 Number of Swarm tasks: {{ task_number }} | 233 Number of Swarm tasks: {{ task_number }} |
| 208 </div> | 234 </div> |
| 235 <br> |
| 236 <div id="triage_flake"> |
| 237 {% if suspected_flake %} |
| 238 <b>Feedback on Flake Analysis result:</b> |
| 239 <table class="triage-table"> |
| 240 <tr> |
| 241 <th class="triage-header">Suspected Flake Build Number</th> |
| 242 <th class="triage-header">Feedback</th> |
| 243 </tr> |
| 244 <tr> |
| 245 <td class="triage-cell"><a href="https://build.chromium.org/p/{{ maste
r_name }}/builders/{{ builder_name }}/builds/{{ suspected_flake.build_number }}"
target="_blank">{{ suspected_flake.build_number }}</a></a></td> |
| 246 <td class="triage-cell"> |
| 247 {% set flake_info = master_name + '/' + builder_name + '/' + build_n
umber | string + '/' + step_name + '/' + test_name + '/' + version_number | stri
ng + '/' + suspected_flake.build_number | string %} |
| 248 {% if suspected_flake.triage_result == 1 %} |
| 249 <input type="radio" name="{{ flake_info }}" value="2" onchange="
triageSuspectedFlake(this)">Correct |
| 250 <input type="radio" name="{{ flake_info }}" value="1" checked="c
hecked"onchange= "triageSuspectedFlake(this)">Incorrect |
| 251 {% elif suspected_flake.triage_result == 2 %} |
| 252 <input type="radio" name="{{ flake_info }}" value="2" checked="c
hecked" onchange="triageSuspectedFlake(this)">Correct |
| 253 <input type="radio" name="{{ flake_info }}" value="1" onchange=
"triageSuspectedFlake(this)">Incorrect |
| 254 {% else %} |
| 255 <input type="radio" name="{{ flake_info }}" value="2" onchange="
triageSuspectedFlake(this)">Correct |
| 256 <input type="radio" name="{{ flake_info }}" value="1" onchange=
"triageSuspectedFlake(this)">Incorrect |
| 257 {% endif %} |
| 258 </td> |
| 259 </tr> |
| 260 </table> |
| 261 {% endif %} |
| 262 <div id="flake_result_triaged"></div> |
| 263 </div> |
| 264 |
| 265 {% if show_debug_info and triage_history %} |
| 266 <br> |
| 267 <b>Triage history:</b> |
| 268 <div> |
| 269 <table class="triage-table"> |
| 270 <tr> |
| 271 <th class="triage-header">When</th> |
| 272 <th class="triage-header">Who</th> |
| 273 <th class="triage-header">Suspected Build Number</th> |
| 274 <th class="triage-header">Result</th> |
| 275 <th class="triage-header">Analysis Version Number</th> |
| 276 </tr> |
| 277 <tbody> |
| 278 {% for triage_record in triage_history %} |
| 279 <tr> |
| 280 <td class="triage-cell">{{ triage_record.triaged_time }}</td> |
| 281 <td class="triage-cell">{{ triage_record.user_name }}</td> |
| 282 <td class="triage-cell"><a href="https://build.chromium.org/p/{{ m
aster_name }}/builders/{{ builder_name }}/builds/{{ triage_record.suspect_info.b
uild_number }}" target="_blank">{{ triage_record.suspect_info.build_number }}</a
></a></td> |
| 283 <td class="triage-cell">{{ triage_record.triage_result }}</td> |
| 284 <td class="triage-cell">{{ triage_record.version_number }}</td> |
| 285 </tr> |
| 286 {% endfor %} |
| 287 </tbody> |
| 288 </table> |
| 289 </div> |
| 290 {% endif %} |
| 209 </body> | 291 </body> |
| 210 </html> | 292 </html> |
| OLD | NEW |