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