| 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 | 4 |
| 5 import datetime | 5 import datetime |
| 6 | 6 import mock |
| 7 import webapp2 | 7 import webapp2 |
| 8 | 8 |
| 9 from common import time_util |
| 9 from handlers.flake import list_flakes | 10 from handlers.flake import list_flakes |
| 10 from handlers.flake.list_flakes import FilterMasterFlakeAnalysis | 11 from handlers.flake.list_flakes import FilterMasterFlakeAnalysis |
| 11 from model import analysis_status | 12 from model import analysis_status |
| 13 from model import result_status |
| 12 from model.flake.master_flake_analysis import MasterFlakeAnalysis | 14 from model.flake.master_flake_analysis import MasterFlakeAnalysis |
| 13 from waterfall.test import wf_testcase | 15 from waterfall.test import wf_testcase |
| 14 | 16 |
| 15 | 17 |
| 16 class FilterFlakeTest(wf_testcase.WaterfallTestCase): | 18 class FilterFlakeTest(wf_testcase.WaterfallTestCase): |
| 17 app_module = webapp2.WSGIApplication([ | 19 app_module = webapp2.WSGIApplication([ |
| 18 ('/waterfall/list-flakes', list_flakes.ListFlakes), | 20 ('/waterfall/list-flakes', list_flakes.ListFlakes), |
| 19 ], debug=True) | 21 ], debug=True) |
| 20 | 22 |
| 21 def _CreateAndSaveMasterFlakeAnalysis( | 23 def _CreateAndSaveMasterFlakeAnalysis( |
| 22 self, master_name, builder_name, build_number, | 24 self, master_name, builder_name, build_number, |
| 23 step_name, test_name): | 25 step_name, test_name, request_time, status_code=None): |
| 24 analysis = MasterFlakeAnalysis.Create( | 26 analysis = MasterFlakeAnalysis.Create( |
| 25 master_name, builder_name, build_number, step_name, test_name) | 27 master_name, builder_name, build_number, step_name, test_name) |
| 26 analysis.request_time = datetime.datetime(2016, 10, 01) | 28 analysis.request_time = request_time |
| 27 analysis.status = analysis_status.COMPLETED | 29 analysis.status = analysis_status.COMPLETED |
| 30 analysis.result_status = status_code |
| 28 analysis.put() | 31 analysis.put() |
| 29 return analysis | 32 return analysis |
| 30 | 33 |
| 31 def setUp(self): | 34 def setUp(self): |
| 32 super(FilterFlakeTest, self).setUp() | 35 super(FilterFlakeTest, self).setUp() |
| 33 self.master_name1 = 'm1' | 36 self.master_name1 = 'm1' |
| 34 self.master_name2 = 'm2' | 37 self.master_name2 = 'm2' |
| 35 self.builder_name1 = 'b1' | 38 self.builder_name1 = 'b1' |
| 36 self.builder_name2 = 'b2' | 39 self.builder_name2 = 'b2' |
| 37 self.build_number1 = 1 | 40 self.build_number1 = 1 |
| 38 self.build_number2 = 2 | 41 self.build_number2 = 2 |
| 39 self.step_name1 = 's1' | 42 self.step_name1 = 's1' |
| 40 self.step_name2 = 's2' | 43 self.step_name2 = 's2' |
| 41 self.test_name1 = 't1' | 44 self.test_name1 = 't1' |
| 42 self.test_name2 = 't2' | 45 self.test_name2 = 't2' |
| 46 self.request_time1 = datetime.datetime(2016, 10, 01) |
| 47 self.request_time2 = datetime.datetime(2016, 10, 02) |
| 48 self.result_status1 = result_status.FOUND_UNTRIAGED |
| 49 self.result_status2 = result_status.FOUND_CORRECT |
| 43 self.master_flake_analysis1 = self._CreateAndSaveMasterFlakeAnalysis( | 50 self.master_flake_analysis1 = self._CreateAndSaveMasterFlakeAnalysis( |
| 44 self.master_name1, self.builder_name1, self.build_number1, | 51 self.master_name1, self.builder_name1, self.build_number1, |
| 45 self.step_name1, self.test_name1) | 52 self.step_name1, self.test_name1, self.request_time1, |
| 53 self.result_status1) |
| 46 self.master_flake_analysis2 = self._CreateAndSaveMasterFlakeAnalysis( | 54 self.master_flake_analysis2 = self._CreateAndSaveMasterFlakeAnalysis( |
| 47 self.master_name2, self.builder_name2, self.build_number2, | 55 self.master_name2, self.builder_name2, self.build_number2, |
| 48 self.step_name2, self.test_name2) | 56 self.step_name2, self.test_name2, self.request_time2, |
| 57 self.result_status2) |
| 49 self.master_flake_analysis3 = self._CreateAndSaveMasterFlakeAnalysis( | 58 self.master_flake_analysis3 = self._CreateAndSaveMasterFlakeAnalysis( |
| 50 self.master_name2, self.builder_name2, self.build_number2, | 59 self.master_name2, self.builder_name2, self.build_number2, |
| 51 self.step_name2, self.test_name1) | 60 self.step_name2, self.test_name1, self.request_time1) |
| 61 |
| 62 def testGetStartAndEndDatesNotInTriageMode(self): |
| 63 self.assertEqual( |
| 64 (None, None), list_flakes.ListFlakes()._GetStartAndEndDates(False)) |
| 65 |
| 66 @mock.patch.object(time_util, 'GetUTCNow') |
| 67 def testGetStartAndEndDatesForTriageNoDatesSpecified(self, mock_fn): |
| 68 flake_list = list_flakes.ListFlakes() |
| 69 flake_list.request = {} |
| 70 mock_now = datetime.datetime(2016, 10, 21, 1, 0, 0, 0) |
| 71 mock_midnight_yesterday = datetime.datetime(2016, 10, 20, 0, 0, 0, 0) |
| 72 mock_midnight_tomorrow = datetime.datetime(2016, 10, 22, 0, 0, 0, 0) |
| 73 mock_fn.return_value = mock_now |
| 74 start_date, end_date = flake_list._GetStartAndEndDates(True) |
| 75 self.assertEqual(start_date, mock_midnight_yesterday) |
| 76 self.assertEqual(end_date, mock_midnight_tomorrow) |
| 77 |
| 78 @mock.patch.object(time_util, 'GetUTCNow') |
| 79 def testGetStartAndEndDatesForTriageStartDateOnly(self, mock_fn): |
| 80 flake_list = list_flakes.ListFlakes() |
| 81 flake_list.request = {'start_date': '2016-10-19'} |
| 82 mock_now = datetime.datetime(2016, 10, 21, 1, 0, 0, 0) |
| 83 mock_midnight_start = datetime.datetime(2016, 10, 19, 0, 0, 0, 0) |
| 84 mock_midnight_tomorrow = datetime.datetime(2016, 10, 22, 0, 0, 0, 0) |
| 85 mock_fn.return_value = mock_now |
| 86 start_date, end_date = flake_list._GetStartAndEndDates(True) |
| 87 self.assertEqual(start_date, mock_midnight_start) |
| 88 self.assertEqual(end_date, mock_midnight_tomorrow) |
| 89 |
| 90 def testGetStartAndEndDatesForTriageWithDates(self): |
| 91 flake_list = list_flakes.ListFlakes() |
| 92 flake_list.request = { |
| 93 'start_date': '2016-10-11', |
| 94 'end_date': '2016-10-13' |
| 95 } |
| 96 mock_midnight_start = datetime.datetime(2016, 10, 11, 0, 0, 0, 0) |
| 97 mock_midnight_end = datetime.datetime(2016, 10, 13, 0, 0, 0, 0) |
| 98 start_date, end_date = flake_list._GetStartAndEndDates(True) |
| 99 self.assertEqual(start_date, mock_midnight_start) |
| 100 self.assertEqual(end_date, mock_midnight_end) |
| 52 | 101 |
| 53 def testFilterMasterName(self): | 102 def testFilterMasterName(self): |
| 54 master_flake_analysis_query = MasterFlakeAnalysis.query() | 103 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 55 result = FilterMasterFlakeAnalysis( | 104 result = FilterMasterFlakeAnalysis( |
| 56 master_flake_analysis_query, self.master_name1, None, None, None, None) | 105 master_flake_analysis_query, master_name=self.master_name1) |
| 106 |
| 57 self.assertEqual(len(result), 1) | 107 self.assertEqual(len(result), 1) |
| 58 self.assertTrue(result == [self.master_flake_analysis1]) | 108 self.assertTrue(result == [self.master_flake_analysis1]) |
| 59 | 109 |
| 60 def testFilterBuilderName(self): | 110 def testFilterBuilderName(self): |
| 61 master_flake_analysis_query = MasterFlakeAnalysis.query() | 111 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 62 result = FilterMasterFlakeAnalysis(master_flake_analysis_query, None, | 112 result = FilterMasterFlakeAnalysis( |
| 63 self.builder_name1, None, None, None) | 113 master_flake_analysis_query, builder_name=self.builder_name1) |
| 64 self.assertEqual(len(result), 1) | 114 self.assertEqual(len(result), 1) |
| 65 self.assertTrue(result == [self.master_flake_analysis1]) | 115 self.assertTrue(result == [self.master_flake_analysis1]) |
| 66 | 116 |
| 67 def testFilterBuildNumber(self): | 117 def testFilterBuildNumber(self): |
| 68 master_flake_analysis_query = MasterFlakeAnalysis.query() | 118 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 69 result = FilterMasterFlakeAnalysis(master_flake_analysis_query, None, None, | 119 result = FilterMasterFlakeAnalysis( |
| 70 self.build_number1, None, None) | 120 master_flake_analysis_query, build_number=self.build_number1) |
| 71 self.assertEqual(len(result), 1) | 121 self.assertEqual(len(result), 1) |
| 72 self.assertTrue(result == [self.master_flake_analysis1]) | 122 self.assertTrue(result == [self.master_flake_analysis1]) |
| 73 | 123 |
| 74 def testFilterStepName(self): | 124 def testFilterStepName(self): |
| 75 master_flake_analysis_query = MasterFlakeAnalysis.query() | 125 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 76 result = FilterMasterFlakeAnalysis( | 126 result = FilterMasterFlakeAnalysis( |
| 77 master_flake_analysis_query, None, None, None, self.step_name1, None) | 127 master_flake_analysis_query, step_name=self.step_name1) |
| 78 self.assertEqual(len(result), 1) | 128 self.assertEqual(len(result), 1) |
| 79 self.assertTrue(result == [self.master_flake_analysis1]) | 129 self.assertTrue(result == [self.master_flake_analysis1]) |
| 80 | 130 |
| 81 def testFilterTestName(self): | 131 def testFilterTestName(self): |
| 82 master_flake_analysis_query = MasterFlakeAnalysis.query() | 132 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 83 result = FilterMasterFlakeAnalysis( | 133 result = FilterMasterFlakeAnalysis( |
| 84 master_flake_analysis_query, None, None, None, None, self.test_name2) | 134 master_flake_analysis_query, test_name=self.test_name2) |
| 85 self.assertEqual(len(result), 1) | 135 self.assertEqual(len(result), 1) |
| 86 self.assertTrue(result == [self.master_flake_analysis2]) | 136 self.assertTrue(result == [self.master_flake_analysis2]) |
| 87 | 137 |
| 138 def testFilterResultStatus(self): |
| 139 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 140 result = FilterMasterFlakeAnalysis( |
| 141 master_flake_analysis_query, status_code=result_status.FOUND_UNTRIAGED) |
| 142 self.assertEqual(len(result), 1) |
| 143 self.assertTrue(result == [self.master_flake_analysis1]) |
| 144 |
| 145 def testFilterStartDate(self): |
| 146 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 147 result = FilterMasterFlakeAnalysis( |
| 148 master_flake_analysis_query, start_date=self.request_time2) |
| 149 self.assertEqual(len(result), 1) |
| 150 self.assertTrue(result == [self.master_flake_analysis2]) |
| 151 |
| 152 def testFilterEndDate(self): |
| 153 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 154 result = FilterMasterFlakeAnalysis( |
| 155 master_flake_analysis_query, end_date=self.request_time2) |
| 156 self.assertEqual(len(result), 2) |
| 157 self.assertTrue(result == [self.master_flake_analysis1, |
| 158 self.master_flake_analysis3]) |
| 159 |
| 88 def testFilterMultipleMasterName(self): | 160 def testFilterMultipleMasterName(self): |
| 89 master_flake_analysis_query = MasterFlakeAnalysis.query() | 161 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 90 result = FilterMasterFlakeAnalysis( | 162 result = FilterMasterFlakeAnalysis( |
| 91 master_flake_analysis_query, self.master_name2, None, None, None, None) | 163 master_flake_analysis_query, master_name=self.master_name2) |
| 92 self.assertEqual(len(result), 2) | 164 self.assertEqual(len(result), 2) |
| 93 self.assertTrue(result == [self.master_flake_analysis3, | 165 self.assertTrue(result == [self.master_flake_analysis3, |
| 94 self.master_flake_analysis2]) | 166 self.master_flake_analysis2]) |
| 95 | 167 |
| 96 def testFilterMultipleBuilderName(self): | 168 def testFilterMultipleBuilderName(self): |
| 97 master_flake_analysis_query = MasterFlakeAnalysis.query() | 169 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 98 result = FilterMasterFlakeAnalysis( | 170 result = FilterMasterFlakeAnalysis( |
| 99 master_flake_analysis_query, None, self.builder_name2, None, None, None) | 171 master_flake_analysis_query, builder_name=self.builder_name2) |
| 100 self.assertEqual(len(result), 2) | 172 self.assertEqual(len(result), 2) |
| 101 self.assertTrue(result == [self.master_flake_analysis3, | 173 self.assertTrue(result == [self.master_flake_analysis3, |
| 102 self.master_flake_analysis2]) | 174 self.master_flake_analysis2]) |
| 103 | 175 |
| 104 def testFilterMultipleBuildNumber(self): | 176 def testFilterMultipleBuildNumber(self): |
| 105 master_flake_analysis_query = MasterFlakeAnalysis.query() | 177 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 106 result = FilterMasterFlakeAnalysis( | 178 result = FilterMasterFlakeAnalysis( |
| 107 master_flake_analysis_query, None, None, self.build_number2, None, None) | 179 master_flake_analysis_query, build_number=self.build_number2) |
| 108 self.assertEqual(len(result), 2) | 180 self.assertEqual(len(result), 2) |
| 109 self.assertTrue(result == [self.master_flake_analysis3, | 181 self.assertTrue(result == [self.master_flake_analysis3, |
| 110 self.master_flake_analysis2]) | 182 self.master_flake_analysis2]) |
| 111 | 183 |
| 112 def testFilterMultipleStepName(self): | 184 def testFilterMultipleStepName(self): |
| 113 master_flake_analysis_query = MasterFlakeAnalysis.query() | 185 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 114 result = FilterMasterFlakeAnalysis( | 186 result = FilterMasterFlakeAnalysis( |
| 115 master_flake_analysis_query, None, None, None, self.step_name2, None) | 187 master_flake_analysis_query, step_name=self.step_name2) |
| 116 self.assertEqual(len(result), 2) | 188 self.assertEqual(len(result), 2) |
| 117 self.assertTrue(result == [self.master_flake_analysis3, | 189 self.assertTrue(result == [self.master_flake_analysis3, |
| 118 self.master_flake_analysis2]) | 190 self.master_flake_analysis2]) |
| 119 | 191 |
| 120 def testFilterMultipleTestName(self): | 192 def testFilterMultipleTestName(self): |
| 121 master_flake_analysis_query = MasterFlakeAnalysis.query() | 193 master_flake_analysis_query = MasterFlakeAnalysis.query() |
| 122 result = FilterMasterFlakeAnalysis( | 194 result = FilterMasterFlakeAnalysis( |
| 123 master_flake_analysis_query, None, None, None, None, self.test_name1) | 195 master_flake_analysis_query, test_name=self.test_name1) |
| 124 self.assertEqual(len(result), 2) | 196 self.assertEqual(len(result), 2) |
| 125 self.assertTrue(result == [self.master_flake_analysis1, | 197 self.assertTrue(result == [self.master_flake_analysis1, |
| 126 self.master_flake_analysis3]) | 198 self.master_flake_analysis3]) |
| 127 | 199 |
| 128 def testNormalFlow(self): | 200 def testNormalFlow(self): |
| 129 response = self.test_app.get('/waterfall/list-flakes') | 201 response = self.test_app.get('/waterfall/list-flakes') |
| 130 self.assertEquals(200, response.status_int) | 202 self.assertEquals(200, response.status_int) |
| 131 | 203 |
| 132 def testNormalFlowWithFilter(self): | 204 def testNormalFlowWithFilter(self): |
| 133 response = self.test_app.get( | 205 response = self.test_app.get( |
| 134 '/waterfall/list-flakes', | 206 '/waterfall/list-flakes', |
| 135 params={'build_number': self.build_number1, | 207 params={'build_number': self.build_number1, |
| 136 'format': 'json'} | 208 'format': 'json'} |
| 137 ) | 209 ) |
| 138 expected_result = { | 210 expected_result = { |
| 139 'master_flake_analyses': [ | 211 'master_flake_analyses': [ |
| 140 { | 212 { |
| 141 'master_name': self.master_name1, | 213 'master_name': self.master_name1, |
| 142 'builder_name': self.builder_name1, | 214 'builder_name': self.builder_name1, |
| 143 'build_number': self.build_number1, | 215 'build_number': self.build_number1, |
| 144 'step_name': self.step_name1, | 216 'step_name': self.step_name1, |
| 145 'test_name': self.test_name1, | 217 'test_name': self.test_name1, |
| 146 'status': 'Completed', | 218 'status': 'Completed', |
| 219 'result_status': result_status.RESULT_STATUS_TO_DESCRIPTION[ |
| 220 self.result_status1], |
| 147 'suspected_build': None, | 221 'suspected_build': None, |
| 148 'request_time': '2016-10-01 00:00:00 UTC', | 222 'request_time': '2016-10-01 00:00:00 UTC' |
| 149 } | 223 } |
| 150 ] | 224 ], |
| 225 'master_name_filter': '', |
| 226 'builder_name_filter': '', |
| 227 'build_number_filter': self.build_number1, |
| 228 'step_name_filter': '', |
| 229 'test_name_filter': '', |
| 230 'result_status_filter': result_status.UNSPECIFIED, |
| 151 } | 231 } |
| 232 |
| 152 self.assertEquals(response.json_body, expected_result) | 233 self.assertEquals(response.json_body, expected_result) |
| 153 self.assertEquals(200, response.status_int) | 234 self.assertEquals(200, response.status_int) |
| OLD | NEW |