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

Side by Side Diff: appengine/findit/handlers/flake/test/list_flakes_test.py

Issue 2435013005: [Findit] Updating flakiness dashboard to be able to triage results (Closed)
Patch Set: Fixing nit Created 4 years, 1 month 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
« no previous file with comments | « appengine/findit/handlers/flake/list_flakes.py ('k') | appengine/findit/index.yaml » ('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 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)
OLDNEW
« no previous file with comments | « appengine/findit/handlers/flake/list_flakes.py ('k') | appengine/findit/index.yaml » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698