| OLD | NEW |
| 1 # Copyright 2016 The Chromium Authors. All rights reserved. | 1 # Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be | 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. | 3 # found in the LICENSE file. |
| 4 import base64 | 4 import base64 |
| 5 import copy | 5 import copy |
| 6 from datetime import datetime | 6 from datetime import datetime |
| 7 from datetime import time | 7 from datetime import time |
| 8 from datetime import timedelta | 8 from datetime import timedelta |
| 9 import json | 9 import json |
| 10 | 10 |
| 11 import webapp2 | 11 import webapp2 |
| 12 | 12 |
| 13 from testing_utils import testing | 13 from testing_utils import testing |
| 14 | 14 |
| 15 from common import time_util | 15 from common import time_util |
| 16 from handlers.crash import fracas_dashboard | 16 from handlers.crash import fracas_dashboard |
| 17 from model import analysis_status | 17 from model import analysis_status |
| 18 from model import result_status | 18 from model import result_status |
| 19 from model import triage_status | 19 from model import triage_status |
| 20 from model.crash.fracas_crash_analysis import FracasCrashAnalysis | 20 from model.crash.fracas_crash_analysis import FracasCrashAnalysis |
| 21 | 21 |
| 22 # TODO: Remove, see crbug.com/624998 | |
| 23 #pylint: disable=unused-variable | |
| 24 | 22 |
| 25 class FracasDashBoardTest(testing.AppengineTestCase): | 23 class FracasDashBoardTest(testing.AppengineTestCase): |
| 26 app_module = webapp2.WSGIApplication( | 24 app_module = webapp2.WSGIApplication( |
| 27 [('/fracas-dashboard', fracas_dashboard.FracasDashBoard), ], debug=True) | 25 [('/fracas-dashboard', fracas_dashboard.FracasDashBoard), ], debug=True) |
| 28 | 26 |
| 29 def setUp(self): | 27 def setUp(self): |
| 30 super(FracasDashBoardTest, self).setUp() | 28 super(FracasDashBoardTest, self).setUp() |
| 31 self.keys = self._AddAnalysisResults() | 29 self.keys = self._AddAnalysisResults() |
| 32 self.fracas_crashes = [] | 30 self.fracas_crashes = [] |
| 33 for key in self.keys: | 31 for key in self.keys: |
| 34 self.fracas_crashes.append(self._GenerateDisplayData(key)) | 32 self.fracas_crashes.append(self._GenerateDisplayData(key)) |
| 35 | 33 |
| 36 midnight_today = datetime.combine(datetime.utcnow(), time.min) | 34 self.default_start_date = datetime(2016, 7, 3, 0, 0, 0, 0) |
| 37 midnight_yesterday = midnight_today - timedelta(days=1) | 35 self.default_end_date = datetime(2016, 7, 5, 0, 0, 0, 0) |
| 38 midnight_tomorrow = midnight_today + timedelta(days=1) | |
| 39 self.default_start_date = midnight_yesterday | |
| 40 self.default_end_date = midnight_tomorrow | |
| 41 | 36 |
| 42 def testFracasDashBoardHandler(self): | 37 def testFracasDashBoardHandler(self): |
| 43 response = self.test_app.get('/fracas-dashboard') | 38 response = self.test_app.get('/fracas-dashboard') |
| 44 self.assertEqual(200, response.status_int) | 39 self.assertEqual(200, response.status_int) |
| 45 | 40 |
| 46 def _CreateAnalysisResult(self, crash_identifiers): | 41 def _CreateAnalysisResult(self, crash_identifiers): |
| 47 analysis = FracasCrashAnalysis.Create(crash_identifiers) | 42 analysis = FracasCrashAnalysis.Create(crash_identifiers) |
| 48 analysis.status = analysis_status.RUNNING | 43 analysis.status = analysis_status.RUNNING |
| 49 return analysis | 44 return analysis |
| 50 | 45 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 'suspected_project': 'chromium', | 107 'suspected_project': 'chromium', |
| 113 'regression_range': ['53.0.2749.0', '53.0.2750.0']} | 108 'regression_range': ['53.0.2749.0', '53.0.2750.0']} |
| 114 analyses[3].found_suspects = True | 109 analyses[3].found_suspects = True |
| 115 analyses[4].result = {'found': False, | 110 analyses[4].result = {'found': False, |
| 116 'suspected_cls': [], | 111 'suspected_cls': [], |
| 117 'suspected_components': ['Blink>API', 'Blink>DOM'], | 112 'suspected_components': ['Blink>API', 'Blink>DOM'], |
| 118 'suspected_project': 'chromium', | 113 'suspected_project': 'chromium', |
| 119 'regression_range': ['53.0.2749.0', '53.0.2750.0']} | 114 'regression_range': ['53.0.2749.0', '53.0.2750.0']} |
| 120 analyses[4].found_suspects = False | 115 analyses[4].found_suspects = False |
| 121 | 116 |
| 122 start_request_time = datetime.utcnow() | |
| 123 for i, analysis in enumerate(analyses): | |
| 124 analysis.requested_time = (start_request_time + | |
| 125 timedelta(minutes=10 * i)) | |
| 126 | |
| 127 analysis.has_regression_range = not analysis.result[ | |
| 128 'regression_range'] is None | |
| 129 | |
| 130 self._SetResultsTriageStatus(analyses[0], triage_status.TRIAGED_INCORRECT) | 117 self._SetResultsTriageStatus(analyses[0], triage_status.TRIAGED_INCORRECT) |
| 131 self._SetResultsTriageStatus(analyses[1], triage_status.TRIAGED_CORRECT) | 118 self._SetResultsTriageStatus(analyses[1], triage_status.TRIAGED_CORRECT) |
| 132 self._SetResultsTriageStatus(analyses[3], triage_status.TRIAGED_CORRECT) | 119 self._SetResultsTriageStatus(analyses[3], triage_status.TRIAGED_CORRECT) |
| 133 self._SetResultsTriageStatus(analyses[4], triage_status.TRIAGED_UNSURE) | 120 self._SetResultsTriageStatus(analyses[4], triage_status.TRIAGED_UNSURE) |
| 134 | 121 |
| 135 for analysis in analyses: | 122 for i, analysis in enumerate(analyses): |
| 123 analysis.requested_time = (datetime(2016, 7, 4, 12, 50, 17, 0) + |
| 124 timedelta(seconds=10 * i)) |
| 125 analysis.has_regression_range = not analysis.result[ |
| 126 'regression_range'] is None |
| 136 analysis.put() | 127 analysis.put() |
| 137 | 128 |
| 138 return keys | 129 return keys |
| 139 | 130 |
| 140 def _GenerateDisplayData(self, crash_identifiers): | 131 def _GenerateDisplayData(self, crash_identifiers): |
| 141 crash = FracasCrashAnalysis.Get(crash_identifiers) | 132 crash = FracasCrashAnalysis.Get(crash_identifiers) |
| 142 return { | 133 return { |
| 143 'signature': crash.signature, | 134 'signature': crash.signature, |
| 144 'version': crash.crashed_version, | 135 'version': crash.crashed_version, |
| 145 'channel': crash.channel, | 136 'channel': crash.channel, |
| (...skipping 16 matching lines...) Expand all Loading... |
| 162 self.fracas_crashes[1], | 153 self.fracas_crashes[1], |
| 163 self.fracas_crashes[0]], | 154 self.fracas_crashes[0]], |
| 164 'end_date': time_util.FormatDatetime(self.default_end_date), | 155 'end_date': time_util.FormatDatetime(self.default_end_date), |
| 165 'regression_range_triage_status': '-1', | 156 'regression_range_triage_status': '-1', |
| 166 'suspected_cls_triage_status': '-1', | 157 'suspected_cls_triage_status': '-1', |
| 167 'found_suspects': '-1', | 158 'found_suspects': '-1', |
| 168 'has_regression_range': '-1', | 159 'has_regression_range': '-1', |
| 169 'start_date': time_util.FormatDatetime(self.default_start_date) | 160 'start_date': time_util.FormatDatetime(self.default_start_date) |
| 170 } | 161 } |
| 171 | 162 |
| 172 response_json = self.test_app.get('/fracas-dashboard?format=json') | 163 response_json = self.test_app.get('/fracas-dashboard?format=json' |
| 164 '&start_date=2016-07-03' |
| 165 '&end_date=2016-07-05') |
| 173 self.assertEqual(200, response_json.status_int) | 166 self.assertEqual(200, response_json.status_int) |
| 174 # TODO: Re-enable, see crbug.com/624998 | 167 self.assertEqual(expected_result, response_json.json_body) |
| 175 # self.assertEqual(expected_result, response_json.json_body) | |
| 176 | 168 |
| 177 def testFilterWithFoundSuspects(self): | 169 def testFilterWithFoundSuspects(self): |
| 178 expected_result = { | 170 expected_result = { |
| 179 'fracas_crashes': [self.fracas_crashes[3], | 171 'fracas_crashes': [self.fracas_crashes[3], |
| 180 self.fracas_crashes[0]], | 172 self.fracas_crashes[0]], |
| 181 'end_date': time_util.FormatDatetime(self.default_end_date), | 173 'end_date': time_util.FormatDatetime(self.default_end_date), |
| 182 'regression_range_triage_status': '-1', | 174 'regression_range_triage_status': '-1', |
| 183 'suspected_cls_triage_status': '-1', | 175 'suspected_cls_triage_status': '-1', |
| 184 'found_suspects': 'yes', | 176 'found_suspects': 'yes', |
| 185 'has_regression_range': '-1', | 177 'has_regression_range': '-1', |
| 186 'start_date': time_util.FormatDatetime(self.default_start_date) | 178 'start_date': time_util.FormatDatetime(self.default_start_date) |
| 187 } | 179 } |
| 188 | 180 |
| 189 response_json = self.test_app.get( | 181 response_json = self.test_app.get( |
| 190 '/fracas-dashboard?found_suspects=yes&format=json') | 182 '/fracas-dashboard?found_suspects=yes&format=json' |
| 183 '&start_date=2016-07-03&end_date=2016-07-05') |
| 191 self.assertEqual(200, response_json.status_int) | 184 self.assertEqual(200, response_json.status_int) |
| 192 self.assertEqual(expected_result, response_json.json_body) | 185 self.assertEqual(expected_result, response_json.json_body) |
| 193 | 186 |
| 194 def testFilterWithHasRegression(self): | 187 def testFilterWithHasRegression(self): |
| 195 expected_result = { | 188 expected_result = { |
| 196 'fracas_crashes': [self.fracas_crashes[4], | 189 'fracas_crashes': [self.fracas_crashes[4], |
| 197 self.fracas_crashes[3], | 190 self.fracas_crashes[3], |
| 198 self.fracas_crashes[2]], | 191 self.fracas_crashes[2]], |
| 199 'end_date': time_util.FormatDatetime(self.default_end_date), | 192 'end_date': time_util.FormatDatetime(self.default_end_date), |
| 200 'regression_range_triage_status': '-1', | 193 'regression_range_triage_status': '-1', |
| 201 'suspected_cls_triage_status': '-1', | 194 'suspected_cls_triage_status': '-1', |
| 202 'found_suspects': '-1', | 195 'found_suspects': '-1', |
| 203 'has_regression_range': 'yes', | 196 'has_regression_range': 'yes', |
| 204 'start_date': time_util.FormatDatetime(self.default_start_date) | 197 'start_date': time_util.FormatDatetime(self.default_start_date) |
| 205 } | 198 } |
| 206 | 199 |
| 207 response_json = self.test_app.get( | 200 response_json = self.test_app.get( |
| 208 '/fracas-dashboard?has_regression_range=yes&format=json') | 201 '/fracas-dashboard?has_regression_range=yes&format=json' |
| 202 '&start_date=2016-07-03&end_date=2016-07-05') |
| 209 self.assertEqual(200, response_json.status_int) | 203 self.assertEqual(200, response_json.status_int) |
| 210 # TODO: Re-enable, see crbug.com/624998 | 204 self.assertEqual(expected_result, response_json.json_body) |
| 211 # self.assertEqual(expected_result, response_json.json_body) | |
| 212 | 205 |
| 213 def testFilterWithSuspectsUntriaged(self): | 206 def testFilterWithSuspectsUntriaged(self): |
| 214 expected_result = { | 207 expected_result = { |
| 215 'fracas_crashes': [self.fracas_crashes[2]], | 208 'fracas_crashes': [self.fracas_crashes[2]], |
| 216 'end_date': time_util.FormatDatetime(self.default_end_date), | 209 'end_date': time_util.FormatDatetime(self.default_end_date), |
| 217 'regression_range_triage_status': '-1', | 210 'regression_range_triage_status': '-1', |
| 218 'suspected_cls_triage_status': str(triage_status.UNTRIAGED), | 211 'suspected_cls_triage_status': str(triage_status.UNTRIAGED), |
| 219 'found_suspects': '-1', | 212 'found_suspects': '-1', |
| 220 'has_regression_range': '-1', | 213 'has_regression_range': '-1', |
| 221 'start_date': time_util.FormatDatetime(self.default_start_date) | 214 'start_date': time_util.FormatDatetime(self.default_start_date) |
| 222 } | 215 } |
| 223 | 216 |
| 224 response_json = self.test_app.get( | 217 response_json = self.test_app.get( |
| 225 '/fracas-dashboard?suspected_cls_triage_status=%d&format=json' % | 218 '/fracas-dashboard?suspected_cls_triage_status=%d&format=json' |
| 226 triage_status.UNTRIAGED) | 219 '&start_date=2016-07-03&end_date=2016-07-05' % triage_status.UNTRIAGED) |
| 227 self.assertEqual(200, response_json.status_int) | 220 self.assertEqual(200, response_json.status_int) |
| 228 self.assertEqual(expected_result, response_json.json_body) | 221 self.assertEqual(expected_result, response_json.json_body) |
| 229 | 222 |
| 230 def testFilterWithSuspectsTriagedUnsure(self): | 223 def testFilterWithSuspectsTriagedUnsure(self): |
| 231 expected_result = { | 224 expected_result = { |
| 232 'fracas_crashes': [self.fracas_crashes[4]], | 225 'fracas_crashes': [self.fracas_crashes[4]], |
| 233 'end_date': time_util.FormatDatetime(self.default_end_date), | 226 'end_date': time_util.FormatDatetime(self.default_end_date), |
| 234 'regression_range_triage_status': '-1', | 227 'regression_range_triage_status': '-1', |
| 235 'suspected_cls_triage_status': str(triage_status.TRIAGED_UNSURE), | 228 'suspected_cls_triage_status': str(triage_status.TRIAGED_UNSURE), |
| 236 'found_suspects': '-1', | 229 'found_suspects': '-1', |
| 237 'has_regression_range': '-1', | 230 'has_regression_range': '-1', |
| 238 'start_date': time_util.FormatDatetime(self.default_start_date) | 231 'start_date': time_util.FormatDatetime(self.default_start_date) |
| 239 } | 232 } |
| 240 | 233 |
| 241 response_json = self.test_app.get( | 234 response_json = self.test_app.get( |
| 242 '/fracas-dashboard?suspected_cls_triage_status=%d&format=json' % | 235 '/fracas-dashboard?suspected_cls_triage_status=%d&format=json' |
| 236 '&start_date=2016-07-03&end_date=2016-07-05' % |
| 243 triage_status.TRIAGED_UNSURE) | 237 triage_status.TRIAGED_UNSURE) |
| 244 self.assertEqual(200, response_json.status_int) | 238 self.assertEqual(200, response_json.status_int) |
| 245 # TODO: Re-enable, see crbug.com/624998 | 239 self.assertEqual(expected_result, response_json.json_body) |
| 246 # self.assertEqual(expected_result, response_json.json_body) | |
| 247 | 240 |
| 248 def testFilterWithRegressionRangeTriagedUnsure(self): | 241 def testFilterWithRegressionRangeTriagedUnsure(self): |
| 249 expected_result = { | 242 expected_result = { |
| 250 'fracas_crashes': [self.fracas_crashes[4]], | 243 'fracas_crashes': [self.fracas_crashes[4]], |
| 251 'end_date': time_util.FormatDatetime(self.default_end_date), | 244 'end_date': time_util.FormatDatetime(self.default_end_date), |
| 252 'regression_range_triage_status': str(triage_status.TRIAGED_UNSURE), | 245 'regression_range_triage_status': str(triage_status.TRIAGED_UNSURE), |
| 253 'suspected_cls_triage_status': '-1', | 246 'suspected_cls_triage_status': '-1', |
| 254 'found_suspects': '-1', | 247 'found_suspects': '-1', |
| 255 'has_regression_range': '-1', | 248 'has_regression_range': '-1', |
| 256 'start_date': time_util.FormatDatetime(self.default_start_date) | 249 'start_date': time_util.FormatDatetime(self.default_start_date) |
| 257 } | 250 } |
| 258 | 251 |
| 259 response_json = self.test_app.get( | 252 response_json = self.test_app.get( |
| 260 '/fracas-dashboard?regression_range_triage_status=%d&format=json' % | 253 '/fracas-dashboard?regression_range_triage_status=%d&format=json' |
| 254 '&start_date=2016-07-03&end_date=2016-07-05' % |
| 261 triage_status.TRIAGED_UNSURE) | 255 triage_status.TRIAGED_UNSURE) |
| 262 self.assertEqual(200, response_json.status_int) | 256 self.assertEqual(200, response_json.status_int) |
| 263 # TODO: Re-enable, see crbug.com/624998 | 257 self.assertEqual(expected_result, response_json.json_body) |
| 264 # self.assertEqual(expected_result, response_json.json_body) | |
| 265 | 258 |
| 266 def testGetTopCountResults(self): | 259 def testGetTopCountResults(self): |
| 267 expected_result = { | 260 expected_result = { |
| 268 'fracas_crashes': [self.fracas_crashes[4], | 261 'fracas_crashes': [self.fracas_crashes[4], |
| 269 self.fracas_crashes[3]], | 262 self.fracas_crashes[3]], |
| 270 'end_date': time_util.FormatDatetime(self.default_end_date), | 263 'end_date': time_util.FormatDatetime(self.default_end_date), |
| 271 'regression_range_triage_status': '-1', | 264 'regression_range_triage_status': '-1', |
| 272 'suspected_cls_triage_status': '-1', | 265 'suspected_cls_triage_status': '-1', |
| 273 'found_suspects': '-1', | 266 'found_suspects': '-1', |
| 274 'has_regression_range': '-1', | 267 'has_regression_range': '-1', |
| 275 'start_date': time_util.FormatDatetime(self.default_start_date) | 268 'start_date': time_util.FormatDatetime(self.default_start_date) |
| 276 } | 269 } |
| 277 | 270 |
| 278 response_json = self.test_app.get('/fracas-dashboard?count=2&format=json') | 271 response_json = self.test_app.get('/fracas-dashboard?count=2&format=json' |
| 272 '&start_date=2016-07-03' |
| 273 '&end_date=2016-07-05') |
| 279 self.assertEqual(200, response_json.status_int) | 274 self.assertEqual(200, response_json.status_int) |
| 280 # TODO: Re-enable, see crbug.com/624998 | 275 self.assertEqual(expected_result, response_json.json_body) |
| 281 # self.assertEqual(expected_result, response_json.json_body) | |
| OLD | NEW |